У меня есть nginx перед сервером Apache и сервером Gunicorn для разных частей моего сайта. Я использую модуль SSI в nginx для отображения фрагмента на каждой странице. Веб-сайты включают фрагмент в такой форме:
Для статических страниц, обслуживаемых nginx, все работает нормально, то же самое касается страниц, сгенерированных Apache - оценивается включение SSI и заполняется фрагмент. Однако для запросов к моему бэкэнду-пушке, запускающему приложение Python в Django, включение SSI не оценивается.
Вот соответствующая часть конфигурации nginx:
location /cgi-bin/script.pl {
ssi on;
proxy_pass http://default_backend/cgi-bin/script.pl;
include sites-available/aspects/proxy-default.conf;
}
location /directory/ {
ssi on;
limit_req zone=directory nodelay burst=3;
proxy_pass http://django_backend/directory/;
include sites-available/aspects/proxy-default.conf;
}
Бэкенды:
upstream django_backend {
server dynamic.mydomain.com:8000 max_fails=5 fail_timeout=10s;
}
upstream default_backend {
server dynamic.mydomain.com:80;
server dynamic2.mydomain.com:80;
}
proxy_default.conf:
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;
В чем причина такого поведения? Как я могу получить SSI, работающую на моих страницах, созданных на Gunicorn? Как я могу отладить это дальше?
Только что выяснил, что там произошло: похоже, что nginx не может анализировать SSI-файлы, если он получает заархивированные ответы. В моем Django settings.py у меня был django.middleware.gzip.GZipMiddleware
включен. После удаления этого SSI-включения работают нормально.