我们目前在 Digital Ocean 上有一些托管电子商务平台的服务器,我们尝试了尽可能多地优化,但还不够,当流量过多时,比如 800 到 1000 个用户,网站就会瘫痪。我们目前认为是 API 瘫痪了。错误是:
2017/11/23 14:20:51 [错误] 26784#26784:*126599 connect() 到 unix:/var/run/php/php7.0-fpm.sock 失败(11:资源暂时不可用)连接到上游,客户端:{ip...},服务器:www.....com.br,请求:“GET /....”,上游:“fastcgi://unix:/var/run/php/php7.0-fpm.sock:”,主机:“www......com.br”
我们目前有:
前端服务器:
4 核,8GB RAM - 运行 nginx 1.10.3 和 php fpm 7.0
API 服务器:
8 核,16GB RAM - 运行 nginx 1.10.3 和 php fpm 5.5.9
MYSQL 服务器
主服务器 + 8 个从服务器(我们认为这不是问题所在),我们之前遇到过一些与连接数 tcp/ip 端口有关的问题(我不太清楚),但我们无法解决,因此创建了从服务器以实现负载平衡。服务器运行的是 linux ubuntu 14.04
如果需要更多信息,请询问。我们正在努力解决这个问题。
Nginx 配置:
worker_processes auto;
worker_rlimit_nofile 65536;
worker_connections 2048;
use epoll;
multi_accept on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 2048;
server_names_hash_max_size 4112;
access_log off;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 2;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;]
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 360;
fastcgi_send_timeout 360;
fastcgi_read_timeout 360;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
PHP FPM 配置:
pm = on demand;
pm.max_children = 200;
pm.process_idle_timeout = 10s;
pm.max_requests = 500;
/etc/sysctl.conf 配置:
net.ipv4.ip_local_port_range = 2000 65535;
net.ipv4.tcp_rfc1337 = 1;
net.ipv4.tcp_fin_timeout = 15;
net.ipv4.tcp_keepalive_time = 300;
net.ipv4.tcp_keepalive_probes = 5;
net.ipv4.tcp_keepalive_intvl = 15;
net.core.rmem_default = 31457280;
net.core.rmem_max = 12582912;
net.core.wmem_default = 31457280;
net.core.wmem_max = 12582912;
net.core.somaxconn = 65535;
net.core.netdev_max_backlog = 65535;
net.core.optmem_max = 25165824;
net.ipv4.tcp_mem = 65535 131072 262144;
net.ipv4.udp_mem = 65535 131072 262144;
net.ipv4.tcp_rmem = 8192 87380 16777216;
net.ipv4.udp_rmem_min = 16384;
net.ipv4.tcp_wmem = 8192 65535 16777216;
net.ipv4.udp_wmem_min = 16384;
net.ipv4.tcp_max_tw_buckets = 1440000;
net.ipv4.tcp_tw_recycle = 1;
net.ipv4.tcp_tw_reuse = 1;
答案1
资源暂时不可用清楚地表明瓶颈在前端服务器(记录此错误的服务器)上,甚至不是 API 服务器。此错误通常表示某种内存不足或某种限制达到(例如 TCP 连接),因此您需要进一步调查 - 缺乏信息不会留下太多假设空间。
还请注意,在 4 个甚至 8 个核心上配置 200 个工作器通常有点过头了(除非您的应用程序非常慢且繁琐,但 95% 的设置都不是这种情况,因为这本身就是一个问题),而且 php 5.5.9 不受支持且不安全。这与您面临的问题无关,但这些问题也是小问题(对于 PHP 来说则是大问题)。