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

Nginx обслуживает один и тот же контент для запросов HTTPS в разных доменах.

Я создал экземпляр GitLab на своем сервере, назовем его git.domain1.tld. Когда я подключаюсь к https://git.domain1.tld работает нормально. Однако когда я подключаюсь к https://domain2.tld, он показывает то же содержание, что и https://git.domain1.tld когда на самом деле у меня нет определенного поведения для HTTPS на domain2.tld.

Я не знаю, как назвать это поведение, поэтому у меня возникли проблемы с поиском решений в Интернете.


/etc/nginx/sites-available/domain2.tld:

server {
    listen 80 default_server;
    server_name domain2.tld www.domain2.tld;

    root /srv/domain2.tld/www/;
    index index.php index.html index.htm;

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
                include fastcgi_params;
        }
}

/ и т. д. / nginx / сайты-доступные / gitlab:

# GITLAB
# Maintainer: @yin8086
# App Version: 4.1

# Modified from nginx http version
# Modified from http://blog.phusion.nl/2012/04/21/tutorial-setting-up-gitlab-on-debian-6/

# You need from run openssl to generate the ssl certificate.
# $ sudo openssl req -new -x509 -nodes -days 3560 -out gitlab.crt -keyout gitlab.key
# $ sudo chmod o-r gitlab.key

upstream gitlab {
  server unix:/home/git/gitlab/tmp/sockets/gitlab.socket;
}

# This is a normal HTTP host which redirects all traffic to the HTTPS host.
server {
    listen       80;
    server_name git.domain1.tld;
    server_tokens off;
    root /nowhere;
    rewrite ^ https://git.domain1.tld$request_uri permanent;
}

server {
    listen 443;
    server_name git.domain1.tld;
    server_tokens off;
    root /home/git/gitlab/public;

    ssl on;
    ssl_certificate /etc/nginx/conf/git-unified.crt;
    ssl_certificate_key /etc/nginx/conf/git.key;
    ssl_protocols  SSLv3 TLSv1;
    ssl_ciphers AES:HIGH:!ADH:!MD5;
    ssl_prefer_server_ciphers   on;

    # individual nginx logs for this gitlab vhost
    access_log  /var/log/nginx/gitlab_access.log;
    error_log   /var/log/nginx/gitlab_error.log;

    location / {
        # serve static files from defined root folder;.
        # @gitlab is a named location for the upstream fallback, see below
        try_files $uri $uri/index.html $uri.html @gitlab;
    }

    # if a file, which is not found in the root folder is requested,
    # then the proxy pass the request to the upsteam (gitlab unicorn)
    location @gitlab {
        proxy_read_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
        proxy_connect_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
        proxy_redirect     off;

        proxy_set_header   X-Forwarded-Proto https;
        proxy_set_header   X-Forwarded-Ssl   on;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;

        proxy_pass http://gitlab;
    }
}

Вот как работает SSL без SNI или сертификата UCC. Один IP-адрес на один SSL-сертификат.

Причина в том, что запрашиваемое доменное имя является частью зашифрованного пакета, поэтому nginx / Apache / etc. не знаю, какой веб-сайт обслуживать, пока после расшифровка ... которая выполняется виртуальным хостом по умолчанию для этого домена.

Мне удалось исправить эту проблему с помощью следующей настройки:


/ и т.д. / nginx / сайты-доступные / по умолчанию

server {
    listen [::]:80 default ipv6only=on;
    listen [::]:443 default ipv6only=on;
    ...
}

/etc/nginx/sites-available/domain2.tld

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name domain2.tld www.domain2.tld;
    server_tokens off;
    root /srv/pandamonia.us/www/;

    ssl_certificate /etc/nginx/conf/www-unified.crt;
    ssl_certificate_key /etc/nginx/conf/www.key;
    ssl_protocols  SSLv3 TLSv1;
    ssl_ciphers AES:HIGH:!ADH:!MD5;
    ssl_prefer_server_ciphers   on;

    ...
}

/ и т. д. / nginx / сайты-доступные / gitlab

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name git.domain1.tld;
    server_tokens off;
    root /home/git/gitlab/public;

    if ($scheme != "https") {
        rewrite ^ https://git.domain1.tld$request_uri permanent;
    }

    ssl_certificate /etc/nginx/conf/git-unified.crt;
    ssl_certificate_key /etc/nginx/conf/git.key;
    ssl_protocols  SSLv3 TLSv1;
    ssl_ciphers AES:HIGH:!ADH:!MD5;
    ssl_prefer_server_ciphers   on;

    ...
}