nginx가 프록시로 제공하는 데이터 수정


9

외부 호스트로부터 요청을 받아서 내부 서버로 프록시하는 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가 요청을 프록시 서버로 전달하고 응답을 수신하고 압축 한 다음 사용자에게 전달하도록 하시겠습니까? 서버와 사용자의 중간에 nginx가 처리하도록 하시겠습니까?
sjdaws

@ sjdaws는 반드시 압축 할 필요는 없지만 임의의 프로그램을 통해 실행하고 출력을 클라이언트에 보내는 것으로 사용하십시오. 본질적으로 그렇습니다. 서버에서 클라이언트로가는 출력을 수정하고 싶습니다.
0x6A75616E

답변:


10

따라서 nginx클라이언트에서 백엔드 서버로 요청을 프록시 한 다음 백엔드의 응답을 클라이언트로 리턴하기 전에 해당 응답을 다른 외부 프로세서를 통해 파이프 하시겠습니까?

nginx현재 Igor Sysoev와 Nginx, Inc에서 제공 하는 공식 모듈로 위의 작업을 수행 할 수 있다고 생각하지 않습니다 . 응답 본문을 변경하는 데 사용할 수있는 가장 가까운 것은 nginx와 함께 제공되는 몇 가지 필터 모듈이지만 add_before_body, add_after_bodysub_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그리고 완전히 실험 모듈을 실행하고자하는, 내장 한 번 봐 걸릴 perlnginx기본적으로 해제 및 (다소 명백하게) 완전히 실험이다 공식의 nginx 모듈을 :

http://nginx.org/en/docs/http/ngx_http_perl_module.html

또 다른 옵션은 일종의 Fast-CGI 설정을 사용하여 요청을 리디렉션하고 Fast-CGI 스크립트가 백엔드로 요청을 보낸 다음 반환하기 전에 최종 처리하는 것입니다. 캐시하고 사용자에게 반환하기 위해 nginx에 회신합니다.

또한 요청 본문을 변경하는 proxy_set_body(그러나 fastcgi_set_body아직은 아님) 있지만 (예 : 클라이언트가 제공 한 내용) 응답 본문을 가져 오는 동등한 지시문이나 변수가없는 것 같습니다. 어떻게 든 포스트 프로세서에 대한 후속 요청에. 어쨌든 필터 모듈은 아마도 포스트 프로세서에 적합합니다.

(또한 fork정규 임원을 통한 ing 및 pipe 회신에 대한 순진한 접근 방식이 매우 느리다는 것을 알고 있습니까?)

요약하자면 , gzip on;정확히 당신이 찾고있는 것입니다. 그렇지 않으면 원래 웹 응용 프로그램을 수정할 수 있다면 웹 응용 프로그램 자체에 일종의 포스트 프로세서를 설치하는 것이 가장 좋은 방법이라고 생각합니다. 잠재적으로 필터 모듈 의 구현 방식 (예 : 위에서 언급 한 ngx_http_addition_filter_module.c)과 ngx_http_gzip_filter_module.c와 같이보다 관련성이 높은 필터를 확인하고 자체 내장 필터 모듈을 구현할 수 있습니다. 또는 Nginx, Inc.를 고용하여이를 작성하십시오! 그러나 진지하게 gzip on;작동하면 번거 로움, 성능 또는 안정성 문제없이 훨씬 더 나은 결과를 얻을 수 있으며 이미 기본적으로 컴파일되어 있으므로 활성화해야합니다.nginx.conf.


답장을 보내 주셔서 감사합니다! 나는 gzip을 알고 있으며 달성하려는 것은 출력을 수축시키는 것보다 더 높은 수준입니다. 특정 내부 웹 서비스에 대한 액세스를 제어하는 ​​프록시가 있으며, cloudflare와 같은 방식으로 Google 웹 로그 분석과 같은 항목을 출력에 추가 할 수 있기를 원했습니다. 당신이 말했듯이, 그것은 fastcgi가 옵션 인 것처럼 들리므로 그것을 살펴 보겠습니다. 다시 감사합니다!
0x6A75616E

물건을 추가하거나 Google 웹 로그 분석을 추가 하려면 정확히 add_after_body또는 sub_filter필요한 것입니다. nginx.org/en/docs/http/ngx_http_sub_module.html 의 예는 "</ head>"를 "</ head> <script…"로 바꾸는 시나리오를 정확하게 보여줍니다. 해당 모듈을 활성화하기 위해 nginx를 다시 컴파일해야 할 수도 있지만 ( nginx -Vnginx가 컴파일 된 방법을 확인하십시오 ) 그렇지 않으면 이미 표준 모듈입니다.
cnst

subs_filter 모듈도 살펴보십시오 .
franzlorenzon

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.