【问题标题】:nginx or node app using ssl使用 ssl 的 nginx 或节点应用程序
【发布时间】:2017-11-29 10:47:09
【问题描述】:

我有 nodejs express 坐在 nginx 后面。目前一切正常。我用 SSL 实现了 Nginx 以利用 https,然后它简单地将请求转发到指定端口上正在运行的节点应用程序。我想知道这是否是最好的方法?这是我目前拥有的...

server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name mysite.somethingelse.com www.mysite.somethingelse.*;
    ssl_certificate /path/to/my/cert.pem;
    ssl_certificate_key /path/to/my/key.key;
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

如果我只是在 express 端实现一个 https 服务器会怎样?然后将请求代理到那个,然后让它完成所有的解码?像这样的:

server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    server_name mysite.somethingelse.com www.mysite.somethingelse.*;
    location / {
        proxy_pass https://localhost:3000;
        proxy_http_version 1.1;
        proxy_cert path/to/cert.pem
        proxy_key path/to/key.key
    }
}

第二个版本可能甚至不正确。但我要做的是在节点应用程序上实现 SSL,而不是让 nginx 来做。

  1. 我能从做一个和另一个中得到什么吗?
  2. 这里的最佳做法是什么...让 nginx 或节点应用程序执行此操作?
  3. 而且,假设最好在节点应用程序上执行此操作,那么此处设置 nginx 的正确实现是什么?

谢谢!

【问题讨论】:

  • AFAIK nginx 无法进行 SSL 路径通过。
  • stackoverflow.com/a/39701582/1497533(你使用location /但是如果你不先解密请求,nginx怎么知道请求的位置?)
  • 感谢你们的反馈!!

标签: node.js ssl nginx


【解决方案1】:

如果您追求性能并要在多个节点实例之间实现负载平衡,最好在独立机器上终止 SSL。但是,如果您要运行 node 应用程序的单个实例并且预计负载不高,那么在 node.js 中设置 SSL 可能更简单。另外我建议您不要使用 nginx 并切换到 NAT(使用防火墙),因为这种方法将使用更少的资源。

另一个支持在 nginx 上终止 SSL 的论据是文档和配置最佳实践。您应该知道,配置 SSL 不仅仅是设置证书和私钥,还涉及到许多关于不同密码、协议和漏洞的安全考虑。与 node 相比,nginx 更容易找到可行的解决方案、提示和配置示例。

所以关于你的问题:

  1. 这取决于您的目标。
  2. 这取决于您的目标,但我建议您目前使用 nginx 进行 SSL 终止。
  3. 在这种情况下,我建议您实施 NAT 而不是 nginx。

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2019-10-21
    • 2017-01-27
    • 1970-01-01
    • 2021-08-09
    • 2016-08-25
    相关资源
    最近更新 更多