我正在运行一个 nginx 服务器,它充当上游 unix 套接字的代理,如下所示:
upstream app_server {
server unix:/tmp/app.sock fail_timeout=0;
}
server {
listen ###.###.###.###;
server_name whatever.server;
root /web/root;
try_files $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
Run Code Online (Sandbox Code Playgroud)
一些应用服务器进程反过来在请求/tmp/app.sock可用时将其拉出。此处使用的特定应用服务器是 Unicorn,但我认为这与此问题无关。
问题是,似乎超过一定量的负载后,nginx 无法以足够快的速度通过套接字获取请求。我设置了多少个应用服务器进程并不重要。
我在 nginx 错误日志中收到了大量这些消息:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Run Code Online (Sandbox Code Playgroud)
许多请求会导致状态代码 502,以及那些不需要很长时间才能完成的请求。nginx 写入队列统计数据徘徊在 1000 左右。
无论如何,我觉得我在这里遗漏了一些明显的东西,因为 nginx 和应用程序服务器的这种特殊配置非常普遍,尤其是对于 Unicorn(实际上这是推荐的方法)。是否有任何需要设置的 linux 内核选项,或者 nginx 中的某些内容?关于如何增加上游套接字的吞吐量的任何想法?我显然做错了什么?
关于环境的其他信息:
$ uname -a
Linux …Run Code Online (Sandbox Code Playgroud) 当我每秒测试 200 次点击时,我的网站上出现了以下错误。
首先我收到了 499 个错误
2017-04-09 03:22:45 错误 162.158.79.219 499 GET/HTTP/1.1 0 nginx 访问
2017-04-09 03:22:45 错误 162.158.79.87 499 GET/HTTP/1.1 0 nginx 访问
2017-04-09 03:22:45 错误 162.158.78.170 499 GET/HTTP/1.1 0 nginx 访问
2017-04-09 03:22:45 错误 162.158.78.68 499 GET/HTTP/1.1 0 nginx 访问
第二个错误开始显示 502
2017-04-09 03:22:45 错误 162.158.79.135 502 GET / HTTP/1.1 166 nginx 访问
2017-04-09 03:22:45 错误 162.158.79.225 502 GET / HTTP/1.1 166 nginx 访问
2017-04-09 03:22:45 错误 162.158.78.110 502 GET/HTTP/1.1 166 nginx 访问
2017-04-09 03:22:45 错误 162.158.79.225 502 …
一旦池达到 pm.max_children,Nginx 就会在尝试向 PHP-FPM 发送新请求时开始超时。“最大侦听队列”在 php-status 页面中始终为 0。
以下是 php-fpm 池的示例:
[example]
catch_workers_output = no
; Configure listener
listen = /var/run/php-fpm/example.sock
listen.backlog = 65535
listen.owner = nginx
listen.group = nginx
; Unix user/group of processes
user = nginx
group = nginx
; Choose how the process manager will control the number of child processes.
pm = ondemand
pm.max_children = 10
pm.max_requests = 200
pm.process_idle_timeout = 30s
pm.status_path = /status
; Pass environment variables
env[HOSTNAME] = $HOSTNAME …Run Code Online (Sandbox Code Playgroud) 对于我的新服务器上的所有站点,似乎一旦nginx提供了一定数量的流量,它就会开始提供“错误 502 - 错误网关! ”。
让我们来看看一些日志和配置...
操作系统:Ubuntu 16.04(服务器)
硬件:6核,12GB内存
面板:ISPConfig
nginx 版本:1.10.3
来自/var/www/example/log/error.log:
11: Resource temporarily unavailable) while connecting to upstream, client: 216.170.123.179, server: example.com, request: "GET /KHFxygk9 HTTP/1.1", upstream: "fastcgi://unix:/var/lib/php7.0-fpm/web3.sock:", host: "example.com", referrer: "http://example.com/"
2017/08/10 06:01:06 [error] 15408#15408: *31372 connect() to unix:/var/lib/php7.0-fpm/web3.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 192.3.114.12, server: example.com, request: "GET /jiPNQjwp HTTP/1.1", upstream: "fastcgi://unix:/var/lib/php7.0-fpm/web3.sock:", host: "example.com", referrer: "http://example.com/"
Run Code Online (Sandbox Code Playgroud)
这是我的配置文件:
[www]
user = …Run Code Online (Sandbox Code Playgroud)