簡體   English   中英

如何在 Nginx 上監聽不同的端口並代理請求?

[英]How to listen to different port on Nginx and proxy the request?

我是 Nginx 配置的新手,我有一個進程,它是一個快速應用程序,使用 pm2 在端口 3000 上運行,我也使用 ufw 允許端口 3000,並在 Nginx 上創建了一個服務器實例來代理它,

    server {
        # SSL configuration

        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name .mysite.co;
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/django/mysite;
        }
        proxy_cache mysite;
        location / {
            include proxy_params;
            proxy_pass http://unix:/home/django/mysite/mysite.sock;
        }
        gzip_comp_level  3;
        gzip_types       text/plain text/css image/*;
        ssl_certificate /etc/letsencrypt/live/mysite.co/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/mysite.co/privkey.pem; # managed by Certbot



    }
    server {
        if ($host = www.mysite.co) {
            return 301 https://$host$request_uri;
        } # managed by Certbot


        if ($host = mysite.co) {
            return 301 https://$host$request_uri;
        } # managed by Certbot


        listen 80 default_server;
        listen [::]:80 default_server;
        server_name .mysite.co;
        return 404; # managed by Certbot




    }

server{

    listen 3000;
    listen 443 ssl http2;
    server_name .mysite.co:3000;

    location / {
        proxy_pass https://localhost:3000;
    }

    }

我跑了netstat -napl | grep 3000 netstat -napl | grep 3000 ,我可以確認該進程正在運行,並且pm2 status也表示它正在運行並且日志中也沒有錯誤。 我怎么能讓這個工作? 我在這里先向您的幫助表示感謝。

您將無法使用 nginx 偵聽端口 3000 以及您的節點進程,因為一次只有一項服務可以真正偵聽該端口。 因此,您需要確保 nginx 正在偵聽不同端口上的連接。 我想您想要做的是偵聽端口 80 / 443,然后將請求發送到偵聽端口 3000 的快遞服務上?

在這種情況下,您的底部服務器塊幾乎是正確的。 要在沒有 TLS/SSL 的情況下(僅在端口 80)下工作,您需要使用以下內容:

server {
       listen 80;
       server_name node.mysite.co

       location / {
            proxy_pass http://localhost:3000;
       }
}

以下是一個非常基本的示例,您可能想要切換一些其他設置。 這將使“ http://node.mysite.co ”代理通過本地偵聽端口 3000 的任何服務(在本例中為 Express 服務器)。

在這種情況下,您不需要為端口 3000 設置防火牆 (ufw) 例外,因為它是本地代理通道。 你應該關閉防火牆上的端口,這樣人們就不能直接訪問它,這樣必須通過 nginx。

如果您想讓 SSL/TLS 正常工作,您需要另一個類似於以下內容的塊。 同樣,這是非常基本的,沒有很多您可能想要研究和設置的設置(例如密碼選擇)。

server {
       listen 443 ssl;
       server_name node.mysite.co

       ssl_certificate certs/mysite/server.crt;
       ssl_certificate_key certs/mysite/server.key;

       location / {
            proxy_pass http://localhost:3000;
       }
}

您需要替換證書和密鑰路徑以分別指向您的 SSL/TLS 證書和密鑰。 這將使您能夠訪問https://node.mysite.co並且它也將被代理到端口 3000 上的服務。

完成后,您可能會選擇返回並將 http(端口 80)服務器更改為重定向到 https 以強制僅使用 https 連接。

另請注意,我已確保 server_name 與您現有的帶有子域 (node.mysite.co) 的 django server_name 不同。 您可能希望更改此值,但您不能讓兩個服務器塊偵聽同一個端口和 server_name,否則 nginx 將不知道如何處理請求。 我確定您無論如何都會這樣做,但我想確保它是明確的並且可以與您現有的設置一起使用。

如果您希望該網站僅為 mysite.co:3000 提供服務

如果出於某種原因您希望用戶訪問域 mysite.co 上的端口 3000,那么您需要將“listen”設置為 3000,並將服務器名稱保留為“mysite.co”。 這將允許某人在瀏覽器中訪問 mysite.co:3000 並點擊您的節點服務。 我想這並不是您真正想要的面向公眾的網站,它也不會與您的端口 443 版本很好地對齊。

注意:我並不聲稱自己是 nginx 專家,但在過去幾年中,我將它用於我所有的節點項目,並且我發現此設置非常清楚。 您可以使用一些更好的語法。

暫無
暫無

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

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