nginxを使用して発信応答内のURLを書き換える


8

Apacheで実行しているサイトを持つ顧客がいます。最近、サイトの負荷が高まっているため、サイトのすべての静的コンテンツをCookieのないドメインにシフトしたいと考えていますhttp://static.thedomain.com

アプリケーションはよく理解されていません。そのため、静的コンテンツサーバー(http://static.thedomain.com)へのリンクをポイントするようにコードを修正する時間を開発者に与えるために、nginxを介してサイトをプロキシし、リンクを/images/...に書き換えるように送信応答を書き換えることを考えましたhttp://static.thedomain.com/images/...

たとえば、Apacheからnginxへの応答には、ヘッダー+ HTMLのblobがあります。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 2016年

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

そうだね。そして問題はありません-私は今もnginxの膝の奥深くにいて、それを愛しています。
タク

あなたの答えを忘れていません:)まだこれを試す機会がまだありませんでした。
Kev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.