Назад | Перейти на главную страницу

Единый фронтальный NGINX для прокси-передачи SSL на сайты с собственными сертификатами

Текущая настройка:

  1. Передний прокси-сервер NGINX передает 80 и 443 локальной виртуальной машине
  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;
         }
}

NGINX от Domain1.com:

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). Что мне не хватает? В NGINX imo от Domain1.com не должно быть никаких изменений.

Вы не можете просто объявить «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;