우리 팀은 nginx를 다음과 같이 사용합니다.은닉처. 문제는 업스트림의 애플리케이션이 우리가 재정의하려는 일부 헤더를 보낸다는 것입니다.캐시된 개체에서. 캐시에서 키(또는 키의 일부)를 검색하면 캐시된 개체에 저장된 헤더를 볼 수 있습니다. 예를 들어
cd /var/cache/nginx/test
grep -inr part_of_key *
Binary file 6/29/7bcd0cd0aadfd536cdd7183cd8b77296 matches
그러면 할 수 있어
strings 6/29/7bcd0cd0aadfd536cdd7183cd8b77296
# content with keys, cached headers and so on
nginx 구성은 (간체)입니다.
# part of server1
location / {
proxy_pass http://upstream;
proxy_cache zone1;
}
이제 지시문을 알고 proxy_hide_header
캐시된 개체의 헤더를 제거(및 대체)하려고 시도했지만 작동하지 않습니다. 프로세스는 다음과 같습니다.
- 업스트림이 응답을 보냅니다.
- nginx가 응답을 읽습니다.
- 응답은 캐시의 파일에 저장됩니다.
- 응답을 클라이언트에 보내기 위해 헤더 제거와 같은 작업이 응답에 대해 수행됩니다.
따라서 캐시에 저장되기 전에는 응답 헤더에 영향을 미칠 수 있는 방법이 없는 것 같습니다.
내가 개발할 수 있는 해결 방법 중 하나는 다른 nginx 서버를 중간에 배치하여 헤더를 변경할 수 있도록 하고 server1
.
예
# part of server1
location /
proxy_pass http://upstream-modify-headers;
proxy_set_header Host modify.headers;
proxy_cache zone1;
}
# the upstream
upstream upstream-modify-headers {
server 127.0.0.1:80;
}
#the host that modifies the headers
server {
listen *:80;
server_name modify.headers;
add_header "cache-control" "public, max-age=10, must-revalidate";
...
location / {
proxy_pass http://upstream;
proxy_hide_header cache-control; #one example header that should be modified in the cache
}
...
allow 127.0.0.1; #only locally available
}
이는 작동하지만 추가 nginx 호스트가 필요합니다.업스트림에 추가 헤더를 추가하지 않고 동일한 nginx 서버 내의 캐시된 객체에 있는 헤더를 재정의하는 것이 가능합니까?
답변1
지시문을 찾고 있는 것 같습니다 proxy_hide_header
.
답변2
해결 방법으로 헤더에 날짜 스탬프를 추가해 보세요. 추가하면 캐시에서 가져온 헤더와 새 헤더를 구별할 수 있습니다(액세스 로그를 다른 타임스탬프와 비교하여).