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

Mav*_*ick 1 https nginx express pm2 nginx-reverse-proxy

我是 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;
    }

    }
Run Code Online (Sandbox Code Playgroud)

我运行了netstat -napl | grep 3000,我可以确认该进程正在运行,并且pm2 status还表明它正在运行并且日志中也没有错误。我怎样才能做到这一点?我在这里先向您的帮助表示感谢。

Ell*_*urn 5

您将无法使用 nginx 以及您的节点进程来侦听端口 3000,因为只有一个服务可以真正同时侦听该端口。因此,您需要确保 nginx 正在侦听不同端口上的连接。我想您想要做的是侦听端口 80 / 443,然后将请求发送到正在侦听端口 3000 的 Express 服务上?

在这种情况下,您的底部服务器块几乎是正确的。要在没有 TLS/SSL 的情况下(仅在端口 80 上)实现此功能,您需要使用如下内容:

server {
       listen 80;
       server_name node.mysite.co

       location / {
            proxy_pass http://localhost:3000;
       }
}
Run Code Online (Sandbox Code Playgroud)

以下是一个非常基本的示例,您可能需要切换一些其他设置。这将使“ 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;
       }
}
Run Code Online (Sandbox Code Playgroud)

您需要替换证书和密钥路径以分别指向您的 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 专家,但过去几年我已经将它用于我的所有节点项目,并且我发现这个设置非常清晰。您可能可以使用一些更好的语法。