У меня в тестовой среде 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;
В этом случае кеш расположения foo работает нормально, и папка кеша не пуста. Конечно, в «полосе» нет статических файлов.
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
.
+
означает один или несколько раз.