
Я не знаю, ошибка ли это или я неправильно определяю кэш, у меня есть сервер кэша nginx (обратный прокси), который используют 2другойдомены ( mydomain1.com
и mydomain2.com
), разный контент, не псевдоним домена.
Я определил один кэш, затем определил два домена/виртуальных хоста в nginx и настроил его на использование этого кэша. Оба домена берут свои данные с одного и того же исходного сервера, но передают на исходный сервер разные виртуальные хосты, чтобы получать правильный контент.
Проблема в том, что nginx, по-видимому, смешивает кэш на двух серверах, при доступе к одной домашней странице отображается кэшированная домашняя страница другой.
Нужно ли мне определять отдельный кэш для каждого виртуального хоста?
Разве NGINX не должен также связывать vhost с каждым запросом? Похоже, он просто связывает исходный сервер, порт и т. д.
Это заголовок кэшированной домашней страницы, показывающий, что между двумя виртуальными хостами нет никаких различий:
KEY: http://source.example.com:81/
HTTP/1.1 200 OK
Date: Sun, 02 Feb 2020 00:54:33 GMT
Server: Apache/2.4.6 (CentOS) mpm-itk/2.4.7-04 OpenSSL/1.0.2k-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Expires: Sun, 02 Feb 2020 02:54:33 GMT
Cache-Control: public, max-age=7200
X-Mod-Pagespeed: 1.13.35.2-0
Vary: Accept-Encoding
Мои настройки кэша NGINX:
proxy_cache_path /ramdisk/nginx_cache levels=1:2 keys_zone=nginx_ramdisk_cache:512m max_size=3g
inactive=30d use_temp_path=off;
# defining domain 1
server {
[...]
server_name mydomain1.com;
location / {
proxy_pass http://source.example.com:81;
proxy_set_header Host mydomain1.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache nginx_ramdisk_cache;
}
}
# defining domain 2
server {
[...]
server_name mydomain2.com;
location / {
proxy_pass http://source.example.com:81;
proxy_set_header Host mydomain2.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache nginx_ramdisk_cache;
}
}
и на исходном сервере (Apache) у меня есть 2 виртуальных хоста, определенных следующим образом:
<VirtualHost *:81>
ServerName mydomain1.com
DocumentRoot /var/www/html/mydomain1.com
</VirtualHost>
<VirtualHost *:81>
ServerName mydomain2.com
DocumentRoot /var/www/html/mydomain2.com
</VirtualHost>
решение1
Отвечаю на свой собственный вопрос как чудак;
Для того чтобы nginx мог различать одинаковые пути, используемые двумя URL-адресами (например, /
), ему необходимо использовать proxy_cache_key
, что попо умолчаниюпохоже $scheme$proxy_host$request_uri
, в моем случае это не работает, когда два домена nginx берут данные с одного и того же исходного сервера (отправляя разные заголовки хоста), они будутобав конечном итоге используем такой ключ:
KEY: http://source.example.com:81
(Я понимаю, что $proxy_host = исходный сервер)
Решение:указатьa, proxy_cache_key
который включает в себя текущий $host
, а не $proxy_host
;
proxy_cache_key $scheme://$host$request_uri;