У меня есть 3 сервера в моей тестовой среде:
Я пытаюсь установить статические кэши файлов. Серверы 2 и 3 имеют абсолютно другое содержание.
Вот моя конфигурация кэша:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:100m inactive=120m max_size=900M;
proxy_cache_min_uses 1;
и вот основной файл конфигурации nginx:
server {
listen 80;
server_name _;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
location /foo/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.11:8888/foo/";
proxy_set_header X-debug-message-foo request_method|$host|$request_uri|$proxy_add_x_forwarded_for";
}
location /bar/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.10:8885/bar/";
proxy_set_header X-debug-message-bar "$request_method|$host|$request_uri|$proxy_add_x_forwarded_for";
}
location ~* ^.+/foo/.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.11:8888;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
location ~* ^.+/bar/.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.10:8885;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
}
Таким образом, моя точка должна создать кэш со статическими файлами для различных местоположений и если кэш устарел, nginx должен загрузить содержание из сервера бэкэнда (не от корня локального сервера). К сожалению, sudo ls -la /var/cache/nginx
показывает мне, что каталог кэша всегда пуст.
Также я попробовал, как кэш работает только на один сайт бэкенда путем изменения местоположения как это
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|gz)
и
proxy_pass http://192.168.11.11:8888;
В этом случае кэш местоположений нечто работает хорошо, и папка кэша не пуста. Конечно, местоположение 'панели' не служит никаким статическим файлам.
UDP
Наконец я выяснил. Единственное рабочее решение использует вложенный контекст местоположения. Как в этом примере:
server {
listen 80;
server_name _;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
location /foo/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.11:8888/foo/";
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.11:8888;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
}
location /bar/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.10:8885/bar/";
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.10:8885;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
}
}
Следует иметь в виду, не находится ли Ваш сервер бэкэнда в подкаталоге (например, непосредственно в public_html каталоге не как этот public_html/foo) необходимо удалить двойной подкаталог при помощи rewrite /foo(.*) /$1 break;
во вложенном контексте местоположения.
Ваше регулярное выражение кажется неправильным.
^. + / Foo /.+. (Jpg | jpeg | gif | css | png | js | ico | gz)
не может соответствовать URL типа /foo/test.jpg
, но только URL типа /t/foo/test.jpg
.
+
означает один или несколько раз.