Я использую Nginx с открытым исходным кодом в качестве веб-сервера с Proxy_cache.
У меня есть уникальный вариант использования для удаления ключа в кеше, а также для передачи запроса на серверные серверы для удаления ключа в БД без кеширования ответа.
Поэтому удалите ключ в кеше веб-сервера и бэкэнд-БД в одном запросе.
Клиент => балансировщик нагрузки => Nginx (proxy_cache) => приложение => PostgreSQL
например, Nginx.conf
if ( $http_x_delete_key ){
content_by_lua_file ./purge_key.lua;
proxy_pass http://backend_servers;
}
например, purge_key.lua
...
if ngx ~= nil then
...
delete_file(filename)
ngx.log(ngx.NOTICE, 'deleted')
-- ngx.exit(ngx.OK);
-- return
end
Блок if в разделе местоположения Nginx просто останавливает поток (Как работает nginx "location if") и возвращает ответ, не отправляя его на бэкэнд, и не передает запрос как есть.
Я даже скомпилировал OpenResty с помощью бесплатного модуля ngx_cache_purge, но команда очистки также не передает запрос на бэкэнд.
Обычно вы тайм-аут или обновляете ключ, используя ответ серверной части, но в моем случае мне нужен более явный контроль, чтобы удалить ключ либо в том же запросе, либо в ответе.
Решает ли Openresty + Memcache, Apache httpd, Apache Traffic Server или Varnish (vcl_purge и pass) этот вариант использования или есть другой способ сделать это?
Я вроде как нашел способ сделать это.
В зависимости от значения заголовка HTTP-запроса запустите lua-скрипт, чтобы удалить файл кеша (хэш ключа и его последние символы x + y, если уровень кэша x: y) в proxy_cache Nginx.
Использование «access_by_lua» вместо «content_by_lua» в качестве фазы обработчика контента всегда будет завершаться и возвращаться, даже если я не напишу «ngx.exit» или «ngx.OK».
Мне нужно запустить lua-скрипт в NGX_HTTP_ACCESS_PHASE а не в NGX_HTTP_CONTENT_PHASE поскольку я не создаю контент или ответ, который должен исходить от серверной части в моем сценарии.
например, Nginx.conf
proxy_cache_bypass $http_x_delete_key;
proxy_no_cache $http_x_delete_key;
if ( $http_x_delete_key ){
...
access_by_lua_file ./purge_key.lua;
}
Когда приходит запрос на удаление ключа, Nginx
1. Запустите сценарий lua, чтобы удалить файл кеша, но не возвращайтесь немедленно, так как он находится в фазе доступа.
2. Запрос будет обходить кеш
3. При получении запроса приложение удалит ключ в БД.
4. Ответ не будет кешироваться в Nginx proxy_cache
Общий подход состоит в том, чтобы приложение выполняло и удаление из кеша, и из базы данных. В качестве альтернативы, lua, размещенный на nginx, сделает и то, и другое.
Вообще говоря, любой многоэтапный / многоэтапный вид обработки запросов - это уровень приложения, а не уровень веб-сервера / сети. Никакой прокси-сервер, управляемый конфигурацией, не должен стремиться к решению этой проблемы.
Так что сделайте это как часть своего приложения и решите, будет ли правильный след в исходной кодовой базе или в lua. Скорее всего, лучшее место - это исходная кодовая база.