我一直在研究这个问题,但找不到明确的答案。我真的想在部署到生产环境之前掌握这一点,而我发现的大多数 nginx 资源都不能清楚地解释 nginx 在向代理提供流量时背后发生了什么。
基本上,我试图加密从 nginx 到客户端的请求,以及从 nginx 到其后面的代理服务器的请求。在阅读并遵循示例后,我想出了一个似乎有效的配置。至少在客户端通过 SSL 接收请求的情况下有效。
我的问题是,我最初担心的双向加密流量是否实际上是通过以下配置实现的,或者从 nginx 到代理服务器的连接是否仍然通过 http 而不是 https:
upstream app1 {
server app1:3000;
}
upstream app2 {
server app2:5000;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name localhost;
ssl_certificate /etc/ssl/localhost-cert.crt;
ssl_certificate_key /etc/ssl/localhost-privkey.key;
ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://app1;
}
location /api {
proxy_pass http://app2;
}
}
如果从 nginx 到代理服务器的连接仍然是纯文本,我该如何从 nginx 而不是从应用服务器本身加密这些数据?
答案1
您的配置使用纯 HTTP 来联系后端服务器,为了保护此路径,您也需要在此部分使用 https。有一篇关于如何实现这一点的完美文章官方文件