У меня есть установка nginx, которая получает запросы от внешних хостов и передает их на внутренний сервер.
Конфиг выглядит примерно так:
server {
listen 10.0.0.66:443;
server_name my.example.com;
root /websites/my.example.com
ssl on;
ssl_certificate /websites/ssl/my.example.com.crt;
ssl_certificate /websites/ssl/my.example.com.key;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
location / {
proxy_pass https://10.0.0.100:3000/;
}
}
Для экспериментальных целей / целей тестирования я хотел бы иметь возможность запускать то, на что отвечал внутренний хост, через произвольный двоичный файл и отвечать тем, чем отвечает двоичный файл.
К примеру , если бы я хотел преуменьшать HTML на прокси я бы запустить ответ сервера через htmlcompressor , а затем направить вывод в ответ прокси-сервера к клиенту. Конечным результатом будет конечный клиент, получающий минимизированный HTML обратно.
Я знаю, что есть все виды дополнений и примеров для nginx, чтобы выполнить это для локально обслуживаемых данных, но как настроить его для прокси?
nginx
reverse-proxy
0x6A75616E
источник
источник
Ответы:
Итак, вы хотите
nginx
передать запрос от клиента на внутренний сервер, а затем, перед возвратом ответа внутреннего компонента клиенту, передать такой ответ через другой внешний процессор?Я не думаю, что вы можете сделать вышеупомянутое с какими-либо официальными
nginx
модулями, предоставленными Igor Sysoev и Nginx, Inc в настоящее время. Ближе всего , что доступно для изменения тела ответа является несколько фильтрующих модулей , которые приходят вместе с Nginx, но по умолчанию отключены, в том числеadd_before_body
,add_after_body
иsub_filter
директивы:http://nginx.org/en/docs/http/ngx_http_addition_module.html
http://nginx.org/en/docs/http/ngx_http_sub_module.html
Кроме того, возможно,
gzip on;
это то, что вы на самом деле хотите вместо этого?http://nginx.org/en/docs/http/ngx_http_gzip_module.html
Или, возможно, если вы знаете
perl
и готовы запустить полностью экспериментальный модуль, взглянуть на вложениеperl
вnginx
, с официальным модулем Nginx , который выключен по умолчанию и является (несколько очевидно) полностью экспериментальным:http://nginx.org/en/docs/http/ngx_http_perl_module.html
Другой вариант - использовать какую-то настройку Fast-CGI, на которую вы будете перенаправлять запросы, где, в свою очередь, ваш скрипт Fast-CGI будет выполнять запросы к бэкэнду, а затем выполнять окончательную обработку перед возвратом. ответы возвращаются в nginx для кэширования и возврата пользователю.
Существует также
proxy_set_body
(ноfastcgi_set_body
пока нет ) изменение тела запроса (например, из того, что предоставил клиент), но, похоже, не существует какой-либо эквивалентной директивы или переменной для получения тела ответа для передачи как-то последующий запрос к постпроцессору. В любом случае, модуль фильтра - это то, что вам нужно для постпроцессора.(Кроме того, вы понимаете, что наивный подход
fork
к получению ответов от обычного руководителя будет очень медленным, верно?)Подводя итог , я думаю,
gzip on;
это именно то, что вы ищете; иначе, при условии, что вы можете изменить исходное веб-приложение, я думаю, что вам лучше всего установить какой-то постпроцессор внутри самого веб-приложения, что в целом выглядит как следующее простое решение. Потенциально вы можете посмотреть, как реализованы модули фильтров , например, вышеупомянутый ngx_http_addition_filter_module.c, а также некоторые более важные фильтры, такие как ngx_http_gzip_filter_module.c, и реализовать свой собственный встроенный модуль фильтра. Или нанять Nginx, Inc., чтобы написать это для вас! Но, если серьезно,gzip on;
просто работает, и, вероятно, даст вам гораздо лучшие результаты без каких-либо хлопот, проблем с производительностью или стабильностью, и он уже скомпилирован по умолчанию, вам просто нужно включить его вnginx.conf
,источник
add_after_body
илиsub_filter
это именно то, что вам нужно. Пример на nginx.org/en/docs/http/ngx_http_sub_module.html показывает именно этот сценарий: замена «</ head>» на «</ head> <script…». Возможно, вам придется перекомпилировать nginx, чтобы включить эти модули (проверьте,nginx -V
как был скомпилирован ваш nginx), но в противном случае они уже являются стандартными модулями.Я думаю, что если вы хотите запустить произвольный код, чтобы улучшить вывод nginx, вы можете написать скрипт lua.
Ищите «nginx lua».
(Пример: http://www.londonlua.org/scripting_nginx_with_lua/slides.html?full#hello-lua )
источник