Итак, вы хотите 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
,