我有一个在端口 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 重定向到上游。您当前的配置不起作用的原因可能与某些配置错误有关,从您迄今为止粘贴的代码片段中看不出来。