14

Nginxリバースプロキシの背後で実行されているアプリがいくつかあります。そのうちの1つは、Express.jsを備えたノードサーバーです。私はこのNginx構成を使用するようにプロキシdomain.com/demo/app/<path>しています:localhost:7003/<path>

http {

    ...

    server {

        listen 80;
        server_name domain.com;

        ...

        location /demo/app {

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

            rewrite ^/demo/app/?(.*) /$1 break;
            proxy_pass http://localhost:7003;
        }

        ...
    }
}

これはうまく機能appし、に根ざしているようにリクエストを受け取ります/。問題は、それ自体の静的ファイルを処理し、またはappなどのルートを要求する可能性があることです。ただし、リバースプロキシのため、これらは実際にはとにそれぞれ存在します。css/app.cssimages/image.jpg/demo/app/css/app.css/demo/app/images/image.jpg

これを解決するには、Nginxにルートパスを示すカスタムヘッダーをNodeに渡してもらいます。このヘッダーは、Nodeサーバーが後続のすべてのリクエストのURLの前に付加します。しかし今、私のコードにはこれらのルートパス文字列が散らばっています。たとえば、私のバックエンドテンプレートの一部:

link(rel='stylesheet', href="#{basePath}/css/base.css")
link(rel='stylesheet', href="#{basePath}/css/skeleton.css")
link(rel='stylesheet', href="#{basePath}/css/layout.css")

これを処理するためのよりエレガントな方法は何ですか?Nginxにアップストリームサーバーからのリクエストを認識させ、それらをそのサーバーに自動的に転送する方法はありませんか?

4

1 に答える 1

9

アプリのnginx構成ファイル(nginx.confに含まれている)にlocationディレクティブを追加することで、これらのリクエストをノードに渡さずにnginxに静的ファイルを提供させました。

location ~ /(img|js)/ {
    rewrite ^(.*)$ /public/$1 break;
}

location / {
    proxy_pass http://localhost:3000/;
    ...
}

リクエストが/imgまたは/jsディレクトリに来る場合、nginxはそれぞれ/ public/imgまたは/public/jsディレクトリからファイルを提供します。他のすべての要求はノードにプロキシされます。

必要に応じてディレクトリを追加し(ノードとブラウザの両方で使用するテンプレートをそこに保存する場合は/cssや/viewsなど)、それらのディレクトリ内に任意のディレクトリ構造を設定すると、nginxはそれらの前に/publicを追加します。ノードアプリがそれを知らなくても、そこからファイルを取得します。

于 2012-12-26T14:02:02.987 に答える