使用 nginx 运行 node.js 应用程序

使用 nginx 运行 node.js 应用程序

我有一个在端口 8443 上运行的节点应用程序。我的 nginx 处理端口 80 和 443 上的 Web 请求,并将用户重定向到 8443。

这是我的/etc/nginx/sites-enabled/default配置:

upstream my_upstream {
   server 127.0.0.1:8443;
   keepalive 64;
}

server {
    listen 80;
    server_name myapp.com;
    rewrite ^/(.*) https://myapp.com/$1 permanent;
}

server {
    listen 443 ssl;
    server_name 12.34.12.34 www.myapp.com myapp.com *.myapp.com;
    ssl_certificate /path/to/my/cert.crt;
    ssl_certificate_key /path/to/my/private.key
    // other ssl params

    location / {
        proxy_redirect off;
        proxy_pass https://my_upstream;
        // other params 
    }
}

有了这个配置我可以通过以下方式访问我的应用程序

http(s)://myapp.com:8443

仅当我添加以下 iptables

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
iptables -t nat -A OUTPUT -p tcp --dport 443 -o lo -j REDIRECT --to-port 8443

我可以访问

http(s)://myapp.com

问题:

我觉得使用 iptables 将端口 80 重定向到 443 再重定向到 8443 有点愚蠢。有没有办法只使用 nginx 来做到这一点(或者这是可行的方法?)。

这种方法(将应用程序放在非标准端口(如 8443)上)是一个好主意吗?

答案1

简单。由于您的 node.js 在端口 8443 上运行,并且据我所知,您没有其他服务监听其他端口的请求,因此您只需在 nginx 配置中执行以下操作:

server {
    # here comes the rest of your nginx configuration
    location / {
        proxy_pass http://127.0.0.1:8443;
    }
}

您不必使用任何 iptables 规则,也不必在 nginx 配置中创建上游部分。nginx 可以(并且应该)开箱即用地执行所有端口重定向(任何反向代理通常都会这样做)。

我可能错了,但您的应用程序在 iptables 规则之后开始工作的原因是因为您的客户端开始直接访问您的 node.js 服务器,因为端口重定向,这类似于我们使用 Squid 作为透明代理时的情况。

本文可以帮到你。忽略它是发给 Apache 的事实:

祝你好运!致以最诚挚的问候!

答案2

127.0.0.1当你的上游正在运行时,在 nginx 和你的上游之间进行加密是有点无意义和浪费的127.0.0.1

不管怎样,使用iptables重定向的解决方案实际上比简单地将 nginx 加入混合要有效得多,而且不需要对上游进行任何更改。

但是我们必须问——如果您没有使用 nginx 的任何额外酷炫功能,那么为什么首先要将其添加到组合中?

正确的方法是运行没有 的上游https,并使用 nginx 将 http 和 https 重定向到上游。您当前的配置不起作用的原因可能与某些配置错误有关,从您迄今为止粘贴的代码片段中看不出来。

相关内容