Nginx
使用嵌套位置正則表達式在命名位置添加代理標頭
我正在嘗試使用 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 位置 (
~ ^/api/websocket
) 使用正則表達式,因為在我的實際案例中,我需要有多個 WS 端點。為了這篇文章的簡單起見,我進行了簡化。最初的想法
我的第一個想法是只有一個命名位置
@puma
,這將有一個嵌套的位置,正則表達式只會添加兩個需要的位置proxy_set_header
。這樣我就只有一個
try_files
具有唯一@puma
命名位置的位置,它會使用嵌套的方法自行添加標題location
但是,afaik 不可能
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; } }
在此處發布此內容,以防有人可能真的喜歡這種方式。
如果您有更好的方法來處理這種情況,請告訴我,我很樂意有您的選擇!