单前端 NGINX 代理通过 SSL 向具有自己证书的站点传递

单前端 NGINX 代理通过 SSL 向具有自己证书的站点传递

当前设置:

  1. 前端 NGINX 代理将 80 和 443 传递给本地 VM
  2. 本地虚拟机的 NGINX 将所有内容重定向到 HTTPS(如果请求是 HTTP/80)
  3. 本地虚拟机的 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;

相关内容