本帖最后由 方琪 于 2016-4-20 09:28 编辑
需求背景:公司的web服务器的并发支持不是很好,因此在不改变硬件的前提下,考虑对服务器的参数进行优化一下。
服务器环境:Centos7.2+nginx1.6+php5.5 数据库暂时不涉及
测试命令:ab -cX -nX URL(参考我另外一篇帖子http://www.apelearn.com/bbs/thread-11819-1-1.html)
测试页面:http://app.yb111.cn/spread/advertisement/list?lngx=120.153576&laty=30.287459
一,nginx优化:
主要针对nginx.conf这个文件。
对性能提升比较明显的参数主要有:
worker_processes 4; 、
#nginx进程数,一般设置为cpu核心数的2倍。
worker_cpu_affinity 0001 0010 0100 1000;
#将4个nginx进程平均分配给4个cpu。
worker_rlimit_nofile 10240;
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是
# nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。ulimit的用法参考:http://blog.haohtml.com/archives/9883
events {
use epoll;
#选择epoll的I/O模型。与系统环境有关。nginx比apache并发支持高就与采用了这个模型有关。具体原理
#请参考:http://blog.csdn.net/xifeijian/article/details/17385831
worker_connections 1024; #每个进程允许的最大连接数,根据实际业务量进行设置,设的太大并没有什么意义。
multi_accept on; #通知nginx收到一个新连接通知后接受尽可能多的连接。
}
http{
server_tokens off;
#和性能无关,关闭nginx在错误页面中显示的版本号的
sendfile on;
#可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。
#Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,
#write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,
#sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)
tcp_nopush on;
#告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送
tcp_nodelay on;
#告诉nginx不要缓存数据,提高nginx的数据响应速度。发送一小块数据信息时就能立即得到返回值
keepalive_timeout 30;
#keepalive超时时间,30或者更短一点都可以。
client_header_timeout 10;
client_body_timeout 10;
#设置请求头和请求体(各自)的超时时间。
reset_timedout_connection on;
#及时关闭不响应的客户端链接,释放其资源。
send_timeout 10;
#指定客户端的超时时间。
limit_conn_zone $binary_remote_addr zone=addr:5m;
#设置用于保存各种key(比如当前连接数)的共享内存的参数
limit_conn addr 50;
#设置单个IP的最大连接数。注意 这个参数是会影响你本地ab测试的,你测试的时候并发数会被限制。
gzip on;
gzip_min_length 1k;
#大于1K才压缩
gzip_buffers 4 8k;
gzip_disable "msie6";
gzip_proxied any;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}
二,php-fpm优化
重要参数:
pm = dynamic
#选择进程模式为动态,以下第一个参数失效,后面三个参数生效。如果选择static(静态),则只有以下第一个参数生效(pm.max_children)
pm.max_children = 200
#静态模式时的固定子进程数
pm.start_servers = 1
#动态模式下起始进程数
pm.min_spare_servers = 1
#动态模式下允许的最小空闲进程。
pm.max_spare_servers = 10
#动态模式下允许的最大空闲进程。
三,内核参数优化
主要针对文件:/etc/sysctl.conf
重要参数:
net.ipv4.tcp_tw_recycle = 1
#启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1
#开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_syncookies = 1
#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。
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的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_synack_retries = 1
#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries = 1
#在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_fin_timeout = 30
#如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接
#,甚至意外当机。缺省值 是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的
#机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1
#要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。
net.ipv4.tcp_keepalive_time = 30
#当keepalive启用的时候,TCP发送keepalive消息的频度。缺省是2小时。
需求背景:公司的web服务器的并发支持不是很好,因此在不改变硬件的前提下,考虑对服务器的参数进行优化一下。
服务器环境:Centos7.2+nginx1.6+php5.5 数据库暂时不涉及
测试命令:ab -cX -nX URL(参考我另外一篇帖子http://www.apelearn.com/bbs/thread-11819-1-1.html)
测试页面:http://app.yb111.cn/spread/advertisement/list?lngx=120.153576&laty=30.287459
一,nginx优化:
主要针对nginx.conf这个文件。
对性能提升比较明显的参数主要有:
worker_processes 4; 、
#nginx进程数,一般设置为cpu核心数的2倍。
worker_cpu_affinity 0001 0010 0100 1000;
#将4个nginx进程平均分配给4个cpu。
worker_rlimit_nofile 10240;
#这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是
# nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。ulimit的用法参考:http://blog.haohtml.com/archives/9883
events {
use epoll;
#选择epoll的I/O模型。与系统环境有关。nginx比apache并发支持高就与采用了这个模型有关。具体原理
#请参考:http://blog.csdn.net/xifeijian/article/details/17385831
worker_connections 1024; #每个进程允许的最大连接数,根据实际业务量进行设置,设的太大并没有什么意义。
multi_accept on; #通知nginx收到一个新连接通知后接受尽可能多的连接。
}
http{
server_tokens off;
#和性能无关,关闭nginx在错误页面中显示的版本号的
sendfile on;
#可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。
#Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,
#write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,
#sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)
tcp_nopush on;
#告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送
tcp_nodelay on;
#告诉nginx不要缓存数据,提高nginx的数据响应速度。发送一小块数据信息时就能立即得到返回值
keepalive_timeout 30;
#keepalive超时时间,30或者更短一点都可以。
client_header_timeout 10;
client_body_timeout 10;
#设置请求头和请求体(各自)的超时时间。
reset_timedout_connection on;
#及时关闭不响应的客户端链接,释放其资源。
send_timeout 10;
#指定客户端的超时时间。
limit_conn_zone $binary_remote_addr zone=addr:5m;
#设置用于保存各种key(比如当前连接数)的共享内存的参数
limit_conn addr 50;
#设置单个IP的最大连接数。注意 这个参数是会影响你本地ab测试的,你测试的时候并发数会被限制。
gzip on;
gzip_min_length 1k;
#大于1K才压缩
gzip_buffers 4 8k;
gzip_disable "msie6";
gzip_proxied any;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}
二,php-fpm优化
重要参数:
pm = dynamic
#选择进程模式为动态,以下第一个参数失效,后面三个参数生效。如果选择static(静态),则只有以下第一个参数生效(pm.max_children)
pm.max_children = 200
#静态模式时的固定子进程数
pm.start_servers = 1
#动态模式下起始进程数
pm.min_spare_servers = 1
#动态模式下允许的最小空闲进程。
pm.max_spare_servers = 10
#动态模式下允许的最大空闲进程。
三,内核参数优化
主要针对文件:/etc/sysctl.conf
重要参数:
net.ipv4.tcp_tw_recycle = 1
#启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1
#开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_syncookies = 1
#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。
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的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_synack_retries = 1
#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries = 1
#在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_fin_timeout = 30
#如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接
#,甚至意外当机。缺省值 是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的
#机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1
#要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。
net.ipv4.tcp_keepalive_time = 30
#当keepalive启用的时候,TCP发送keepalive消息的频度。缺省是2小时。
编辑回复