Nginx 502 错误网关 - 111:连接被拒绝,端口未被监听

Nginx 502 错误网关 - 111:连接被拒绝,端口未被监听

我知道还有很多其他类似的问题,但我觉得我已经找到这些问题的解决方案了。

我在 VirtualBox Ubuntu 12.04.4 LTS 服务器上本地运行了 3 个站点,我使用的是 nginx 和 php-fpm。

它们配置为在端口 9001 -> 9003 上运行:

server:/etc/php5/fpm/pool.d$ grep 900 *
my-app-deploy.conf:listen = 127.0.0.1:9002
my-app-dev.conf:listen = 127.0.0.1:9001
my-web.conf:listen = 127.0.0.1:9003

server:/etc/nginx/conf.d$ grep 900 *
my-app-deploy.conf:                fastcgi_pass   127.0.0.1:9002;
my-app-dev.conf:                fastcgi_pass   127.0.0.1:9001;
my-app-web.conf:                fastcgi_pass   127.0.0.1:9003;

我已经重启了php-fpmnginx成功地:

server:$ sudo service nginx restart
 * Restarting nginx nginx
   ...done.
server:$ sudo service php5-fpm restart
 * Restarting PHP5 FastCGI Process Manager php5-fpm
   ...done.

但如果我查看正在监听的端口,我只会看到90029003

server:$ sudo lsof -i | grep 900
php5-fpm  1020     root    7u  IPv4   8557      0t0  TCP localhost:9002 (LISTEN)
php5-fpm  1020     root    8u  IPv4   8558      0t0  TCP localhost:9003 (LISTEN)
php5-fpm  1021 www-data    0u  IPv4   8557      0t0  TCP localhost:9002 (LISTEN)
php5-fpm  1022 www-data    0u  IPv4   8557      0t0  TCP localhost:9002 (LISTEN)
php5-fpm  1023 www-data    0u  IPv4   8557      0t0  TCP localhost:9002 (LISTEN)
php5-fpm  1024 www-data    0u  IPv4   8557      0t0  TCP localhost:9002 (LISTEN)
php5-fpm  1025 www-data    0u  IPv4   8558      0t0  TCP localhost:9003 (LISTEN)
php5-fpm  1026 www-data    0u  IPv4   8558      0t0  TCP localhost:9003 (LISTEN)
php5-fpm  1027 www-data    0u  IPv4   8558      0t0  TCP localhost:9003 (LISTEN)
php5-fpm  1028 www-data    0u  IPv4   8558      0t0  TCP localhost:9003 (LISTEN)

我收到以下错误nginx

server:~/vhosts/my-app/logs$ tail -n 1 nginx/error.log 
2014/06/20 11:07:36 [error] 2434#0: *4 connect() failed 
    (111: Connection refused) while connecting to upstream, client: 192.168.0.10,
    server: my.app.dev, request: "GET /api/test.php HTTP/1.1", upstream:
    "fastcgi://127.0.0.1:9001", host: "my.app.dev"

我希望我只是错过了一些非常基本的东西,但当我在9002我不记得除了向会议文件

更新站点根目录实际上正在提供服务,它只是api/测试.php返回 502 的页面

更新我移动了端口,交换了 web 和 dev,所以 dev 现在位于 9001 端口,但这并没有什么区别。我已更新问题以反映这一点。

所有 3 个端口都在提供内容 - 我认为这与我为 API 部分设置的重定向有关。

以下是开发和部署 PHP 和 nginx 配置之间的差异:

server:/etc/nginx/conf.d$ diff my-app-dev.conf my-app-deploy.conf 
3c3
<         server_name my.app.dev;
---
>         server_name my.app.deploy;
10c10
<         root /var/www/vhosts/my-app/public_html/mobile;
---
>         root /var/www/vhosts/my-app/public_html/mobile_deploy;
47c47
<                 fastcgi_pass   127.0.0.1:9001;
---
>                 fastcgi_pass   127.0.0.1:9002;

server:/etc/php5/fpm/pool.d$ diff my-app-dev.conf my-app-deploy.conf
33c33
< listen = 127.0.0.1:9001
---
> listen = 127.0.0.1:9002
384c384
< php_admin_value[doc_root] = /var/www/vhosts/my-app/public_html/mobile
---
> php_admin_value[doc_root] = /var/www/vhosts/my-app/public_html/mobile_deploy

这是开发站点的完整配置文件,在端口 9001 上,它给了我 502

server {
        listen 80;
        server_name my.app.dev;

        error_log  /var/www/vhosts/logs/my-app/nginx/error.log;
        access_log /var/www/vhosts/logs/my-app/nginx/access.log  main;

        error_page 404 /404;

        root /var/www/vhosts/my-app/public_html/mobile;
        index index.html index.php;

        client_max_body_size 10M;

        proxy_read_timeout 180s;

        # deny any attempt to access hidden files
        location ~ /\. { deny all; }

        # disable logging for favicon
        location = /favicon.ico {
                log_not_found off;
        }

        location ~* \/api\/[0-9]\/.*\.zip {
                try_files $uri /api/3/nomarket.data.zip;
        }

        location ~* \/api\/picture\/[a-z]+\/? {
                if (!-e $request_filename) {
                        rewrite ^/api/picture/([a-z]+)/? /api/picture.php?type=$1 last; break;
                }
        }

        location /api {
                if (!-e $request_filename) {
                        rewrite ^/api/(.*)$ /api/router.php?rest_data=$1 last; break;
                }
        }

         # allow php files to be executed
        location ~ \.php$ {
                # only call php if the file exists. Very important for security!
                try_files  $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass   127.0.0.1:9001;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_index  index.php;
        }

        # just serve static files, please.
        location / { }
}

答案1

您的 lsof 输出看起来相当确定,php-fpm 没有监听端口 9001(尽管您可能希望使用sudo netstat -plnt更简洁且生成速度更快的列表)。

那么问题可能出在 php-fpm 上。我建议你暂时忘掉 nginx,然后使用它telnet localhost 9001进行调试。我预计你会看到连接失败。一旦你可以建立连接,就重新使用 nginx。

我猜测要么是您在端口 9001 上的站点存在配置问题,要么是 php-fpm 由于某种原因无法绑定到该端口。

无论如何,我首先要查找的是启动时来自 php-fpm 的日志条目。您可能需要启用这些日志。请参阅此问题: 如何配置php-fpm将日志记录到nginx虚拟主机中配置的日志文件

这些配置文件的差异看起来足够直观。也许可以检查这些行上的控制字符(例如,Windows 样式的行尾可能会在某些工作实践中出现)。此外,请记住检查文件权限以及文件内容的差异。

如果问题与端口绑定有关,那么使用其他端口可能会改变行为。值得一试,即使只是为了排除这种情况。您还可以查看 strace 输出,看看当 fpm 尝试绑定端口 9001 时会发生什么。例如strace -p [pid] | grep -n 10 9001

答案2

PHP FPM 池名称

从 diff 来看,似乎您在 中重复了 PHP 池名称/etc/php-fpm.d。我非常确定只有最后加载的配置文件才会生效。

因此,如果池名称重复,则只有最后加载的名称/端口对才会启动。

查看您的数据,可能my-app-dev.confmy-app-deploy.conf共享相同的池名称,因为它未显示在中diff。因此,这些池中只有一个有效。

我建议仔细检查你的 php 池名称。

相关内容