Apache за nginx выдает неверный виртуальный хост - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть несколько сайтов на веб-сервере Apache, скажем:

site1.com site2.com site3.com

apache прослушивает 80 и 443, и каждый vhost настроен так:

<VirtualHost site1.com:80>
    ServerName site1.com
    ServerAlias site1.com

    ServerAdmin webmaster@site1.com
    DocumentRoot /data/site1

    <Directory /data/site1>
           AllowOverride All
           Options -MultiViews +FollowSymLinks
           Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/site1.com_error.log
    CustomLog ${APACHE_LOG_DIR}/site1.com_access.log combined

</VirtualHost>
<VirtualHost site1.com:443>
    ServerName   site1.com
    ServerAlias  site1.com
    ServerAdmin  webmaster@site1.com
    DocumentRoot "/data/site1"
    #more ssl config ...
</VirtualHost>

теперь я настроил обратный прокси-сервер nginx поверх site1.com - так что DNS был изменен, чтобы указать site1.com на nginx, и на nginx была сделана эта конфигурация:

server {
    listen          site1.com:80;
    server_name     site1.com;
    expires 0;
    status_zone site1.com;
    if ($host !~ ^(site1.com)$ ) {
        return 444;
    }
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
    location '/.well-known/acme-challenge' {
        root /etc/nginx/html/certbot;
    }
    location / {
        rewrite ^/(.*) https://site1.com/$1;
    }
}
server {
    listen          site1.com:443 ssl;
    server_name     site1.com;
    ssl_certificate      /etc/letsencrypt/live/site1.com,/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/site1.com/privkey.pem;
    expires 0;
    status_zone site1.com;
    if ($host !~ ^(site1.com)$ ) {
        return 444;
    }
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
    location '/.well-known/acme-challenge' {
        root /etc/nginx/html/certbot;
    }
    location / {
        proxy_pass  http://apache_server_IP:80;
        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;
    }
}

так что nginx действует как обратный прокси, и он работал нормально - через день я вижу контент с site2.com на site1.com

Я проверил, отправляет ли nginx правильный заголовок узла - в nginx-config proxy_set_header Host $ host установлен - и nginx отправляет правильный заголовок host (расширьте ведение журнала apache с помощью% {Host} i)

, чтобы я мог видеть запросы к site1.com в журнале для site2.com стакая запись

site1.com $ nginx_IP - - [07 / ноябрь / 2019: 10: 07: 29 +0100] "GET / HTTP / 1.1" 302 313 "-" "Mozilla / 5.0 (WindowsNT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 77.0.3865.120 Safari / 537.36 "

сэто LogFormat:

LogFormat "%{Host}i %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\""

Моё решение было удалить listen: 80 для site2 и site3 - теперь, когда nginx приходит с запросом на порт 80, остается только один vhost (site1) - Недостаток: site2и site3 теперь доступны только через https (не большая проблема, но я хочу, чтобы они прослушивали 80 и снова перенаправляли на 443)

Я не знаю, где проблема - apache пытается меня обмануть?

1 Ответ

0 голосов
/ 07 ноября 2019

после прочтения еще нескольких apache-документов (https://httpd.apache.org/docs/2.4/vhosts/examples.html) я попробовал звездочки в vhosts, и теперь это работает!

просто используйте

<VirtualHost *:80>

вместо

<VirtualHost site1.com:80>

Я больше не хочу об этом думать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...