原文:optimizing nginx and php-fpm for high traffic sites
译者:youngsterxyf
使用nginx搭配php已有7年的这份经历让我们学会如何为高流量站点优化nginx和php-fpm配置。
以下正是这方面的一些提示和建议:
1. 将tcp切换为unix域套接字unix域套接字相比tcp套接字在loopback接口上能提供更好的性能(更少的数据拷贝和上下文切换)。
但有一点需要牢记:仅运行在同一台服务器上的程序可以访问unix域套接字(显然没有网络支持)。
upstream backend{ # unix domain sockets server unix:/var/run/fastcgi.sock; # tcp sockets # server 127.0.0.1:8080;}
2. 调整工作进程数现代计算机硬件是多处理器的,nginx可以利用多物理或虚拟处理器。
多数情况下,你的web服务器都不会配置为处理多种任务(比如作为web服务器提供服务的同时也是一个打印服务器),你可以配置nginx使用所有可用的处理器,nginx工作进程并不是多线程的。
运行以下命令可以获知你的机器有多少个处理器:
linux上 -
cat /proc/cpuinfo | grep processor
freebsd上 -
sysctl dev .cpu | grep location
将nginx.conf文件中work_processes的值设置为机器的处理器核数。
同时,增大worker_connections(每个处理器核心可以处理多少个连接)的值,以及将multi_accept设置为on,如果你使用的是linux,则也使用epoll:
# we have 16 coresworker_processes 16;# connections per workerevents{ worker_connections 4096; multi_accept on;}
3. 设置upstream负载均衡以我们的经验来看,同一台机器上多个upstream后端相比单个upstream后端能够带来更高的吞吐量。
例如,如果你想支持最大1000个php-fpm子进程(children),可以将该数字平均分配到两个upstream后端,各自处理500个php-fpm子进程:
upstream backend { server unix:/var/run/php5-fpm.sock1 weight=100 max_fails=5 fail_timeout=5; server unix:/var/run/php5-fpm.sock2 weight=100 max_fails=5 fail_timeout=5;}
以下是两个来自php-fpm.conf的进程池:
www1/var/run/php5-fpm.sock1-10666wwwwwwstatic50050000020s/var/log/php-slow.logno5000127.0.0.1$hostname/usr/local/bin:/usr/bin:/bin/usr/tmp/usr/tmp/usr/tmp$ostype$machtype2www2/var/run/php5-fpm.sock2-10666wwwwwwstatic50050000020s/var/log/php-slow.logno5000127.0.0.1$hostname/usr/local/bin:/usr/bin:/bin/usr/tmp/usr/tmp/usr/tmp$ostype$machtype2
4. 禁用访问日志文件这一点影响较大,因为高流量站点上的日志文件涉及大量必须在所有线程之间同步的io操作。
access_log off;log_not_found off;error_log /var/log/nginx-error.log warn;
若你不能关闭访问日志文件,至少应该使用缓冲:
access_log /var/log/nginx/access.log main buffer=16k;
5. 启用gzip
gzip on;gzip_disable msie6;gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_min_length 1100;gzip_buffers 16 8k;gzip_http_version 1.1;gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
6. 缓存被频繁访问的文件相关的信息
open_file_cache max=200000 inactive=20s;open_file_cache_valid 30s;open_file_cache_min_uses 2;open_file_cache_errors on;
7. 调整客户端超时时间
client_max_body_size 500m;client_body_buffer_size 1m;client_body_timeout 15;client_header_timeout 15;keepalive_timeout 2 2;send_timeout 15;sendfile on;tcp_nopush on;tcp_nodelay on;
8. 调整输出缓冲区大小
fastcgi_buffers 256 16k;fastcgi_buffer_size 128k;fastcgi_connect_timeout 3s;fastcgi_send_timeout 120s;fastcgi_read_timeout 120s;reset_timedout_connection on;server_names_hash_bucket_size 100;
9. /etc/sysctl.conf调优
# recycle zombie connectionsnet.inet.tcp.fast_finwait2_recycle=1net.inet.tcp.maxtcptw=200000# increase number of fileskern.maxfiles=65535kern.maxfilesperproc=16384# increase page share factor per processvm.pmap.pv_entry_max=54272521vm.pmap.shpgperproc=20000# increase number of connectionsvfs.vmiodirenable=1kern.ipc.somaxconn=3240000net.inet.tcp.rfc1323=1net.inet.tcp.delayed_ack=0net.inet.tcp.restrict_rst=1kern.ipc.maxsockbuf=2097152kern.ipc.shmmax=268435456# host cachenet.inet.tcp.hostcache.hashsize=4096net.inet.tcp.hostcache.cachelimit=131072net.inet.tcp.hostcache.bucketlimit=120# increase number of portsnet.inet.ip.portrange.first=2000net.inet.ip.portrange.last=100000net.inet.ip.portrange.hifirst=2000net.inet.ip.portrange.hilast=100000kern.ipc.semvmx=131068# disable ping-flood attacksnet.inet.tcp.msl=2000net.inet.icmp.bmcastecho=1net.inet.icmp.icmplim=1net.inet.tcp.blackhole=2net.inet.udp.blackhole=1
10. 监控持续监控打开连接的数目,空闲内存以及等待状态线程的数目。
设置警报在超出阈值时通知你。你可以自己构建这些警报,或者使用类似serverdensity的东西。
确认安装了nginx的stub_status模块。该模块默认并不会编译进nginx,所以可能你需要重新编译nginx -
./configure --with-http_ssl_module --with-http_stub_status_module --without-mail_pop3_module--without-mail_imap_module --without-mail_smtp_modulemake install batch=yes
原文地址:高流量站点nginx与php-fpm配置优化(译), 感谢原作者分享。