Ubuntu

Nginx 502 Bad Gateway - 111:連接被拒絕,埠未被監聽

  • July 1, 2014

我知道還有許多其他類似的問題,但我覺得我已經有了這些問題的解決方案。

我在 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上添加站點時,除了將新埠號添加到兩個conf文件之外,我不記得必須做任何其他事情

更新站點根目錄實際上正在服務,它只是返回 502的api/test.php頁面

更新我移動了埠,我交換了 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

這是開發站點的完整 conf 文件,在埠 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 / { }
}

您的 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

引用自:https://serverfault.com/questions/606739