在 Nginx 中优化长连接(HTTP Keep-Alive)可以提高服务器的性能,特别是在处理大量并发连接时。Nginx作为代理服务器时,有两点必须满足:
- client 到nginx的连接是长连接
- nginx到server的连接是长连接
以下是一些优化配置:
1.Nginx作为服务端角色,针对客户端长连接需要设置的参数:
1http {
2 keepalive_timeout 65; #设置客户端与nignx保持的活动的最大时间,如果这个时间没有新请求,则关闭连接
3 keepalive_requests 10000; # 定义一个持久连接上可以接受的最大请求数量。当达到这个数值后,连接将关闭。
4 keepalive_disable none; # 限定某些浏览器禁止长连接功能,none表示不禁用任何浏览器保持活动连接;
5}
注:与Nginx服务端角色对应的客户端,必须要满足保持http长连接的设置,需要在客户端请求Nginx的报文头做到以下两点:
1.1 http版本号
客户端请求需要使用HTTP/1.1或更高版本
1.2 Connection: keep-alive
在请求头中,客户端需要显式指定使用长连接,通过在请求头中加入 Connection: keep-alive 头字段。客户端与Nginx的连接可以保持活跃状态,而不会在请求完成后立即关闭。
2.Nginx作为客户端角色,针对后端服务长连接需要设置的参数:
2.1 在upstream中增加keepalive设置
1upstream pa_8080 {
2 server 10.10.147.52:8091;
3 server 10.10.147.52:8092;
4 keepalive 1000; # 设置Nginx作为客户端时与后端服务器保持的空闲连接数量
5 keepalive_requests 10000; # 定义一个持久连接上可以接受的最大请求数量。
6}
2.2 设置nginx请求协议为http1.1,并开启长连接
1server {
2 listen 8090; server_name mes_proxy_server; underscores_in_headers on;
3 location / {proxy_http_version 1.1; # 启用长连接的前提
4 proxy_set_header Connection 'keep-alive'; # 开启与后端服务的长连接
5 proxy_pass http://pa_8080/;
6}
注: 后端业务应用应根据各自的系统特点和负载特性,灵活开启HTTP长连接,以优化资源利用和提升性能
3.Nginx所在服务器操作系统参数设置
3.1 针对Linux的参数设置
新项目强制:Nginx 在 Linux 上的安全性设置相对成熟,而在 Windows 上,由于系统架构和权限模型不同,可能需要额外的配置来保证同样的安全性,新项目直接部署在linux上。
1echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.conf
2
3echo "net.ipv4.tcp_fin_timeout=30" >> /etc/sysctl.conf
4
5echo "net.ipv4.tcp_max_tw_buckets=10000" >> /etc/sysctl.conf
6
7systctl –p # 执行生效
3.1.1 net.ipv4.tcp_tw_reuse=1
这个参数启用TCP连接的<span lang="EN-US">TIME_WAIT</span>重用机制。当设置为<span lang="EN-US">1</span>时,表示允许重用处于<span lang="EN-US">TIME_WAIT</span>状态的套接字(TCP连接)。当有新的TCP连接请求时,系统可以复用旧的<span lang="EN-US">TIME_WAIT</span>连接,从而节省端口资源。如果服务器端存在大量连接,开启此参数能够有效提高资源利用率。
3.1.2 net.ipv4.tcp_fin_timeout=30
该参数定义TCP连接关闭后进入<span lang="EN-US">TIME_WAIT</span>状态的持续时间, 当服务器需要处理大量连接,并且端口资源紧张时,缩短<span lang="EN-US">TIME_WAIT</span>时间能够提高系统处理短连接的效率,避免端口耗尽的情况。
3.1.3 net.ipv4.tcp_max_tw_buckets=10000
该参数定义系统允许同时存在的<span lang="EN-US">TIME_WAIT</span>状态的TCP套接字数量上限, 适用于有大量并发连接的环境,防止由于<span lang="EN-US">TIME_WAIT</span>连接数过多而导致系统资源耗尽或端口耗尽。
3.2 针对Windows的参数设置
缩短time wait的时间,TcpTimedWaitDelay是一个TCP/IP参数,同linux 的tcp_fin_timeout,它定义了在连接关闭之后等待系统将其端口释放以供重用的时间间隔。
regedit打开注册表,打开
1HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
新建 DWORD (32-bit) 值,命名为 TcpTimedWaitDelay,设置数值为30
重新启动计算机使更改生效
4.Nginx高可用配置
Nginx所需硬件配置建议:
初始化
- 集群(第一接入层角色):2个“Nginx+keepalived”节点(8C/16G虚拟机/节点,20000并发数, 主从机制,只能一个节点体现并发数);
- 单节点:1个Nginx节点(8C/16G虚拟机(20000并发数) /节点)
扩容
如果集群出现性能瓶颈,则Nginx需要作为第二接入层角色(此时无须keepalived配套),由F5/Netscaler/LVS作为第一接入层角色对Nginx进行负载。
5.完整配置示例
1user root;
2worker_processes auto;
3
4worker_rlimit_nofile 65535;
5
6events {
7 use epoll;
8 accept_mutex on;
9 worker_connections 65535;
10}
11http {
12 include mime.types;
13 keepalive_timeout 65;
14 keepalive_requests 10000;
15 keepalive_disable none;
16
17
18 tcp_nodelay on;
19 proxy_intercept_errors on;
20
21 fastcgi_intercept_errors on;
22 fastcgi_connect_timeout 1300;
23 fastcgi_send_timeout 1300;
24 fastcgi_read_timeout 1300;
25 fastcgi_buffer_size 512k;
26 fastcgi_buffers 4 512k;
27 fastcgi_busy_buffers_size 512k;
28 fastcgi_temp_file_write_size 512k;
29
30 proxy_connect_timeout 20s;
31 proxy_send_timeout 30s;
32 proxy_read_timeout 30s;
33 gzip off;
34
35
36 log_format main '[$time_local] $remote_addr "$http_x_forwarded_for" $remote_port $remote_user '
37 '$host $upstream_addr $upstream_status $upstream_response_time $upstream_cache_status '
38 '"$request" $status $request_time $body_bytes_sent "$http_referer" "$http_user_agent" ';
39
40
41
42 upstream pa_8080{
43
44 server 10.10.36.101:8082 weight=2 max_fails=3 fail_timeout=30s ;
45 server 10.10.36.101:8083 weight=2 max_fails=3 fail_timeout=30s ;
46 keepalive 1000;
47 keepalive_requests 10000;
48}
49
50
51server {
52
53 listen 8080;
54 server_name _;
55 index index.html index.php index.htm;
56
57
58location / {
59 proxy_http_version 1.1;
60 proxy_set_header Connection 'keep-alive';
61 proxy_pass http://pa_8080/ ;
62proxy_set_header Host $http_host;
63 proxy_set_header X-Real-IP $remote_addr;
64 proxy_set_header REMOTE-HOST $remote_addr;
65 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
66 client_body_buffer_size 10M;
67 client_max_body_size 10G;
68 proxy_buffer_size 256k;
69 proxy_buffers 1024 4k;
70 proxy_temp_file_write_size 256k;
71 proxy_next_upstream error timeout invalid_header http_500 http_503 http_404 http_502 http_504;
72 proxy_max_temp_file_size 128m;
73 }
74 }
75}