如何监听 Nginx 上的不同端口并代理请求?

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

我是 Nginx 配置的新手,我有一个快速应用程序进程,运行 在端口 3000 上使用 pm2,我也允许使用 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 我可以确认该过程是 运行 并且 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 并点击您的节点服务。我想这并不是您真正想要的面向 public 的网站,它也不会与您的端口 443 版本很好地对齐。

注意:我并不自称是 nginx 专家,但在过去几年中我将它用于我所有的节点项目,我发现这个设置非常清晰。您可能可以使用一些更好的语法。