高流量站点的nginx和php-fpm的优化,解决502,504异常 Linux教程 nginx&apache



合理的配置nginx处理请求数

#cat /proc/cpuinfo | grep processor #查看服务器cpu的处理器数量

# vi /etc/nginx/nginx.conf

worker_processes 16;  #修改为处理器数量

events { 

  worker_connections 4096; # 单个woker进程最大连接并发数 

  multi_accept on;  #linux2.6+默认epoll,如果使用了更优秀的kqueue模型,则使用默认off。

}

配置nginx+php-fpm负载均衡

单机能力有限,比如要支持1000台并发,生成两个sock文件,让每个php-fpm处理500台。

# nginx.conf

upstream backend { 

  server unix:/dev/shm/php-fpm.sock1 weight=100 max_fails=5 fail_timeout=5; 

  server unix:/dev/shm/php-fpm.sock2 weight=100 max_fails=5 fail_timeout=5; 

}

# php-fpm.conf(同理,php7在的配置文件末行引入了pool.d的所有配置)

# www1.conf

listen = /dev/shm/php-fpm.sock1;

listen.backlog = -1  

listen.allowed_clients = 127.0.0.1

pm.max_children = 500

pm.max_requests = 5000

rlimit_files = 50000

request_slowlog_timeout = 20s

slowlog = /var/log/php-slow.log

# cp www1.conf www.conf2

listen = /dev/shm/php-fpm.sock2;

禁止访问日志文件

高流量站点涉及大量I/O,必须在线程间同步。

# nginx.conf

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

# nginx.conf

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;

缓存经常访问的文件

# nginx.conf

open_file_cache max=2000 inactive=20s; 

open_file_cache_valid 60s; 

open_file_cache_min_uses 5; 

open_file_cache_errors off;

调整客户端超时

# nginx.conf

client_max_body_size 50M; 

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;

调整输出缓冲区

# nginx.conf

fastcgi_buffers 256 16k; 

fastcgi_buffer_size 128k; 

fastcgi_connect_timeout 3s; 

fastcgi_send_timeout 120s; 

fastcgi_read_timeout 120s; 

fastcgi_busy_buffers_size 256k; 

fastcgi_temp_file_write_size 256k; 

reset_timedout_connection on; 

server_names_hash_bucket_size 100;

调整/etc/sysctl.conf

# 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

Nginx状态监控

Nginx中的stub_status模块主要用于查看Nginx的一些状态信息,默认不会编译进Nginx,重新编译安装nginx stub_status模块,

持续监视打开的连接数,可用内存和等待线程数。 设置警报以在阈值超过时通知您。您可以自己构建这些警报,或使用像ServerDensity。 请务必安装NGINX stub_status模块 你需要重新编译NGINX -

./configure \

--prefix=/usr/local/nginx \

--with-http_stub_status_module \

make && make install

安装完毕后在server块中加入location

server{  

         location /nginx-status {  

             stub_status on;  

        }  

}

重启nginx后访问www.x.com/nginx-status即可看到返回的信息

active connections – 活跃的连接数量

server accepts handled requests — 总共处理了11989个连接 , 成功创建11989次握手, 总共处理了11991个请求

reading — 读取客户端的连接数.

writing — 响应数据到客户端的数量

waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.


php-fpm.conf

pm.max_children = 500
pm.max_requests = 5000
rlimit_files = 50000
request_terminate_timeout = 0
pm.max_children = 500
pm.start_servers = 50
pm.min_spare_servers = 50
pm.max_spare_servers = 500
pm.max_requests = 5000


nginx.conf

user  nginx;
worker_processes  auto;
worker_rlimit_nofile 1048576;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    use epoll;
    worker_connections  51200;
    multi_accept on;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 1024m;
  client_body_buffer_size 10m;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 120;
  server_tokens off;
  tcp_nodelay on;

  send_timeout 60;  
  reset_timedout_connection on; 
  fastcgi_connect_timeout 180s;
  fastcgi_send_timeout 600s;
  fastcgi_read_timeout 600s;
  fastcgi_buffers 256 16k;
  fastcgi_buffer_size 128k;
  fastcgi_busy_buffers_size 256k;
  fastcgi_temp_file_write_size 256k;
  fastcgi_intercept_errors on;
  
  #Gzip Compression
  gzip on;
  gzip_buffers 16 8k;
  gzip_comp_level 6;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_proxied any;
  gzip_vary on;
  gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";
  #If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
  open_file_cache max=1000 inactive=20s;
  open_file_cache_valid 30s;
  open_file_cache_min_uses 2;
  open_file_cache_errors on;
  include /etc/nginx/conf.d/*.conf;
}


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回