【问题标题】:How to listen to different port on Nginx and proxy the request?如何监听 Nginx 上的不同端口并代理请求?
【发布时间】:2019-05-05 15:32:54
【问题描述】:

我是 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 也表示它正在运行并且日志中也没有错误。 我怎样才能使这项工作?提前感谢您的帮助。

【问题讨论】:

    标签: express nginx https pm2 nginx-reverse-proxy


    【解决方案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,那么您需要将“侦听”设置为 3000,并将服务器名称保持为“mysite.co”。这将允许某人在他们的浏览器中访问 mysite.co:3000 并点击您的节点服务。我想这并不是您真正想要的面向公众的网站,它也不会与您的端口 443 版本很好地对齐。

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

    【讨论】:

    • 感谢您的评论,我确实按照您建议的方式添加了一个子域,但是 https 不起作用,浏览器认为它不安全,尽管我使用的证书与我用于主站点,如果您查看我的配置,可能有什么问题?
    • @Maverick - 很酷,这应该是一个容易解决的问题。如果您检查您的证书,它可能会颁发给“mysite.co”之类的东西。您需要一个通配符证书来覆盖整个域 + 子域,或者一个新的子域证书。如果您使用的是 LetsEncrypt 工具之类的工具,如果您没有运行具有许多不同微服务的某种大型应用程序,我建议您只为子域创建一个新证书和密钥。
    • 如果答案是正确的,您介意将其标记为正确吗?这个问题现在只是一个证书/密钥问题,但我确信我们仍然可以为您解决它。
    • 不,没关系,我重新生成了证书并包含了该子域,也可以使用通配符,但现在可以了,谢谢 :)
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多