当前设置:
- 前端 NGINX 代理将 80 和 443 传递给本地 VM
- 本地虚拟机的 NGINX 将所有内容重定向到 HTTPS(如果请求是 HTTP/80)
- 本地虚拟机的 NGINX 监听 443 并将代理传递给上游后端
前端 NGINX:
server {
listen 80;
server_name domain1.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://192.168.0.24;
}
}
Domain1.com 的 NGINX:
upstream unicorn_domain1.com {
server unix:/tmp/unicorn.domain1.com.sock fail_timeout=0;
}
server {
listen 80;
server_name domain1.com;
### REDIRECT EVERYTHING TO HTTPS
return 301 https://domain1.com$request_uri;
}
server {
listen 443 ssl spdy;
listen [::]:443 ssl spdy;
server_name domain1.com localhost;
root /var/www/domain1.com/production/current/public;
spdy_headers_comp 1;
### ALL THE CERT_ CONF HERE
try_files $uri/index.html $uri @unicorn;
location @unicorn {
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-Forwarded-Proto https;
proxy_redirect off;
proxy_pass http://unicorn_domain1.com;
}
### Omitted
}
问题:
Domain1 是本地网络虚拟机。这是当前开放了 443 端口的虚拟机。这意味着目前只有一个站点可以监听 443 端口。添加第二个站点时,这将不起作用。因此,我们需要“前端 NGINX”监听 443 端口,然后代理传递到使用其自身证书的虚拟机。
我尝试过的:
一个看似正常的代理传递配置如下:
server {
listen 80;
listen 443 ssl; # Ensure your certificate is for nginx.domain.com;
server_name domain1.com;
location / {
proxy_pass https://192.168.0.24;
}
}
但这导致我们出现Connection refused
错误(Chrome 消息)。我遗漏了什么?我认为 Domain1.com 的 NGINX 不应该有任何变化。
答案1
你不能只声明“ssl”而不正确设置 SSL。你需要提供证书和私钥。我有一个教程如何使用 Let's Encrypt 实现这一点,或者您可以谷歌搜索“Nginx 如何启用 SSL”并按照初学者教程进行操作。
配置最终看起来应该是这样的
listen 443 ssl http2;
ssl_certificate /var/lib/acme/live/site/fullchain;
ssl_certificate_key /var/lib/acme/live/site/privkey;
# Set up preferred protocols and ciphers. TLS1.2 is required for HTTP/2
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
# This is a cache for SSL connections
ssl_session_cache shared:SSL:2m;
ssl_session_timeout 60m;