我有一個節點應用程式在連接埠 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 重定向到上游。您目前的配置不起作用的原因可能與某些配置錯誤有關,從您迄今為止貼上的程式碼片段來看,這一點並不明顯。