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のテストに基づいて、これらのヘッダーを追加することをお勧めしますか?
ありがとう!
元の投稿に対する彼のコメントからのリチャードによると、私が思いついた元の解決策はそれ悪くはありません。
ただし、繰り返しを避けたいので、@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;
}
}
誰かが実際にそのようにそれを好きかもしれない場合に備えて、これをここに投稿してください。
この状況に対処するためのより良い方法があれば教えてください、私はあなたの意見を持っていたいです!