Nginx优化选项
参数注释:
worker_processes #nginx进程数。
具体用法:
worker_processes8; #建议按照cpu 核数目来指定,通常设置为cpu核数的倍数。
参数注释:
worker_cpu_affinity #设置进程绑定cpu,这个跟worker_processes协同工作。
具体用法:
worker_processes8
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000
0100000010000000;
#将8 个进程平均分配到8 个cpu,00000001表示将第1个worker进程和第1个cpu绑定。
worker_processes2
worker_cpu_affinity 0101 1010
#将第1个worker进程绑定到CPU0和CPU2,将第2个worker进程绑定到CPU1和CPU3。
参数注释:
worker_rlimit_nofile
#定义一个worker进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit-n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
具体用法:
worker_rlimit_nofile 102400;
参数注释:
useepoll
#使用epoll 的I/O 模型,关于epoll模型我会抽时间另写一片博客。
参数注释:
worker_connections
每个进程允许的最多连接数,理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。
具体用法:
worker_connections102400;
参数注释:
keepalive_timeout
#keepalive超时时间,使客户端连接到服务器在一定时间内持续有效。
具体用法:
keepalive_timeout60;
#有些浏览器会忽略这个设置,比如IE会在60秒后自动关闭连接。
参数注释:
client_header_buffer_size4k;
#客户端请求头部的缓冲区大小。
具体用法:
client_header_buffer_size4k;
#这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconfPAGESIZE 取得。
参数注释:
open_file_cache
#为打开文件启用缓存,默认是没有启用的,它有两个参数,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
具体用法:
open_file_cache max=102400 inactive=20s;
#默认值是max=5000,inactive=180s。
参数注释:
open_file_cache_valid
#多长时间检查一次缓存的有效信息。
具体用法:
open_file_cache_valid30s;
#默认值是60s。
参数注释:
open_file_cache_min_uses
#默认情况下,在open_file_cache中的条目在闲置一段时间(前文设置的是20s)后则被清除,该选项可以在它设置的条件下阻止nginx移除该缓存条目。
具体用法:
open_file_cache_min_uses3;
#表示如果一个缓存条目在前文设置的20s内访问超过3次,就会变成永久活动条目,不会被移除,除非nginx需要清除旧的条目释放空间,默认值是1。
关于内核参数的优化
net.ipv4.tcp_max_tw_buckets= 5000
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为5000。
net.ipv4.ip_local_port_range= 5000 65000
表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为5000到65000。(注意:不要把最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.tcp_tw_recycle= 1
启用TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_tw_reuse= 1
开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。
net.ipv4.tcp_syncookies= 1
开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭。
net.core.somaxconn= 262144
web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到
128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,在高突发的请求中可能会导致链接超时或者触发重传,所以有必要调整这个值。
net.core.netdev_max_backlog= 262144
每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包
的最大数目。
net.ipv4.tcp_max_orphans= 262144
系统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数
字,连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,
不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_max_syn_backlog= 262144
记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128M 内存的系统而
言,缺省值是1024,小内存的系统则是128。
net.ipv4.tcp_timestamps= 0
时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间
戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
TCP有一种行为,可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了,当客户端或服务端以NAT方式构建的时候就可能出现问题,当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,也就是说对服务端而言这些客户端实际上等同于一个,由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,可以通过下面命令来确认数据包不断被丢弃的现象:netstat -s |grep timestamp。安全起见,通常要禁止tcp_tw_recycle。说到这里,大家可能会想到如果把tcp_timestamps设置为0,tcp_tw_recycle设置为1,不就OK了么?可惜一旦关闭了tcp_timestamps,那么即便打开了tcp_tw_recycle,也没有效果。好在我们还有另一个内核参数tcp_max_tw_buckets(缺省是180000)可用:net.ipv4.tcp_max_tw_buckets=5000通过设置它,系统会将多余的TIME_WAIT删除掉,此时系统日志里可能会显示:「TCP: time waitbucket table overflow,不过除非不得已,否则不要轻易使用。
net.ipv4.tcp_synack_retries= 1
为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN的ACK。也
就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
net.ipv4.tcp_syn_retries = 1
在内核放弃建立连接之前发送SYN 包的数量。tcp_syn_retries的值必须为正整数,并且不能超过 255。因为每一次重新发送封包都会耗费约30至40】秒去等待才决定尝试下一次重新发送或决定放弃。tcp_syn_retries的默认值为 5,即每一个连接要在约 180 秒 (3 分钟) 后才确定逾时。
net.ipv4.tcp_fin_timeout= 1
这个参数是用来设置保持在FIN_WAIT_2状态的时间。Tcp四次挥手,正常的处理流程就是在FIN_WAIT_2情况下接收到FIN进入到TIME_WAIT的情况,tcp_fin_timeout参数对处于TIME_WAIT状态的时间没有任何影响。但是如果这个参数设的比较小,会缩短从FIN_WAIT_2到TIME_WAIT的时间,从而使连接更早地进入TIME_WAIT状态。状态开始的早,等待相同的时间,结束的也早,客观上也加速了TIME_WAIT状态套接字的清理速度。缺省值是60 秒。
net.ipv4.tcp_keepalive_time = 30
设置keepalive的闲置时长,当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是7200秒,即2 小时。
net.ipv4.tcp_mem = 94500000 915000000 927000000
确定TCP栈反映内存使用,每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值,单位是内存页,而不是字节。
TCP 的性能取决于几个方面的因素。两个最重要的因素是链接带宽(linkbandwidth)(报文在网络上传输的速率)和往返时间(round-trip time)或 RTT(发送报文与接收到另一端的响应之间的延时)。这两个值确定了称为 Bandwidth Delay Product(BDP)的内容。
给定链接带宽和 RTT 之后,您就可以计算出 BDP的值了,不过这代表什么意义呢?BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。如果缓冲区太小,那么 TCP 窗口就不能完全打开,这会对性能造成限制。如果缓冲区太大,那么宝贵的内存资源就会造成浪费。如果您设置的缓冲区大小正好合适,那么就可以完全利用可用的带宽。下面我们来看一个例子:BDP = link_bandwidth * RTT
如果应用程序是通过一个 100Mbps 的局域网进行通信,其 RRT 为 50 ms,那么 BDP 就是:100MBps * 0.050 sec / 8 = 0.625MB= 625KB
注意:此处除以 8 是将位转换成通信使用的字节。
因此,我们可以将 TCP 窗口设置为 BDP 或 1.25MB。但是在 Linux 2.6 上默认的 TCP 窗口大小是 110KB,这会将连接的带宽限制为 2.2MBps,计算方法如下:throughput = window_size /RTT
110KB /0.050 = 2.2MBps
如果使用上面计算的窗口大小,我们得到的带宽就是 12.5MBps,计算方法如下:625KB / 0.050 = 12.5MBps
net.ipv4.tcp_wmem= 4096 16384 4194304
为自动调优定义每个 socket 使用的内存。第一个值是为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。
net.ipv4.tcp_rmem= 4096 87380 4194304
与 tcp_wmem 类似,但它表示的是为自动调优所使用的接收缓冲区的值。
net.core.wmem_default= 8388608
定义默认的发送窗口大小,对于更大的 BDP 来说,这个大小也应该更大。
net.core.rmem_default= 8388608
定义默认的接收窗口大小,对于更大的 BDP 来说,这个大小也应该更大。
net.core.rmem_max= 16777216
定义接收窗口的最大大小,对于更大的 BDP 来说,这个大小也应该更大。
net.core.wmem_max= 16777216
定义发送窗口的最大大小,对于更大的 BDP 来说,这个大小也应该更大。
内核优化设置配置文件如下:
[root@db~]# cat /etc/sysctl.conf net.ipv4.ip_forward= 0 net.ipv4.conf.default.rp_filter= 1 net.ipv4.conf.default.accept_source_route= 0 kernel.sysrq= 0 kernel.core_uses_pid= 1 kernel.msgmnb= 65536 kernel.msgmax= 65536 kernel.shmmax= 68719476736 kernel.shmall= 4294967296 net.core.wmem_default= 8388608 net.core.rmem_default= 8388608 net.core.rmem_max= 16777216 net.core.wmem_max= 16777216 net.core.netdev_max_backlog= 262144 net.core.somaxconn= 262144 net.ipv4.tcp_max_tw_buckets= 5000 net.ipv4.tcp_sack= 1 net.ipv4.tcp_window_scaling= 1 net.ipv4.tcp_max_orphans= 262144 net.ipv4.tcp_max_syn_backlog= 262144 net.ipv4.tcp_synack_retries= 1 net.ipv4.tcp_syn_retries= 1 net.ipv4.tcp_syncookies= 1 net.ipv4.tcp_tw_recycle= 1 net.ipv4.tcp_tw_reuse= 1 net.ipv4.tcp_rmem= 4096 87380 4194304 net.ipv4.tcp_wmem= 4096 16384 4194304 net.ipv4.tcp_mem= 94500000 915000000 927000000 net.ipv4.tcp_timestamps= 0 net.ipv4.tcp_fin_timeout= 1 net.ipv4.tcp_keepalive_time= 30 net.ipv4.ip_local_port_range= 5000 65000
fastcgi参数
fastcgi_cache_path/usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
这个指令为FastCGI 缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动状态下删除缓存时间。
fastcgi_connect_timeout300;
连接到后端FastCGI 的超时时间。
fastcgi_send_timeout300;
向FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI 传送请求的超时时间。
fastcgi_read_timeout300;
接收FastCGI 应答的超时时间,这个值是指已经完成两次握手后接收FastCGI 应答的超时时间。
fastcgi_buffer_size4k;
指定读取FastCGI 应答开始部分需要用多大的缓冲区,一般开始部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k。
fastcgi_buffers8 4k;
设置缓冲区的数量和大小,用于从fastcgi应用程序读取响应数据。
fastcgi_busy_buffers_size 8k;
默认值是fastcgi_buffers 的两倍。
频繁的向客户端响应时,在响应没有处理完成时缓冲区总大小。默认情况下,由两个缓冲区大小是有限thefastcgi_buffer_size和fastcgi_buffers指令。
fastcgi_temp_file_write_size8k;
在写入fastcgi_temp_path 时将用多大的数据块,默认值是fastcgi_buffers 的两倍。
fastcgi_cacheCACHETEST
开启FastCGI 缓存并且为其制定一个名称。
fastcgi_cache_valid200 302 1h;
fastcgi_cache_valid301 1d;
fastcgi_cache_validany 1m;
为指定的应答代码设定缓存时间,上例中将200,302 应答缓存一小时,301 应答缓
存1 天,其他为1 分钟。
fastcgi_cache_min_uses1;
缓存在fastcgi_cache_path 指令inactive 设置的参数值时间内的最少使用次数,这里是指在5 分钟内某缓存1 次也没有被使用,那么这个缓存将被移除。
fastcgi_cache_use_stale error timeout invalid_header http_500;
指定在出现某些网关错误error、超时timeout、不可用的头invalid_header、内部服务器错误http_500的情况下,nginx都将传送过期的缓存数据。
以上为nginx.conf中FastCGI 相关参数,另外,FastCGI自身也有一些配置需要进行优化,如果使用php-fpm 来管理FastCGI,可以修改配置文件中的以下值:
<valuename="max_children">60</value>
同时处理的并发请求数,即它将开启最多60 个子线程来处理并发连接。
<valuename="rlimit_files">102400</value>
最多打开文件数。
<valuename="max_requests">204800</value>
每个进程在重置之前能够执行的最多请求数。
Nginx配置文件:
[root@db~]# cat /etc/nginx/nginx.conf usernginx nginx; worker_processes4; worker_cpu_affinity0001 0010 0100 1000; error_log/var/log/nginx/nginx_error.log crit; pid/usr/local/nginx/nginx.pid; worker_rlimit_nofile102400; events { use epoll; worker_connections 102400; } http { include mime.types; default_type application/octet-stream; charset utf-8; server_names_hash_bucket_size 128; client_header_buffer_size 2k; large_client_header_buffers 4 4k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; fastcgi_cache_path/usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 4k; fastcgi_buffers 8 4k; fastcgi_busy_buffers_size 8k; fastcgi_temp_file_write_size 8k; fastcgi_cache TEST; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeoutinvalid_header http_500; open_file_cache max=102400 inactive=20s; open_file_cache_min_uses 1; open_file_cache_valid 30s; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plainapplication/x-javascript text/css application/xml; gzip_vary on; server { listen 80; server_name my.test.com; index index.php index.htm; root /website/html/; location /status { stub_status on; } location ~ .*\.(php|php5)?$ { fastcgi_pass127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location ~.*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; } log_format access ‘$remote_addr -$remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent"$http_referer" ‘ ‘"$http_user_agent"$http_x_forwarded_for‘; access_log/var/log/nginx/access.log access; } }
本文出自 “乾楠有” 博客,请务必保留此出处http://changfei.blog.51cto.com/4848258/1661608
原文地址:http://changfei.blog.51cto.com/4848258/1661608