使用 nginx 運行 Node.js 應用程式

使用 nginx 運行 Node.js 應用程式

我有一個節點應用程式在連接埠 8443 上運行。

這是我的/etc/nginx/sites-enabled/default配置:

upstream my_upstream {
   server 127.0.0.1:8443;
   keepalive 64;
}

server {
    listen 80;
    server_name myapp.com;
    rewrite ^/(.*) https://myapp.com/$1 permanent;
}

server {
    listen 443 ssl;
    server_name 12.34.12.34 www.myapp.com myapp.com *.myapp.com;
    ssl_certificate /path/to/my/cert.crt;
    ssl_certificate_key /path/to/my/private.key
    // other ssl params

    location / {
        proxy_redirect off;
        proxy_pass https://my_upstream;
        // other params 
    }
}

透過此配置,我可以透過以下方式存取我的應用程式

http(s)://myapp.com:8443

只有當我添加以下 iptables 時

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
iptables -t nat -A OUTPUT -p tcp --dport 443 -o lo -j REDIRECT --to-port 8443

我可以訪問

http(s)://myapp.com

問題:

使用 iptables 從連接埠 80 重定向到 443 到 8443 對我來說似乎有點愚蠢。有沒有辦法只用 nginx 來做到這一點(或者這是可行的方法?)。

這種方法(在非標準連接埠(如 8443)上運行應用程式)是一個好主意嗎?

答案1

簡單的。由於您的node.js在連接埠8443上運行,並且據我了解,您沒有任何其他服務偵聽其他連接埠中的請求,因此您可以簡單地在nginx配置中執行此操作:

server {
    # here comes the rest of your nginx configuration
    location / {
        proxy_pass http://127.0.0.1:8443;
    }
}

您不必使用任何 iptables 規則,也不必在 nginx 設定中建立上游部分。 nginx 可以(並且應該)開箱即用地執行所有連接埠重新導向(就像任何反向代理通常所做的那樣)。

我可能是錯的,但你的應用程式在 iptables 規則之後開始工作的原因是因為你的客戶端開始直接存取你的 node.js 伺服器,因為連接埠重定向,這類似於我們使用 Squid 作為透明代理。

這篇文章可以幫助你。忽略它是發給 Apache 的事實:

祝你好運並致以誠摯的問候!

答案2

127.0.0.1當你的上游運行127.0.0.1在.

如果有的話,您的重定向解決方案iptables實際上比簡單地將 nginx 加入其中而不需要對上游進行任何更改更有效。

但我們必須問——如果您沒有使用 nginx 任何額外的酷功能,為什麼首先要將它添加到組合中?

正確的方法是在沒有 的情況下運行上游https,並使用 nginx 將 http 和 https 重定向到上游。您目前的配置不起作用的原因可能與某些配置錯誤有關,從您迄今為止貼上的程式碼片段來看,這一點並不明顯。

相關內容