環境描述
Nginx 版本 1.10.2
PHP 版本 7.0.12
Node 版本 5.9.0
本文是想講一個 Nginx 的錯誤,為啥還要提及 PHP 和 Node 的版本呢?容我先還原一下應用場景
首先就是我有一個綁定在 3000 端口的 Node Server
我需要從 80 端口直接訪問這個服務,所以我使用了 Nginx 的反向代理
而至於 PHP ,其實這個錯誤就是與它有關
查找錯誤原因
當我使用這個 Node Server 的時候,返回了一個 502 Bad Gateway 錯誤
查看網絡請求,也沒有什么錯誤,接着就查看了 Nginx error log 里的錯誤信息
[error] 17028#0: *111 upstream prematurely closed connection while reading response header from upstream
好吧,並不是什么明顯的錯誤提示,只好到 Google 查查看了
查了一番似乎也挺多人遇到這個問題的,但是解決問題的方法好像都不一樣。。。
有的說是 keepalive_timeout 值太小了 (這個值我根據服務配置,已經改成 600,感覺不太可能),還有說重啟 Nginx 就行了 (嘗試過。),等等。。。
當然也有讓我眼前一亮的答案,那就是 重啟 php-fpm ,果斷嘗試一下
果然。。。啟動報錯了,提示大概意思是端口被占用了,瞬間感覺好像找對了突破口
解決錯誤
看了一下端口才發現,原來是之前已經開啟了另外一個 Node Server 占用了 php-fpm 默認的 9000 端口
簡直是自己坑自己!
因為服務的端口不能改,要和其它同事的統一,所以我把 php-fpm 的端口改成了 9999
PHP 是使用 brew 安裝的,配置路徑為: /usr/local/etc/php/7.0/php-fpm.d/www.conf
listen = 127.0.0.1:9999
然后重啟 php-fpm 就 OK 了