我有一个 Nginx 服务器处理 http 请求并做代理传递到上游的一些 Node 服务器,如果域名匹配启用的站点之一,所有数据包都被重定向到一个 Node 服务器,只有 channel 是 SSL,否则 301到 https 版本:
server {
listen 80;
server_name something.com
return 301 https://$host$request_uri;
}
server {
listen 433;
server_name something.com;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:3000/;
proxy_redirect off;
}
}
一切正常,但证书管理、SSL 握手等是由 Nginx 完成的。我希望每个 Node 服务器都在上游管理它们自己的 SSL 首选项,因此我不依赖 Nginx 来执行此操作。我的 Node 服务器已经支持 https 请求,但我不明白是否可以告诉 Nginx:
- 听 80,如果出现问题,则对它的 https 版本执行 301。
听 433,不用担心 SSL,只需代理将所有内容传递给 localhost:3000
并且监听3000端口的 Node 服务器处理SSL
最佳答案
Listen to 433, don't worry for SSL, just proxy pass everything to localhost:3000
不,不是 nginx,你必须为此使用端口转发。
nginx 要么必须使用一些 SSL key 并可能使用 SSL 将流量代理到某些 Node 应用程序,这将意味着 Node 和 nginx 都必须管理他们自己的 SSL key (nginx 用于客户端-nginx 连接和 Node用于 nginx-nodeApp 连接的应用程序)。
或者 nginx 可以使用不带 SSL 的 HTTP 将请求代理到使用 SSL 的 Node ,这将意味着客户端-nginx 连接不安全,只有 nginx-NodeApp 连接是安全的。这也意味着 https://www.example.com/不会工作 - 尽管 http://www.example.com:443/会的。
如果您希望 Node 处理 SSL key 而不是反向代理(通常这样做),那么您必须在 TCP/IP 级别使用端口转发将流量传递到 Node 应用程序,而无需使用完全没有反向代理 (nginx)。
通常使用反向代理,这样应用程序就不必处理用于客户端连接(以及其他事项)的 SSL key 。如果您希望 Node 应用程序使用 SSL key 而不是反向代理,那么您应该首先重新考虑使用反向代理。
关于node.js - 是否可以让上游服务器在 Nginx 服务器后面处理 SSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44948527/