码迷,mamicode.com
首页 > 其他好文 > 详细

nginx优化

时间:2015-06-14 00:42:39      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:nginx fastcgi 优化 网站 调优

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 cpu00000001表示将第1worker进程和第1cpu绑定。

worker_processes2

worker_cpu_affinity 0101  1010

#将第1worker进程绑定到CPU0CPU2,将第2worker进程绑定到CPU1CPU3

 

参数注释:

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=5000inactive=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

表示用于向外连接的端口范围。缺省情况下很小:3276861000,改为500065000(注意:不要把最低值设的太低,否则可能会占用掉正常的端口!)

 

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_timestampstcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了,当客户端或服务端以NAT方式构建的时候就可能出现问题,当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,也就是说对服务端而言这些客户端实际上等同于一个,由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,可以通过下面命令来确认数据包不断被丢弃的现象:netstat -s |grep timestamp。安全起见,通常要禁止tcp_tw_recycle。说到这里,大家可能会想到如果把tcp_timestamps设置为0tcp_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 并附带一个回应前面一个SYNACK。也

就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。

 

net.ipv4.tcp_syn_retries = 1

在内核放弃建立连接之前发送SYN 包的数量。tcp_syn_retries的值必须为正整数,并且不能超过 255。因为每一次重新发送封包都会耗费约3040】秒去等待才决定尝试下一次重新发送或决定放弃。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_2TIME_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 ProductBDP)的内容。

 给定链接带宽和 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_sizefastcgi_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;

为指定的应答代码设定缓存时间,上例中将200302 应答缓存一小时,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.confFastCGI 相关参数,另外,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

nginx优化

标签:nginx fastcgi 优化 网站 调优

原文地址:http://changfei.blog.51cto.com/4848258/1661608

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!