Я использую прокси-кеш Nginx для наших динамических страниц и недавно интегрировал ssi. Загрузка первой страницы работает нормально, но как только страница кэшируется и через нее приходит другой запрос, страница просто зависает.
Журналы, похоже, указывают на несколько выполняемых подзапросов (есть только одна директива и в макете), и я не совсем уверен, почему это происходит. Страница загружается нормально при первой загрузке, кешированная версия крутится и ломается. Вот мой конфиг.
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=500m inactive=60m; #caching
proxy_temp_path /var/tmp; #caching
gzip_comp_level 6;
gzip_vary on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;
upstream staging {
server 127.0.0.1:1337;
}
server {
listen 0.0.0.0:80;
server_name dev.example.com;
access_log /var/log/nginx/dev.example.log;
error_log /var/log/nginx/dev.example.error.log debug; log_subrequest on;
location ~ ^/(images/|scripts/|styles/|robots.txt|humans.txt|favicon.ico) { #caching
root /home/example/app/website/public;
access_log off;
expires modified +1h;
}
location / {
ssi on;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_cache one; #caching
proxy_cache_key sfs$request_uri$scheme; #caching
proxy_http_version 1.1;
proxy_pass http://staging/; #points to the upstream staging
}
}
И это директива, которая находится в макете
<!--# include virtual="/ssi/dynamic-content" -->
-- РЕДАКТИРОВАТЬ --
Я только что заметил, что макет страницы тоже отображается несколько раз. Запрос ssi не возвращает никакой разметки, кроме div, я не уверен, почему весь макет будет вставлен несколько раз.
- РЕДАКТИРОВАТЬ 2 -
Я не знаю, почему это работает, но мне удалось решить эту проблему, переместив ssi-запросы за пределы блока location / {} в свои собственные, что пропускает настройки кеширования и переходит непосредственно на сервер. Моя конфигурация теперь выглядит так.
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=500m inactive=60m; #caching
proxy_temp_path /var/tmp; #caching
gzip_comp_level 6;
gzip_vary on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;
upstream staging {
server 127.0.0.1:1337;
}
server {
listen 0.0.0.0:80;
server_name dev.example.com;
access_log /var/log/nginx/dev.example.log;
error_log /var/log/nginx/dev.example.error.log debug; log_subrequest on;
location ~ ^/(images/|scripts/|styles/|robots.txt|humans.txt|favicon.ico) { #caching
root /home/example/app/website/public;
access_log off;
expires modified +1h;
}
#New proxy block specifically for ssi routes
location /ssi {
proxy_pass http://staging;
}
location / {
ssi on;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_cache one; #caching
proxy_cache_key sfs$request_uri$scheme; #caching
proxy_http_version 1.1;
proxy_pass http://staging/; #points to the upstream staging
}
}
После дополнительного исследования проблема, похоже, заключалась в том, что страница буквально неоднократно вставляла себя в ssi include. Почти как если бы включение включало всю страницу, которая также имела включение, и продолжала рекурсивно включать новую разметку.
Я думаю, что перемещение ssi-запросов за пределы настройки блока кеширования было смягчено, но я не совсем уверен, почему.
Я нашел ответ.
В предыдущей конфигурации у меня было кеширование для $request_uri
. Это означает, что nginx будет загружать и извлекать кеши на основе входящий запрос. Серверная часть включает в себя другой request, но поскольку кеширование основано на входящем uri, оно в конечном итоге получает саму главную страницу, таким образом вставляя себя неоднократно.
Используя $uri
вместо того $request_uri
nginx будет учитывать перезапись и ssi-запросы, таким образом, кэширование и выборка через соответствующие пространства имен (в данном случае ssi-маршруты, определенные приложением).