nginx를 사용하여 발신 응답 내부의 URL을 다시 작성


8

Apache에서 사이트를 운영하는 고객이 있습니다. 최근에 사이트가 부하 증가를보고되었으며 정지 차이로 우리는 예를 들면, 쿠키 도메인에있는 모든 사이트의 정적 컨텐츠를 이동하려는 http://static.thedomain.com.

응용 프로그램이 잘 이해되지 않았습니다. 따라서 개발자가 정적 컨텐츠 서버에 대한 링크를 가리 키도록 코드를 수정할 시간을주기 위해 ( http://static.thedomain.com) nginx를 통해 사이트를 프록 싱하고 나가는 응답을 다시 작성하도록 링크를 다시 작성하는 방법에 대해 생각 /images/...했습니다 http://static.thedomain.com/images/....

예를 들어, Apache에서 nginx에 대한 응답에는 헤더 + HTML이 있습니다. Apache에서 반환 된 HTML에는 <img>다음과 같은 태그 가 있습니다 .

<img src="/images/someimage.png" />

이것을 다음과 같이 변환하고 싶습니다.

<img src="http://static.thedomain.com/images/someimage.png" />

따라서 HTML 페이지를 수신하면 브라우저는 정적 컨텐츠 서버에서 직접 이미지를 요청합니다.

nginx (또는 HAProxy)에서 가능합니까?

나는 문서를 훑어 보았지만 인바운드 URL을 다시 쓰는 것을 제외하고는 아무것도 뛰어 들지 않았다.

답변:


5

이있는 http://wiki.nginx.org/HttpSubModule - ". 검색하고 nginx를 응답에 텍스트를 대체 할 수있는이 모듈"

문서에서 과거 복사 :

통사론:

sub_filter string replacement

예:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}

haproxy에 이와 같은 것이 있습니까?
bradvido

@bradvido haproxy에서 이러한 기능을 찾지 못했습니다.
Oleg Neumyvakin

3

URL을 다시 작성하고 브라우저로 리디렉션을 보내는 대신 프록시 기능을 사용하고 적절한 위치에서 콘텐츠를 가져 오는 것이 가장 좋습니다.

프록시 컨텐츠 의 좋은 예는 다음과 같습니다.

#
#  This configuration file handles our main site - it attempts to
# serve content directly when it is static, and otherwise pass to
# an instance of Apache running upon 127.0.0.1:8080.
#
server {
    listen :80;

    server_name  www.debian-administration.org debian-administration.org;
        access_log  /var/log/nginx/d-a.proxied.log;

        #
        # Serve directly:  /images/ + /css/ + /js/
        #
    location ^~ /(images|css|js) {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }

    #
    # Serve directly: *.js, *.css, *.rdf,, *.xml, *.ico, & etc
    #
    location ~* \.(js|css|rdf|xml|ico|txt|gif|jpg|png|jpeg)$ {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }


        #
        # Proxy all remaining content to Apache
        #
        location / {

            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
}

이 구성에서, 요청을 리디렉션 static.domain.com하고 브라우저가 다른 요청을 하기 를 기대하는 대신 , nginx는 단순히 관련 로컬 경로에서 파일을 제공합니다. 요청이 동적이면 프록시는 최종 사용자가 모르게 Apache 서버 (로컬 또는 원격)에서 응답을 가져옵니다.

도움이 되길 바랍니다


답변하는 데 시간을 내 주셔서 감사합니다. 테스트 장비를 설정하고 어떻게 작동하는지 보겠습니다. 여기서 중요한 것은 모든 정적 컨텐츠를 Apache 서버 외부로 옮기는 것입니다. 그래서 CDN 서버에서 nginx를 실행 proxy_pass하고 Apache 서버로 설정할 수 있다고 생각 합니다 proxy_pass http://172.16.3.1:80. 즉, 사이트의 공개 IP 주소를 nginx / CDN 서버로 옮깁니다.
Kev

그렇습니다. 그리고 어떤 prob도 없습니다-나는 지금도 nginx에 깊숙이 무릎을 꿇고 사랑합니다.
Tak

답을 잊어 버리지 않았습니다. :) 아직 시도 할 기회가 없었습니다.
Kev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.