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

Express 如何侦听Nginx上的不同端口并代理请求?,express,nginx,https,pm2,nginx-reverse-proxy,Express,Nginx,Https,Pm2,Nginx Reverse Proxy,我是Nginx config的新手,我有一个进程,它是一个express应用程序,使用pm2在端口3000上运行,我也允许端口3000使用ufw,并在Nginx上创建了一个服务器实例来代理它 server { # SSL configuration listen 443 ssl http2; listen [::]:443 ssl http2; server_name .mysite.co; locatio

我是Nginx config的新手,我有一个进程,它是一个express应用程序,使用pm2在端口3000上运行,我也允许端口3000使用ufw,并在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 | grep3000
,我可以确认进程正在运行,
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;
       }
}
下面是一个非常基本的示例,您可能需要切换一些其他设置。这将使“”通过代理到达任何正在本地侦听端口3000的服务(在本例中为Express服务器)

在这种情况下,不需要为端口3000设置防火墙(ufw)例外,因为它是本地代理传递。您应该关闭防火墙上的端口,这样人们就不能直接访问它,这样必须通过nginx。

如果您想让SSL/TLS正常工作,您将需要另一个类似以下内容的块。同样,这是非常基本的,并且没有很多您可能想要研究和设置的设置(例如密码选择)

您需要替换证书和密钥路径,以分别指向SSL/TLS证书和密钥。这将使您能够访问,并将其代理到端口3000上的服务

完成后,您可以选择返回并将http(端口80)服务器更改为重定向到https以强制仅https连接

还要注意的是,我已经确保服务器名称不同于您现有的django服务器名称,它有一个子域(node.mysite.co)。您可能希望更改此值,但不能让两个服务器块监听同一端口和服务器名称,否则nginx将不知道如何处理该请求。我确信你无论如何都在这样做,但我想确保它是明确的,并且可以与你现有的设置一起工作

如果您希望仅为mysite.co提供网站服务:3000

如果出于某种原因,您希望用户转到域mysite.co上的端口3000,那么您需要将“listen”设置为3000,并将服务器名称保留为“mysite.co”。这将允许用户在浏览器中访问mysite.co:3000并点击您的节点服务。我想这并不是你想要的一个面向公众的网站,但它也不会很好地符合你的端口443版本


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

谢谢你的评论,我确实按照你建议的方式添加了一个子域,但https不起作用,浏览器认为它不安全,尽管我使用的证书与我在主站点使用的证书相同。如果你看我的配置,会有什么问题?@Maverick-Cool,这应该是一个很容易解决的问题。如果你检查你的证书,它很可能是发给像“mysite.co”这样的人的。您需要一个通配符Certifcate来覆盖整个域+子域,或者子域需要一个新的证书。如果您使用的是LetsEncrypt工具之类的工具,我建议如果您没有运行具有许多不同微服务的大型应用程序,就为子域创建一个新的证书和密钥。如果答案正确,您介意将其标记为正确吗?这个问题现在只是一个证书/密钥问题,但我相信我们仍然可以为您解决。不,它很好,我重新生成了证书并包含了该子域,也可以为通配符解决,但它现在可以工作了,谢谢:)
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;
       }
}