
이것이 버그인지 아니면 캐시를 잘못 정의하고 있는지 모르겠습니다. 2에서 사용하는 nginx 캐시(역방향 프록시) 서버가 있습니다.다른별칭 도메인이 아닌 도메인( mydomain1.com
및 mydomain2.com
), 다른 콘텐츠입니다.
단일 캐시를 정의한 다음 nginx에서 두 개의 도메인/가상 호스트를 정의하고 해당 캐시를 사용하도록 설정했습니다. 두 도메인 모두 동일한 소스 서버에서 데이터를 가져오지만 서로 다른 가상 호스트를 소스 서버에 전달하여 올바른 콘텐츠를 가져옵니다.
문제는 nginx가 두 서버의 캐시를 혼합하는 것 같아서 한 홈 페이지에 액세스하면 다른 홈 페이지의 캐시된 홈페이지가 표시된다는 것입니다.
각 가상 호스트에 대해 별도의 캐시를 정의해야 합니까?
NGINX도 각 요청에 가상 호스트를 연결하면 안 되나요? 그냥 소스 서버, 포트 등을 연결하는 것 같습니다.
이것은 캐시된 홈 페이지의 헤드로, 두 가상 호스트를 구별할 것이 없음을 보여줍니다.
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;
}
}
소스 서버(아파치)에는 다음과 같이 정의된 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는 소스 서버라는 것을 이해합니다)
해결책:지정하다proxy_cache_key
현재 를 포함하는 a 가 $host
아닌 $proxy_host
;
proxy_cache_key $scheme://$host$request_uri;