共计 3345 个字符,预计需要花费 9 分钟才能阅读完成。
本文由 LinuxProbe.Com 团队成员 岳国帅 整理发布,原文来自:黑·白。
导读 | 使用 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;
}
现代计算机硬件是多处理器的,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 cores
worker_processes 16;
# connections per worker
events
{
worker_connections 4096;
multi_accept on;
}
以我们的经验来看,同一台机器上多个 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;
}
这一点影响较大,因为高流量站点上的日志文件涉及大量必须在所有线程之间同步的 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;
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;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
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;
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;
# Recycle Zombie connections
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.maxtcptw=200000
# Increase number of files
kern.maxfiles=65535
kern.maxfilesperproc=16384
# Increase page share factor per process
vm.pmap.pv_entry_max=54272521
vm.pmap.shpgperproc=20000
# Increase number of connections
vfs.vmiodirenable=1
kern.ipc.somaxconn=3240000
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.restrict_rst=1
kern.ipc.maxsockbuf=2097152
kern.ipc.shmmax=268435456
# Host cache
net.inet.tcp.hostcache.hashsize=4096
net.inet.tcp.hostcache.cachelimit=131072
net.inet.tcp.hostcache.bucketlimit=120
# Increase number of ports
net.inet.ip.portrange.first=2000
net.inet.ip.portrange.last=100000
net.inet.ip.portrange.hifirst=2000
net.inet.ip.portrange.hilast=100000
kern.ipc.semvmx=131068
# Disable Ping-flood attacks
net.inet.tcp.msl=2000
net.inet.icmp.bmcastecho=1
net.inet.icmp.icmplim=1
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
持续监控打开连接的数目,空闲内存以及等待状态线程的数目。
设置警报在超出阈值时通知你。你可以自己构建这些警报,或者使用类似 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_module
make install BATCH=yes