Nginx + php-fpm 性能优化

当nginx日志中出现:
connect() to unix:/var/run/php-fpm/php-fpm.sock failed (11:       Resource temporarily unavailable) while connecting to upstream, client: 127.0.0.1, server: 127.0.0.1, re      quest: "GET / HTTP/1.0", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "127.0.0.      1"

可以使用ip:port替换unix sock模式(不推荐)
vi /etc/php-fpm.d/www.conf
or
vi /etc/php/8.0/fpm/pool.d/www.conf
listen = /var/run/php-fpm/php-fpm.sock
to
listen = 127.0.0.1:9002

vi /etc/nginx/conf.d/default.conf
fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
to
fastcgi_pass   127.0.0.1:9002;


vi /etc/nginx/nginx.conf
修改 worker_processes 值为cpu核心数*2
...
events {
    use epoll;
    worker_connections  65535;
}
...
keepalive_requests 2048;
keepalive_timeout  30;
...
access_log  /var/log/nginx/access.log  main buffer=16k;
...
sendfile       on;
tcp_nopush     on;
aio            on;
...
client_body_buffer_size 16k;
client_max_body_size 8M;

修改内核网络连接数:
修改Linux内核网络连接数
检查是否生效: cat /proc/sys/net/core/somaxconn sysctl -a | grep "netdev_max_backlog" sysctl -a | grep "tcp_max_syn_backlog" 修改backlog大小,backlog的定义是已连接但未进行accept处理的SOCKET队列大小 vi /etc/php-fpm.d/www.conf or vi /etc/php/8.0/fpm/pool.d/www.conf listen.backlog = -1 to listen.backlog = 8192 ... pm.max_requests = 500 to pm.max_requests = 1000 当nginx日志中出现: nginx err.log : accept4() failed (24: Too many open files) 查看当前用户的打开文件数目: ulimit -n 1024 略少,需增加 vi /etc/nginx/nginx.conf add line behind line:pid /var/run/nginx.pid; worker_rlimit_nofile 655350; 修改系统允许打开文件数、进程数、待处理信号数: vi /etc/security/limits.conf * soft nofile 655350 * hard nofile 655350 * soft nproc 655350 * hard nproc 655350 要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中 vi /etc/pam.d/login session required pam_limits.so For Ubuntu 20.04: root用户需要单独写出来 root soft nproc 655350 root hard nproc 655350 root soft nofile 655350 root hard nofile 655350 还需要修改: vi /etc/systemd/user.conf DefaultLimitNOFILE=655350 vi /etc/systemd/system.conf DefaultLimitNOFILE=655350 reboot ulimit -a 修改Nginx请求超时时长: vi /etc/nginx/conf.d/default.conf location ~ .php$ { ... fastcgi_index index.php; fastcgi_connect_timeout 60; fastcgi_send_timeout 60; fastcgi_read_timeout 60; ... } vi /etc/php.ini or vi /etc/php/8.0/fpm/php.ini max_execution_time = 60 vi /etc/php-fpm.d/www.conf or vi /etc/php/8.0/fpm/pool.d/www.conf request_terminate_timeout = 60 测试效果: ab -n 1000 -c 200 http://127.0.0.1/ 优化前: Complete requests: 1000 Failed requests: 858 (Connect: 0, Receive: 0, Length: 858, Exceptions: 0) Write errors: 0 Non-2xx responses: 858 优化后: Complete requests: 1000 Failed requests: 0 Write errors: 0
vi /etc/php-fpm.conf
or
vi /etc/php/8.0/fpm/php-fpm.conf
process.max = 512

vi /etc/php-fpm.d/www.conf
or
vi /etc/php/8.0/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 512
pm.start_servers = 16
pm.min_spare_servers = 8
pm.max_spare_servers = 35
tail -f /var/log/messages 出现 kernel: nf_conntrack: table full, dropping packet
需要修改状态跟踪表的最大数,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
以64G的64位操作系统为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152
查看当前值
sysctl net.netfilter.nf_conntrack_max
修改:
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_max = 2097152

reboot
同一IP限速:
vi /etc/nginx/nginx.conf
http {
    ...

    limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s; 
    # 第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
    # 第二个参数:zone=baism:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。
    # 第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。
    limit_conn_zone $binary_remote_addr zone=addr:10m;
}

vi /etc/nginx/conf.d/default.conf
server {
    ...
    location /abc {
        limit_req zone=baism burst=5 nodelay;
        # 第1个参数:zone=baism 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
        # 第2个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
        # 第3个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。
        limit_conn addr 1; # 只能同时建立一个链接
        #limit_rate 100k; # 最大传输速率
        limit_rate_after 500k; # 超过500k限制传输速率
    }
}