다른 도메인 간에 캐시된 콘텐츠를 혼합하는 nginx

다른 도메인 간에 캐시된 콘텐츠를 혼합하는 nginx

이것이 버그인지 아니면 캐시를 잘못 정의하고 있는지 모르겠습니다. 2에서 사용하는 nginx 캐시(역방향 프록시) 서버가 있습니다.다른별칭 도메인이 아닌 도메인( mydomain1.commydomain2.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;

관련 정보