簡體   English   中英

可在 nginx 反向代理后面的端口 3000 上訪問 nodejs 應用程序

[英]nodejs app accessible on port 3000 behind nginx reverse proxy

我正在運行一個帶有 nodejs 應用程序的 nodejs 應用程序,一個服務器偵聽端口 3000。我使用 nginx 作為反向代理,它也處理 ssl。 下面列出了配置(在閱讀了幾個教程和論壇帖子后,我認為它非常標准)。 一切都按預期工作,除了我仍然能夠在“ http://example.com:3000 ”下訪問該應用程序。 這是否意味着我需要添加另一個服務器偵聽端口 3000 以重定向到 https? 這可能意味着我到目前為止閱讀的教程有些不完整,或者我忽略了一些基本的東西。 誰能幫我弄清楚它是什么?

 # app server upstream

upstream app {
    server 127.0.0.1:3000;
}

# default http server. Redirect to https server

server {
    listen 80;
    server_name www.example.com example.com;
    return 301 https://example.com$request_uri;  
}

# https server

server {
    listen 443;
    server_name www.example.com example.com;

    ssl on;
    ssl_certificate ssl.crt;
    ssl_certificate_key ssl.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://app;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;   
    }
}   

如果您可以從計算機外部訪問端口 3000,這意味着您以 HTTP 服務器偵聽所有接口的方式編寫 Node.js 應用程序。 這本身並不壞,默認情況下,您應該以這種方式對應用程序進行編程,因為您無法預測最終部署拓撲的未來變化。 按照 Oxi 的建議,將向外界隱藏端口的責任留給防火牆(這里想到的是 iptables)。

通過這種方式,您將來無需更改代碼以使其適應不同的部署拓撲。

例如,我有一個類似的案例。 我使用 Haproxy 作為負載平衡器和 SSL 終止。 但就我而言,出於性能考慮,Haproxy 實例運行在不同的主機上。 如果在開發階段我限制我的應用程序只偵聽本地連接,那么我將不得不在開發時更新我的​​代碼以適應新的拓撲結構。

我希望這可以幫助你。

配置 Nginx 綁定到節點運行的端口會拋出錯誤:

$ nginx: [emerg] bind() to 0.0.0.0:3000 failed (98: Address already in use)

這是因為多個服務不能綁定同一個端口。 哪個負責處理該請求?

您可以改為綁定您的節點腳本以偵聽特定 IP 地址。 如果您將節點腳本綁定到本地接口 IP (127.0.0.1) 而不是所有 IP,您可以有效地阻止 Node 在 Node 端口(例如 3000)上接受外部連接。

你可能已經在做這樣的事情了,

const server = app.listen(port)

試試這個

const server = app.listen(port, '127.0.0.1')

我正在使用這個解決方案,Nginx 作為代理在端口 443 上運行。Nginx 仍然可以連接到 Node 服務,同時阻止它接受來自外部請求的連接; 有效阻止http://example.com:3000 上的請求

你也可以用 iptables 解決這個問題。

使用 iptables,您有兩種方法; 阻止一切,然后只打開內部接口。 您還可以重定向請求,例如。 從 3000 到 443(或 80),這是一個有趣的想法。

我沒有親自測試過這些,所以考慮一下它們的理論例子。 也許有人有一個經過驗證的例子?

iptables -A INPUT -p tcp --dport 3000 -j DROP
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 3000 -j ACCEPT

或者

iptables -A OUTPUT -o lo -p tcp -m tcp --dport 3000 -j REDIRECT --to-ports 443

暫無
暫無

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

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