Nginx 502 Bad Gateway - 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-fpm和nginx:
server:$ sudo service nginx restart * Restarting nginx nginx ...done. server:$ sudo service php5-fpm restart * Restarting PHP5 FastCGI Process Manager php5-fpm ...done.
但是,如果我查看正在監聽哪些埠,我只會看到9002和9003:
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
。