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

Я пытаюсь разработать совершенно новый веб-сайт, используя исключительно 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 каждый раз, когда я вношу изменения :(


person CzechErface    schedule 25.02.2016    source источник


Ответы (2)


РЕШЕНО

Хорошо, я понял это благодаря Гуань Хао. Его комментарий о веб-фреймворках, имеющих функцию автоматической перезагрузки, поставил меня на путь определения того, как 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 и тому подобном, но теперь мне все равно, когда у меня есть идеальное решение! Пожалуйста, имейте в виду, что любой, кто использует это, должен удалить флаг в производстве.

person CzechErface    schedule 25.02.2016
comment
В web2py есть функция автоматической перезагрузки. Найдите auto-reload в the-core и посмотрите реализацию здесь. Автоматическая перезагрузка может быть реализована на чистом питоне без помощи uwsgi, так что она будет работать и в другом стеке wsgi, таком как gunicorn и т. д. ИМХО автоперезагрузка должна быть включена только в среде разработки, поэтому потеря некоторых запросов во время перезагрузки — это нормально. - person Guan Hao; 25.02.2016
comment
Я не использую фреймворк. Я использую только nginx, uwsgi и (из примера) один 3-строчный файл python. Кажется нелогичным не использовать фреймворк, а затем иметь логику фреймворка для автоматической перезагрузки. Решение, которое я хотел, требовало наименьшего объема обслуживания и программного обеспечения. В данном случае это решалось простым добавлением --py-autoreload 1 к выполняемой команде. Я проголосовал за ваш ответ... - person CzechErface; 25.02.2016

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

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

person Guan Hao    schedule 25.02.2016
comment
Я вообще не использую веб-фреймворк. Итак, вы говорите, что мне фактически нужно настроить что-то вроде задания incron, чтобы отслеживать изменения в файловой системе и перезапускать uwsgi? Это невозможно, потому что запрос потенциально может поступить в промежутке между остановкой службы и ее повторным запуском. Я чувствую, что этот ответ неверен, но у меня недостаточно доказательств, чтобы показать, что это так. Как получается, что если я загружаю изменения в настройку web2py, этот код сразу же отображается, когда я обновляю страницу без каких-либо дополнительных действий с моей стороны? Где функция автоматической перезагрузки? - person CzechErface; 25.02.2016
comment
Спасибо за ваш ответ, поскольку он привел меня в правильном направлении, чтобы получить гораздо лучший метод разработки. Пожалуйста, смотрите мой ответ для более подробной информации. - person CzechErface; 25.02.2016