使用Nginx搭配PHP已有7年的这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。
以下正是这方面的一些提示和建议:
序列号 | CPU | RAM | HDD | 带宽 | 售价(美元) | 免费试用 |
---|---|---|---|---|---|---|
香港服务器1 | E5-2620 | 32G | 1T HDD | 50M/无限流量 | $196.00 | 立即申请 |
香港服务器2 | E5-2650 | 32G | 1T HDD | 50M/无限流量 | $256.00 | 立即申请 |
香港服务器3 | E5-2680 | 32G | 1T HDD | 50M/无限流量 | $316.00 | 立即申请 |
香港服务器4 | E5-2690 | 32G | 1T HDD | 50M/无限流量 | $336.00 | 立即申请 |
香港服务器5 | E5-2697 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器6 | E5-2620*2 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器7 | E5-2650*2 | 32G | 1T HDD | 50M/无限流量 | $436.00 | 立即申请 |
香港服务器8 | E5-2680*2 | 32G | 1T HDD | 50M/无限流量 | $476.00 | 立即申请 |
香港服务器9 | E5-2690*2 | 32G | 1T HDD | 50M/无限流量 | $556.00 | 立即申请 |
香港服务器10 | E5-2697*2 | 32G | 1T HDD | 50M/无限流量 | $596.00 | 立即申请 |
香港服务器11 | E5-2680v4*2 | 32G | 1T HDD | 50M/无限流量 | $696.00 | 立即申请 |
香港服务器12 | E5-2698v4*2 | 32G | 1T HDD | 50M/无限流量 | $796.00 | 立即申请 |
1. 将TCP切换为UNIX域套接字
UNIX域套接字相比TCP套接字在loopback接口上能提供更好的性能(更少的数据拷贝和上下文切换)。
但有一点需要牢记:仅运行在同一台服务器上的程序可以访问UNIX域套接字(显然没有网络支持)。
upstreambackend{#UNIXdomainsocketsserverunix:/var/run/fastcgi.sock;#TCPsockets#server127.0.0.1:8080;}2. 调整工作进程数
现代计算机硬件是多处理器的,NGINX可以利用多物理或虚拟处理器。
多数情况下,你的Web服务器都不会配置为处理多种任务(比如作为Web服务器提供服务的同时也是一个打印服务器),你可以配置NGINX使用所有可用的处理器,NGINX工作进程并不是多线程的。
运行以下命令可以获知你的机器有多少个处理器:
Linux上 -
cat/proc/cpuinfo|grepprocessor
FreeBSD上 -
sysctldev.cpu|greplocation
将nginx.conf文件中work_processes的值设置为机器的处理器核数。
同时,增大worker_connections(每个处理器核心可以处理多少个连接)的值,以及将”multi_accept”设置为ON,如果你使用的是Linux,则也使用”epoll”:
#Wehave16coresworker_processes16;#connectionsperworkerevents{worker_connections4096;multi_accepton;}3. 设置upstream负载均衡
以我们的经验来看,同一台机器上多个upstream后端相比单个upstream后端能够带来更高的吞吐量。
例如,如果你想支持最大1000个PHP-fpm子进程(children),可以将该数字平均分配到两个upstream后端,各自处理500个PHP-fpm子进程:
upstreambackend{serverunix:/var/run/php5-fpm.sock1weight=100max_fails=5fail_timeout=5;serverunix:/var/run/php5-fpm.sock2weight=100max_fails=5fail_timeout=5;}
以下是两个来自php-fpm.conf的进程池:
这一点影响较大,因为高流量站点上的日志文件涉及大量必须在所有线程之间同步的IO操作。
access_logoff;log_not_foundoff;error_log/var/log/nginx-error.logwarn;
若你不能关闭访问日志文件,至少应该使用缓冲:
access_log/var/log/nginx/access.logmainbuffer=16k;5. 启用GZipgzipon;gzip_disable"msie6";gzip_varyon;gzip_proxiedany;gzip_comp_level6;gzip_min_length1100;gzip_buffers168k;gzip_http_version1.1;gzip_typestext/plaintext/cssapplication/jsonapplication/x-javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascript;6. 缓存被频繁访问的文件相关的信息open_file_cachemax=200000inactive=20s;open_file_cache_valid30s;open_file_cache_min_uses2;open_file_cache_errorson;7. 调整客户端超时时间client_max_body_size500M;client_body_buffer_size1m;client_body_timeout15;client_header_timeout15;keepalive_timeout22;send_timeout15;sendfileon;tcp_nopushon;tcp_nodelayon;8. 调整输出缓冲区大小fastcgi_buffers25616k;fastcgi_buffer_size128k;fastcgi_connect_timeout3s;fastcgi_send_timeout120s;fastcgi_read_timeout120s;reset_timedout_connectionon;server_names_hash_bucket_size100;9. /etc/sysctl.conf调优#RecycleZombieconnectionsnet.inet.tcp.fast_finwait2_recycle=1net.inet.tcp.maxtcptw=200000#Increasenumberoffileskern.maxfiles=65535kern.maxfilesperproc=16384#Increasepagesharefactorperprocessvm.pmap.pv_entry_max=54272521vm.pmap.shpgperproc=20000#Increasenumberofconnectionsvfs.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#Hostcachenet.inet.tcp.hostcache.hashsize=4096net.inet.tcp.hostcache.cachelimit=131072net.inet.tcp.hostcache.bucketlimit=120#Increasenumberofportsnet.inet.ip.portrange.first=2000net.inet.ip.portrange.last=100000net.inet.ip.portrange.hifirst=2000net.inet.ip.portrange.hilast=100000kern.ipc.semvmx=131068#DisablePing-floodattacksnet.inet.tcp.msl=2000net.inet.icmp.bmcastecho=1net.inet.icmp.icmplim=1net.inet.tcp.blackhole=2net.inet.udp.blackhole=110. 监控
持续监控打开连接的数目,空闲内存以及等待状态线程的数目。
设置警报在超出阈值时通知你。你可以自己构建这些警报,或者使用类似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_modulemakeinstallBATCH=yes