如何在Nginx上监听其他端口并代理请求?

时间:2018-12-04 08:56:58

标签: express nginx https 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;
    }

    }

我运行了netstat -napl | grep 3000,我可以确认该进程正在运行,pm2 status也表示该进程正在运行,并且日志中也没有错误。 我该如何进行这项工作?感谢您的提前帮助。

1 个答案:

答案 0 :(得分:1)

您将无法使用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专家,但是过去几年我在所有节点项目中都使用了它,并且我发现此设置非常清楚。您可能会使用一些更好的语法。