当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限制传输速率
}
}