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

nginx несколько прокси-доменов http / https

У меня есть сервер, на котором будет размещаться много сайтов, но сейчас их всего два. site1 (http://site1.com) - это http, а site2 (https://site2.com) - https. Оба этих сайта основаны на node.js и работают с разными портами, и я использую proxy_pass nginx для маршрутизации домена на порт.

Проблема, с которой я столкнулся прямо сейчас, заключается в том, что вы можете перейти к https://site1.com но он загружает сайт для site2 как https://site1.com. Очевидно, это нехорошо, так как Google проиндексировал https-страницы не в том домене.

Я еще не очень хорошо разбираюсь в nginx, но моя текущая конфигурация должна указывать на маршрутизацию всего https-трафика на этот порт. В будущем у меня будет несколько сайтов https и http, и, очевидно, весь трафик должен правильно маршрутизироваться.

Может ли кто-нибудь взглянуть на мою конфигурацию и научить меня тому, что я здесь делаю не так?

Мой файл nginx.conf по умолчанию

вот мой http://site1.com config

server
{
    listen 80;
    listen [::]:80;
    server_name site1.com www.site1.com;

    location /
    {
        proxy_pass http://127.0.0.1:3103;
        include /etc/nginx/proxy_params;
    }
}

и вот мой https://site2.com config

server {
  listen 80;
  listen [::]:80;
  server_name site2.com www.site2.com;
  return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name site2.com;

        ssl_certificate       /etc/nginx/ssl/site2_com.crt;
        ssl_certificate_key   /etc/nginx/ssl/site2_com.key;

        location / {
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto $scheme;

                proxy_pass              "http://127.0.0.1:3101";

                # rewrite redirects to http as to https
                proxy_redirect http:// https://;
        }
}

Любые советы и вопросы приветствуются! Дайте мне знать, если вам понадобится больше контекста. Спасибо!

У Nginx всегда есть сервер по умолчанию, который он использует для обработки запросов, где server_name не совпадает. Если вы не укажете его явно, используя default_server атрибут, он выберет первый с совпадающим listen директива.

В вашем случае server блок для site2 используется для обработки любых https соединение, хотя и с предупреждением о недействительном сертификате.

Вы можете определить «поймать всех» server блок, так что server_name должен соответствовать каждому из ваших законных server блоки.

Например:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    return 444;
}

Он будет работать нормально для http соединения. Тем не мение, https соединения всегда проблематичны, так как нельзя ожидать наличия действительных сертификатов для каждого фиктивного доменного имени, указывающего на ваш сервер. Это как минимум предотвратит обработку запроса неправильным серверным блоком.

Видеть этот документ для подробностей.