一、扩容方式
1、单机垂直扩容(添加硬件资源)
2、水平拓展:集群化
3、细粒度拆分:分布式
- 数据分区
- 上游服务SOA化(将判庞大的系统拆分为模块化服务——微服务,原生支持水平/垂直扩容)
- 入口细分:浏览器;移动APP;H5内嵌式应用
4、数据异构化 - 多级缓存:客户端缓存、CDN缓存、异地多活、Nginx缓存
5、服务异步化 - 拆分请求
- 消息中间件
扩容原则:
1、无状态原则
2、弹性原则
二、单机垂直扩容
三、水平拓展(集群化)
集群化部署时在每一台资源服务器中运行的代码一致,这里需要确保会话的一致性。
3.1 如何保持会话
3.1.1 根据用户IP地址哈希到同一台后端服务器。
缺点:
- 容易导致流量倾斜
- 后端服务器宕机了会导致部分IP无法使用。
upstream httpget {
ip_hash;
server 192.168.0.1;
server 192.1683.0.2;
}
http {
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://httpget;
}
}
}
3.1.2 其他 hash
1、hash $cookie_jsessionid;
使用场景:登录系统,系统下发一个文件,客户端携带这个文件 cookie。
upstream httpget {
ip_hash $cookie_jsessionid;
server 192.168.0.1;
server 192.1683.0.2;ff
}
这里 nginx 会将 cookie 中名称为 JSESSIONID 的值进行hash计算,从而定位到对应的机器上。
2、hash $request_uri;
使用场景:
不支持cookie,直接在 URI 后面更 sessionID;
需要资源倾斜的特定场景。
3.1.3 使用 sticky 模块完成对静态服务器的会话保持
1、首先下载 sticky 模块安装包
2、重新编译安装 nginx,并添加 sticky 包
./configure --prefix=/usr/local/nginx --add-module=/root/sticky
3、替换原来的 nginx 执行文件
4、配置 nginx
upstream httpget {
sticky name=route expire=6h;
server 192.168.0.1;
server 192.1683.0.2;
}
5、重启 nginx
systemctl restart nginx
# 记得这里是重启,不是 reload
这里的 cookie 名为 name 的用于保持会话,让相同客户端保持相同会话,该cookie有过期时间。
3.2 keepalive 连接配置
对于支持 keepalive 的客户端,合理配置可以有效的提高整体吞吐量。
3.2.1 对于客户端
1、keepalive_disable
拒绝某些浏览器型号禁用 keepalive。
2、keepalive_requests
默认值1000,对于一个可复用的TCP连接可以并发接收的最大请求个数。
3、send_timeout
等待数据返回的最大时间;默认60s,超过这个时间连接就会被强制关闭(需要注意下载等耗时操作)。
4、keepalive_time
通过配置 keepalive_time 60
来配置连接复用最大时间,当设置为 0 时表示不启用连接复用;即:一个TCP连接最大有效时长,超过将被强制失效,需要重新建立新的TCP连接。
5、keepalive_timeout
超过该时间没有活动,keepalive 将会失效。
3.2.2 对于上游服务器
1、upstream 中的配置
keepalive 100
;
向上游服务器保留的连接数
keepalive_timeout
连接保留时间
keepalive_requests
一个TCP复用中可以并发接收的请求个数。
2、server中的配置
proxy_http_server 1.1;# 1.1 比 1.0 相对来说更高效
# nginx 作为反向代理服务器时,会自动将客户端的Header信息清除
# 若想与上游服务器保持长连接,就得把 Connection 设置为空或者设置为 keepalive
proxy_set_header Connection "";
3.3 Upstream 初始化和上游服务器连接过程
1、nginx 接收来自客户端的请求,然后转发给上游服务器
2、通过在 Upstream 选择上游服务器,并加入 epoll
事件队列、TCP连接(三次握手)这些都是异步执行;最后系统会向 nginx 发出信号,从而触发事件对应注册的回调函数。
3、再回调函数中,我们可以拿到与上游服务器建立的可写连接,这个时候 nginx 就可以自行封装HTTP请求的二进制格式发送给我们的上游服务器进行处理。
4、当上游服务器处理完成后,还是通过 epoll
事件触发信号给 nginx 来处理响应结果。
3.3.1 对于上游服务器的限制配置
proxy_request_buffering
该配置表示从请求体读到的内容是否全部缓冲完后再向上游服务器发送;on
表示需要等待全部缓存完成再发送,off
表示边缓冲边发送给上游服务器。
proxy_buffering
该配置是否缓冲读到的数据:
off
不开启缓存,客户端一直读取,知道读取完成才是否连接,文件过大时存在一直占用;通常情况上游速度慢,下游速度快。
on
表示开启缓存,
proxy_buffer_size
用于缓冲上游服务器返回的header信息。
proxy_buffering
若设置为 off
,读到的上游服务器 body 内容过大时可能会暂用 proxy_buffer_size
缓冲区。
proxy_buffers <num> <size>;
该配置表示读取到内存缓冲区的大小
proxy_buffer 32 64k;
# 这里表示32个 64k大小的内存缓冲块。
proxy_max_temp_file_size 1024m
该配置表示临时读取到磁盘缓冲区的最大值,默认 1024m,通常是因为内存缓冲区不够时需要缓冲到磁盘中去。
proxy_temp_path
向磁盘写入缓冲文件的位置。
proxy_temp_path /spool/nginx/proxy_temp 1 2;
# 后面的 `1 2` 表示目录的层级。例如:`/spool/nginx/proxy_temp/7/45/00001234556`
proxy_temp_file_write_size
向磁盘缓冲区每次写入的大小,避免过大影响系统性能。
3.3.2 对于客户端的限制配置
可配置位置:http、server、location,层级之间是继承、覆盖关系。
client_body_buffer_size
定义客户端请求时对应的 body 数据缓冲区大小,32位系统是8k,64位系统是16k。
client_body_temp_path
内存缓冲区不够时,向磁盘中写入缓冲时对应临时文件的保存位置。
client_max_body_size
配置客户端请求体的最大大小,默认1m,通过 content-length
检查。
client_body_timeout
客户端发送请求体最大超时时长,超时后返回 408 状态码(请求超时)。
client_body_in_file_only on
把 body 写入磁盘文件,不会删除;避免开启,影响服务器性能。
client_body_in_single_buffer
body 是否仅缓冲到一个地方,方便使用:$request_body
读取数据性能上有所提高。
client_header_buffer_size
设置客户端读取请求头内存缓冲区大小,若过大部分会被写入临时文件,默认32位系统是8k,64位系统是16k。
提示
若某些接口上传内容比较大,我们可以单独配置 location。
large_client_header_buffer_size
针对于请求头很大的,默认8k。
client_header_timeout
客户端发送请求头最大超时时长,超时后返回 408 状态码(请求超时)。