Nginx高性能Web服务器详解笔记
来自Alex's wiki
第四章 Nginx服务器的高级配置
4.1针对IPv4内核的7个参数优化配置
相应的配置文件在 /etc/sysctl.conf
使用 #/sbin/sysctl -p 命令使修改生效:
#添加: net.core.netdev_max_backlog = 262144 net.core.somaxconn = 262144 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_timestamps = 0 net.ipv4. tcp_synack_retries = 1 net.ipv4. tcp_syn_retries = 1 #修改 net.ipv4.tcp_max_syn_backlog = 262144
4.2针对CPU的Nginx配置优化的2个指令
- worker_processes 设置成内核的倍数。针对2核CPU,建议为2或4
- worker_processes 4;
- worker_cpu_affinity 若是4核CPU,则:
- worker_cpu_affinity 0001 0010 0100 1000;
4.3与网络连接相关的4个指令
- keepallive_timeout
- 如:keepalive_time 60 50;
- send_timeout
- 如:send_timeout 10s; 如果这个时间之后客户端没有任何活动,Nginx服务器会关闭
- client_header_buffer_size
- 如果发现 400 错误,有很大一部分原因是客户端的请求头部过大造成的
- client_header_buffer_size 32k;
- multi_accept
- 配置Nginx尽可能多的接收客户端的连接请求: multi_accept on;
4.4与事件驱动相关的8个指令
- (1)use指令
- use epoll;
- (2)worker_connections指令
- 每个Worker允许最大同时连接数。 worker_connections 51200;
- 由此可知,服务器最大连接数为: Client = worker_processes * worker_connections / 2
- 同时可以设置进程可以打开最大文件句柄数量: #echo "2390251" > /proc/sys/fs/file-max; sysctl -p
- (3)worker_rlimit_sigpending指令
- worker_rlimit_sigpending 1024;
- 用于设置Linux 2.6.6版本之后Linux平台的事件信号队列长度上限。它主要影响事件驱动模型中rtsig模型可以保存的最大信号数。
- (4)devpoll_changes和devpoll_events指令
- 用于设置在/dev/poll事件驱动模型下Nginx服务器可以与内核之间传递事件的数量。前者设置传递给内核的事件数量,后者设置从内核获取的事件数量。默认值为32
- (5)kqueue_changes和kquue_events指令
- 用于设置在kqueue事件驱动模型下Nginx服务器可以与内核之间传递事件的数量。前者设置传递给内核的事件数量,
- 后者设置从内核获取的事件数量。默认值为512.
- (6)epoll_events指令
- 用于设置在epoll事件驱动模型下Nginx服务器可以与内核之间传递事件的数量。默认值为512.
- 注意:与其他事件驱动模型不同,epoll模型下Nginx服务器向内核传递事件的数量和从内核获取的事件数量是相等的。所以,
- 不存在epoll_changes指令。
- (7)rtsig_signo指令
- 用于设置rtsig模式使用的2个信号中的第一个,第二个信号是在第一个信号的编号上加1.默认的第一个信号设置为:
- SIGRTMIN+10
- (8)rtsig_overflow_*指令
- 该指令有3个具体的指令,rtsig_over_events、rtsig_over_test、rtsig_over_threshold指令。这些指令用来控制当rtsig模式中信号队列溢出时Nginx服务器的处理方式。
- rtsig_over_events:指定队列溢出时使用poll库处理的事件数,默认值为16.
- tsig_over_test:指定poll库处理完第几件事后将清空rtsig模型使用的信号队列,默认值为32.
- tsig_over_threshold:指定rtsig模式使用的信号队列中的事件超过多少时就需要清空队列了。该指令只对Linux 2.4.x以下版本有效。
第五章 Nginx服务器的Gzip压缩
5.1由ngx_http_gzip_module模块处理的9个指令
- (1)gzip 指令
- gzip on | off; 默认为off,只有该指令设置为on时,下列各指令设置才有效。
- (2)gzip_buffers 指令
- gzip_buffers 32 4k | 16 8k; 默认情况下 number * size的值为128,其中size为系统一页的大小。为4KB或8KB
- (3)gzip_comp_level 指令
- 设置压缩程度,从1到9。1表示压缩程度最低(这也是默认设置),压缩效率最高
- (4)gzip_disable 指令
- 语法为 gzip_disable regex ...; 如: gzip_disable MSIE [1-6]\.;
- (5)gzip_http_version 指令
- 默认为1.1
- (6)gzip_min_len 指令
- 超过该值时启用压缩。默认为20,太小了,建议设置为: gzip_min_len 1024;
- (7)gzip_proxied 指令
- gzip_proxied expired no-cache no-store private auth;
- (8)gzip_types 指令
- gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
- (9)gzip_vary 指令
- 该指令用于在使用Gzip时是否发送带有“Vary: Accept-Encoding”头域的响应头部。这个头域通知客户端浏览器使用了Gzip压缩(P82)。标头“Vary:Accept-Encoding”指定方法及其重要性分析
- 示例 gzip_vary on;
- 注意:该指令在使用时会存在BUG,会导致IE4以上的浏览器的数据缓存功能失效。
以下是百度示例:
两核CPU/4G内存的配置示例:
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\.";
5.2由ngx_http_gzip_static_module (可选)模块处理的指令
注意:要想使用必须在Nginx程序配置时使用 --with-http_gzip_static_module指令。
该模块负责经过Gzip预压缩的数据.
其中 gzip_static用于开启或关闭该指令: gzip_static on | off | always;
需要注意的是gzip_proxied只支持以下设置: gzip_proxied expired no-cache no-store private auth;
5.3由ngx_http_gunzip_module (可选)模块处理的2个指令
注意:要想使用必须在Nginx程序配置时使用 --with-ngx_http_gunzip_module指令。
需要解压的数据可能来自后端服务器或Nginx服务器预压缩产生。
- (1)gunzip指令
- 当开启时,如果客户端浏览器不支持Gzip处理,Nginx服务器将返回解压后的数据;如果客户端支持Gzip,Nginx则忽略该设置。
- gunzip_static on | off ;
- (2)gunzip_buffers指令
- 用法与 gzip_buffers类似。
第7章 Nginx 服务器的代理服务
Nginx搭建反向代理服务器过程详解
利用nginx的proxy_next_upstream实现线路容灾
Nginx 负载均衡模块 ngx_http_upstream_module 详述
7.3.1反向代理基本设置的21个命令
- (1)proxy_pass命令
upstream proxy_svrs { server http://182.168.1.1:8001/uri/; server http://182.168.1.2:8001/uri/; server http://182.168.1.3:8001/uri/; } server { ...... listen 80; server_name www.myweb.home; location / { proxy_pass proxy_svrs; } }
在不指明http://协议的情况下
upstream proxy_svrs { server 182.168.1.1:8001/uri/; server 182.168.1.2:8001/uri/; server 182.168.1.3:8001/uri/; } server { ...... listen 80; server_name www.myweb.home; location / { proxy_pass http://proxy_svrs; } }
- (6)proxy_set_header命令
- 语法 proxy_set_header field value;
#默认情况下该指令设置为: proxy_set_header Host $proxy_host; proxy_set_header Connect close; #一些实例: proxy_set_header Host $http_host; #将Host头域的值填充�成客户端的地址。 proxy_set_header Host $host; #将location块的server_name指令值填充到Host头域。 proxy_set_header Host $host:$proxy_port; #将location块的server_name指令值和listener指令值一起填充到Host头域。
7.3.2Proxy Buffer的配置的7个命令
proxy_buffer_size、proxy_buffers、proxy_busy_buffer_size等,它们都是针对每一个请求起作用的,而不是全局概念。
- (1)proxy_buffering
- 是否启用或关闭ProxyBuffer。语法为: proxy_buffering on | off ;
- 开启或关闭ProxyBuffer还可以通过在HTTP响应头部的“X-Accel-Buffering”头域设置“yes”或“no”来实现
- (2)proxy_buffers指令
- 配置接收一次被代理服务器响应数据的ProxyBuffer个数和每个Buffer的大小。 proxy_buffers 8 4k | 8k;
- (2)proxy_buffer_size指令
- 配置从被代理服务器获取第一部分响应数据的大小,默认不4k或8k proxy_buffer_size 4k | 8k;