У меня есть несколько сайтов на веб-сервере 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 пытается меня обмануть?