web-dev-qa-db-ja.com

ネストされた場所の正規表現を使用して、名前付きの場所にプロキシヘッダーを追加します

NginxとPumaを使用してRails APIにWebSocketエンドポイントをセットアップしようとしています。

私が持っているもの(働いているが醜い)

次のNginx構成正常に動作しますただし、@puma@puma_wsの両方の名前付きの場所での重複を避けるためにもっと賢いものを使用できると思います。

upstream puma {
    server unix:///path/to/socket.sock;
}

server {
    listen 80;
    server_name example.com;

    root /var/www/public;

    location / {
        try_files $uri/index.html $uri @puma;
    }

    location ~ ^/api/websocket {
        try_files $uri/index.html $uri @puma_ws;
    }

    location @puma {
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_Host;

       proxy_redirect off;

       proxy_pass http://puma;
   }

   location @puma_ws {
       # These two lines are the only difference compared to @puma
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";

       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_Host;

       proxy_redirect off;

       proxy_pass http://puma;
   }
}

注:実際のユースケースでは複数のWSエンドポイントが必要なため、WSの場所(~ ^/api/websocket)に正規表現を使用しています。この投稿を簡単にするために簡略化しました。

最初のアイデア

私の最初のアイデアは、名前付きの場所@pumaを1つだけ持つことでした。これは、必要な2つのproxy_set_headerのみを追加する正規表現を持つネストされた場所を持ちます。

そうすれば、try_filesという名前の場所が1つだけあります。@pumaという名前の場所は、ネストされたlocationを使用してヘッダーを単独で追加します。

ただし、名前付きの場所にlocationブロックをネストすることはできません。

実際のURIのテストに基づいて、これらのヘッダーを追加することをお勧めしますか?

ありがとう!

3
Jordan Becker

元の投稿に対する彼のコメントからのリチャードによると、私が思いついた元の解決策はそれ悪くはありません。

ただし、繰り返しを避けたいので、@puma@puma_wsの間の共通の構成部分を含むファイルを含めることにしました。

だから私は次のようなものになってしまいます:

/ etc/nginx/puma_proxy.conf

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;

proxy_redirect off;

ホスト設定ファイル

upstream puma {
    server unix:///path/to/socket.sock;
}

server {
    listen 80;
    server_name example.com;

    root /var/www/public;

    location / {
        try_files $uri/index.html $uri @puma;
    }

    location ~ ^/api/websocket {
        try_files $uri/index.html $uri @puma_ws;
    }

    location @puma {
       include /etc/nginx/puma_proxy.conf

       proxy_pass http://puma;
   }

   location @puma_ws {
       include /etc/nginx/puma_proxy.conf

       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";



       proxy_pass http://puma;
   }
}

誰かが実際にそのようにそれを好きかもしれない場合に備えて、これをここに投稿してください。

この状況に対処するためのより良い方法があれば教えてください、私はあなたの意見を持っていたいです!

1
Jordan Becker