Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как отключить кеширование для сервера nginx+uwsgi+python?

Автор вопроса: CzechErfaceОтветов: 2

Я пытаюсь разработать совершенно новый веб-сайт, используя исключительно nginx, uwsgi и python. Проблема в том, что если я изменю файл, на который указывает uwsgi, и обновлю страницу, я получу HTML-код, сгенерированный предыдущей версией файла. Похоже, что nginx, uwsgi или оба кэшируют код и/или ответ моего сайта. Я читал о кэшировании uwsgi, но не смог отключить кэширование с помощью флагов --cache2 и --cache_*. Я нашел этот другой вопрос, а также попытался использовать

proxy_no_cache "1";
proxy_cache_bypass "1";

в словаре местоположения сервера (находится в /etc/nginx/sites-available/mysite), но, увы, все равно кэширует страницу. Я использовал web2py в прошлом с nginx и uwsgi, и, похоже, у него не было этой проблемы, когда я обновлял контроллеры или представления.

Это файл моего сайта:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    include snippets/snakeoil.conf;
    server_name _;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:3031;
    }
}

это исполняемая программа, которую использует скрипт init.d:

uwsgi --master --processes 4 --threads 2 --die-on-term -s /tmp/mysock.sock --socket :3031 --uid www-data --gid www-data --vacuum --wsgi-file /path/to/my/python/file.py

это загружаемый файл python:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<h1>Hello World</h1>"]

Я понимаю, что кэширование повышает производительность, поэтому я намерен снова включить его для производственной среды, но разработка с включенным кэшированием - это боль в заднице... Что я делаю неправильно?

Мой единственный обходной путь сейчас - перезапускать службу uwsgi каждый раз, когда я вношу изменения :(

pythonnginxcachinguwsgi

Ответы

Ответ 1 · рейтинг 5 · CzechErface

РЕШЕНО

Хорошо, я понял это благодаря Гуань Хао. Его комментарий о веб-фреймворках, имеющих функцию автоматической перезагрузки, поставил меня на путь определения того, как web2py работает так гладко при изменении контроллеров, моделей и представлений. Как оказалось, мне нужно перезагрузить uwsgi, прежде чем мои изменения вступят в силу, и в конце концов я нашел метод (хотя и не самый лучший), который позволяет мне заниматься разработкой, не требуя, чтобы оболочка выдавала /etc/init.d/mysiteapp restart каждый раз, когда я вношу изменения. Согласно документации uWSGI, существует флаг --touch-reload, который вы можете указать при запуске uWSGI, который будет перезагружать его при изменении/прикосновении к определенному файлу.

touch-reload
argument: required_argument
parser: uwsgi_opt_add_string_list
flags: UWSGI_OPT_MASTER
help: reload uWSGI if the specified file is modified/touched

Я просто устанавливаю аргумент флага для файла с именем reload, находящегося в корневом каталоге веб-сайта, и когда я загружаю изменения, я также просто загружаю этот файл (в самом конце). Работает безупречно! Спасибо за совет! У меня есть два дня, прежде чем я смогу принять свой собственный ответ, поэтому, если у кого-то есть лучший метод, чем этот, пожалуйста, опубликуйте его.

--- ОБНОВИТЬ ---

Оказывается, есть еще лучший способ сделать это! Я наткнулся на этот вопрос с непринятым ответом, который решил проблему полностью (пока). С помощью этого метода мне даже не нужно прикасаться к файлу reload. Я просто добавил следующий флаг и параметр в uwsgi, когда он выполняется в скрипте init.d:

--py-autoreload 1

Я не уверен, почему я никогда не мог найти ответ в поиске Google и тому подобном, но теперь мне все равно, когда у меня есть идеальное решение! Пожалуйста, имейте в виду, что любой, кто использует это, должен удалить флаг в производстве.

Ответ 2 · рейтинг 1 · Guan Hao

Это не кеширование. Вы должны перезапустить uwsgi, прежде чем ваши изменения, внесенные в файлы Python, вступят в силу.

Вы также можете включить функцию автоматической перезагрузки вашей веб-инфраструктуры (web2py или что-то еще). В этом случае приложение wsgi перезагрузится при обнаружении изменений в файле, поэтому вам не нужно перезапускать uwsgi.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы