簡體   English   中英

我的服務器在 nginx 代理上運行 Node JS 時出現 502 Bad Gateway 錯誤

[英]502 Bad Gateway error for my server running with Node JS on nginx proxy

我收到 502 bad gateway 錯誤:當我檢查 nginx 錯誤日志時,我發現:

2017/05/06 02:36:04 [錯誤] 48176#0:*135 連接()失敗(111:連接被拒絕),同時連接到上游,客戶端:10.163.XX.X,服務器:abc-def-ghi,請求:“GET /favicon.ico HTTP/1.1”,上游:“ https://127.0.0.1:5300/favicon.ico ”,主機:“hostnname”,引用者:“hostname-1”

我在互聯網上搜索了足夠多但找不到任何東西。 這里要注意的一件事是,此間歇性錯誤僅出現在特定頁面上。

這可能是代碼問題嗎? 或 nginx 配置問題> 任何人都可以在這里幫助我。

我的一些 nginx 配置:

  upstream node_api_server {
    server localhost:5300 fail_timeout=0;
  }

location / {
    proxy_set_header X-Real-IP $remote_addr;
    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_set_header X-NginX-Proxy true;
    proxy_read_timeout 5m;
    proxy_connect_timeout 5m;
    proxy_pass_header Set-Cookie;

    proxy_pass https://node_api_server;
    proxy_redirect off;
    proxy_buffer_size   128k;
    proxy_buffers   4 256k;
    proxy_busy_buffers_size   256k;
    break;
}

502 錯誤通常是由 NGINX 無法將請求傳遞到“上游”引起的,在這種情況下是您的 Node.js 服務器(這也是錯誤消息所暗示的: “連接被拒絕” “)。

它可能會崩潰並重新啟動,因此請檢查其日志文件以查看導致崩潰的原因。

我對這些東西有點菜鳥,但我花了幾個小時試圖調試我的問題。 結果是我的 API 中端口的全局變量沒有被正確分配,所以節點沒有監聽正確的端口。 由於我很少使用這些東西,我寫下了我將來應該如何解決它,並想我會分享。 同樣,這是針對我的 API,所以您可能略有不同(我使用的是端口 3006)。

  • 在任何控制台中,通過運行wget https://example.com/api/v1/ping仔細檢查您是否收到錯誤,或者如果您通過 ssh 進入生產控制台,您可以執行wget 127.0.0.1:3006/api/v1/ping
  • 確保節點正常運行。 在使用npm run build然后npm run start在 pm2 中啟動節點后,確保 pm2 在pm2 status正確運行
  • 使用pm2 logs檢查 pm2 的錯誤pm2 logs 這應該顯示 API 中console.log消息的正常輸出。 它是否說它在正確的端口上運行? 您可以讓您的 api 在啟動時記錄您的端口,以確認它在正確的端口上。 也檢查其他錯誤。 您可以使用pm2 flush pm2 中的所有日志
  • 現在確保您的服務器正在偵聽您指定的端口上的傳入流量sudo netstat -plunt將為您提供打開的端口列表以及正在使用它們的程序。
  • 您可以使用sudo ps aux | grep node獲取有關節點應用程序的更多信息。 sudo ps aux | grep node讓所有 node 程序監聽端口,它會顯示 node 文件路徑的完整路徑。 您可以匹配上一個命令中的 PID 以確保您的端口匹配。
  • 檢查 nginx 的狀態以確保它正在運行: sudo systemctl nginx status或用 start 替換 status 以啟動它
  • 現在確保您的 nginx 端口正在使用該傳入端口。 使用sudo vim /var/log/nginx/error.log檢查 nginx 錯誤日志以確認您的端口和服務器名稱正確。 每次您向服務器發送命令時,它都會在此處記錄 502 錯誤並帶有錯誤消息: 2021/02/20 03:05:28 [error] 26646#26646: *644 connect() failed (111: Connection refused) while connecting to upstream, client: XXX.XXX.XXX.XX, server:example.com, request: "GET /api/v1/ping HTTP/1.1", upstream: "http://127.0.0.1:3006/api/v1/ping", host: "example.com"
  • 您可以通過執行sudo nginx -t檢查 nginx 配置文件的狀態以確保配置中沒有任何錯誤
  • 檢查/etc/nginx/nginx.config的 Nginx 配置文件。 該文件可能包含sites-enabled/default配置文件。 還要注意檢查sites-available/default配置文件,以確保所有端口和服務器名稱都是正確的,並確保沒有重復項(很可能會出現在錯誤日志中)。
  • 對於對配置文件所做的任何更改,您需要使用sudo service nginx restart nginx 系統

希望對你們中的一些人有所幫助! :) 快樂編碼

由於路徑在 require 調用中沒有正確的大小寫,我們得到了 502,在這種情況下是文件名。 代碼在本地(在 VS Code 中)執行,但在部署時不執行。

const repoName = require('../data/reponame'); //這應該是repoName

就我而言,我收到了同樣的錯誤,但是當我檢查 ingress-nginx 的日志時。 我找到了這個

upstream sent too big header while reading response header from upstream,
 client: xxx.xxx.xxx.xx, server: sample-site.domain, request:

為了克服這個問題,我只是增加了節點的--max-http-header-size 我能夠解決我的問題。

簡單的技巧:殺死您的 nginx 進程並重新啟動您的 UI

確保您正在運行npm start或運行應用程序的腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM