Nginx性能优化

Nginx 性能优化,让你的 Nginx 更快更好用。


nginx配置文件优化

# Nginx打开网页报错时,关闭版本号显示
server_tokens off;

# 用来设置允许客户端请求的最大的单个文件字节数
client_max_body_size     20m;
# 用来指定来自客户端请求头的headbuffer大小.默认是1k,如果自定义了消息头或有更大的cookie,可增加缓冲区大小,系统分页大小通过getconf PAGESIZE获取.
client_header_buffer_size    32k;
# 用来指定客户端请求中较大的消息头的缓存最大数量和大小,4为个数,128k为大小,最大缓存量为4个128k.
large_client_header_buffers   4 128k;
# 开启高效文件传输模式,告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送,将tcp_nopush和tcp_nodelay两个设置为"on"用于放置网络阻塞.
sendfile on;
tcp_nopush  on;
tcp_nodelay  no;
#每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
sendfile_max_chunk 512k;
#  设置客户端链接保持活动的超时时间,超过这个时间服务器会关闭该连接,值越大无用的线程变的越多,0:关闭此功能.
keepalive_timeout   60;
# 设置客户端请求头读取超时时间.超过这个时间客户端没有发送数据,客户端会收到“Request time out(408)”错误.
client_header_timeout  10;
# 设置客户端请求主体读取超时时间,超过这个时间客户端没有发送数据,客户端会收到“Request time out(408)”错误,默认值是60.
client_body_timeout    10;
# 指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接.
send_timeout  10;
#用于保存各种key,如:当前连接数的共享内存的参数,5m是5兆字节,这个值应该被设置的足够大,以存储(32K*5)32byte状态或者(16K*5)64byte状态
limit_conn_zone $binary_remote_addr zone=addr:5m;

#key最大连接数,这里key是addr,我设置的值是100,这样就允许每个IP地址最多同时打开100个连接数
limit_conn addr 100;

#nginx启动出现could not build the server_names_hash, you should increase错误时,请提高这个参数的值一般设成64就够了
server_names_hash_bucket_size 128;
#线程池优化,使用--with-threads配置参数编译
#aio threads;
#thread_pool default threads=32 max_queue=65536;
#aio threads=default;

# gzip性能优化
gzip on;
# 设置允许压缩的最少字节数,从header的“Content-Length”获取该值.如请求小于1K文件,不要压缩,压缩小于1K数据反而越压缩越大.
gzip_min_length 1100;
# 表示申请4个单位为16KB的内存作为压缩结果流缓存,默认是申请于原始数据大小相同的内存来作为存储空间.
gzip_buffers 4 16k;
#允许或者禁止压缩基于请求和响应的响应流,若设置为any,将会压缩所有请求
gzip_proxied   expired no-cache no-store private auth;
# gzip有1.1及1.0两个版本,默认是1.1
gzip_http_version 1.1;
#gzip压缩等级在0-9内,数值越大压缩率越高,CPU消耗也就越大,建议设置为4-6
gzip_comp_level 4;
# 压缩类型
gzip_types text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json image/jpeg image/gif image/png;
# varyheader支持,让前端的缓存服务器识别压缩后的文件,如squid等
gzip_vary on;
# 禁止对ie1-6的浏览器启用gzip压缩
gzip_disable   "MSIE [1-6]\.";





#静态文件的缓存性能调优
#这个将为打开文件指定缓存,max 指定缓存数量.建议和打开文件数一致.inactive 是指经过多长时间文件没被请求后删除缓存
open_file_cache max=65535 inactive=20s;
#这个是指多长时间检查一次缓存的有效信息,例如我一直访问这个文件,30秒后检查是否更新,反之更新
open_file_cache_valid 30s;
#定义了open_file_cache中指令参数不活动时间期间里最小的文件数
open_file_cache_min_uses 2;
#NGINX可以缓存在文件访问期间发生的错误,这需要设置该值才能有效,如果启用错误缓存.则在访问资源(不查找资源)时.NGINX会报告相同的错误
open_file_cache_errors on;




#fastcgi性能调优
#连接到后端 Fastcgi 的超时时间
fastcgi_connect_timeout 300;
#与 Fastcgi 建立连接后多久不传送数据,就会被自动断开
fastcgi_send_timeout 300;
#nginx等待后端服务器的应答超时时间
fastcgi_read_timeout 300;
#可以设置为 FastCGI 返回的大部分应答大小,这样可以处理大部分请求,较大的请求将被缓冲到磁盘
fastcgi_buffers 4 64k;
#指定读取 Fastcgi 应答第一部分需要多大的缓冲区,可以设置gastcgi_buffers选项指定的缓冲区大小
fastcgi_buffer_size 64k;
#繁忙时的buffer,可以是fastcgi_buffer的两倍
fastcgi_busy_buffers_size 128k;
#在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该值越小越可能报 502 BadGateway
fastcgi_temp_file_write_size 128k;
#是否传递4**&5**错误信息到客户端,或允许nginx使用error_page处理错误信息.
fastcgi_intercept_errors on;

#fastcgi_cache配置优化(若是多站点虚拟主机,除fastcgi_cache_path(注意keys_zone=名称)全部加入php模块中)
#开启FastCGI缓存并指定一个名称,开启缓存可以降低CPU的负载,防止502错误出现
fastcgi_cache fastcgi_cache;
#定义哪些http头要缓存
fastcgi_cache_valid 200 302 301 1h;
#URL经过多少次请求将被缓存
fastcgi_cache_min_uses 1;
#定义哪些情况下用过期缓存
fastcgi_cache_use_stale error timeout invalid_header http_500;

#fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=fastcgi_cache:15m inactive=1d max_size=1g;
#keys_zone=缓存空间的名字,cache=用多少内存,inactive=默认失效时间,max_size=最多用多少硬盘空间。
#缓存目录,可以设置目录层级,举例:1:2会生成16*256个字目录

#定义fastcgi_cache的key
fastcgi_cache_key $scheme$request_method$host$request_uri;

#fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

以上为nginx 中FastCGI 相关参数,另外,FastCGI 自身也有一些配置需要进行优化,如果你使用php-fpm 来管理FastCGI,可以修改配置文件中的以下值:

<value name=”max_children”>60</value>

同时处理的并发请求数,即它将开启最多60 个子线程来处理并发连接。

<value name=”rlimit_files”>102400</value>

最多打开文件数。

<value name=”max_requests”>204800</value>

每个进程在重置之前能够执行的最多请求数。

linux内核优化

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
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000           #timewait的数量
net.ipv4.tcp_sack = 1                                 #有选择的应答
net.ipv4.tcp_window_scaling = 1                 #设置tcp/ip会话滑动窗口是否可变,1可变,0不可变。开启使滑动窗口大小增加数个数量级,提高数据传输能力
net.ipv4.tcp_rmem = 4096        87380    4194304  #tcp接收缓冲区
net.ipv4.tcp_wmem = 4096        16384    4194304  #tcp发送缓冲区
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           #表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目,一般默认值为128(可能不同的linux系统该数值也不同)。nginx服务器中定义的NGX_LISTEN_BACKLOG默认为511。

net.core.somaxconn = 262144                     #该参数用于调节系统同时发起的TCP连接数,一般默认值为128.在客户端存在高并发请求的情况下,该默认值较小,肯定会导致连接超时或重传问题,我们可以根据实际需要结合并发请求数来调节此值。

net.ipv4.tcp_max_orphans = 3276800              #该参数用于设定系统中最多允许存在多少tcp套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,没有与用户文件句柄关联的tcp套接字符将立即被复位,同时给出警告信息。这个限制只是为了防止简单的DoS工具。一般在系统内存比较充足的情况下,可以增大这个参数的赋值

net.ipv4.tcp_max_syn_backlog = 262144          #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。一般在系统内存比较充足的情况下,可以增大这个参数的赋值

net.ipv4.tcp_timestamps = 0                  #该参数用于设置时间戳,可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。net.ipv4.tcp_timestamps 开启时,net.ipv4.tcp_tw_recycle开启才能生效lvs的nat模式中,在转发请求的时候,会把请求中的源ip和目标ip改变,时间戳可能会变,所以就会被回收,但是dr模式,时间戳是不会变的,所以dr模式开启没有问题

net.ipv4.tcp_synack_retries = 1               #该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量。为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK,一个参数主要影响这个过程,一般赋值为1,即内核放弃连接之前发送一次SYN+ACK包

net.ipv4.tcp_syn_retries = 1                    #内核放弃连接之前发送SYN包的数量
net.ipv4.tcp_tw_recycle = 1                     #timewait快速回收
net.ipv4.tcp_tw_reuse = 1                       #timewait 用于新的连接
net.ipv4.tcp_mem =    1835008 2752512 3670016     #out of socket memory
net.ipv4.tcp_fin_timeout = 15                     #如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些。

net.ipv4.tcp_keepalive_time = 30                                #keepalived 发送消息的频度
net.ipv4.ip_local_port_range = 1024    65000              #端口范围
 
#以下可能需要加载ip_conntrack模块 modprobe ip_conntrack ,有文档说防火墙开启情况下此模块失效
#缩短established的超時時間

net.netfilter.nf_conntrack_tcp_timeout_established = 180

#CONNTRACK_MAX 允许的最大跟踪连接条目,是在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)

net.netfilter.nf_conntrack_max = 1048576

net.nf_conntrack_max = 1048576

 
执行生效:/sbin/sysctl -p
 

内核优化脚本

#!/bin/bash
# set linux kernl var
if [ `id -u` -eq 0 ];then
cat >> /etc/sysctl.conf  <<EOF
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
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
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 = 65535
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
EOF
echo "please run this script on root!"

/sbin/sysctl -p


cat >> /etc/security/limits.conf  << EOF

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

EOF
else
echo "please run this script on root!"

fi

sysctl -a | grep fs.file是用来查看当前系统的文件句柄数的.

上次更新:
贡献者: iEchoxu