使用嵌套位置正则表达式在命名位置添加代理标头

使用嵌套位置正则表达式在命名位置添加代理标头

我正在尝试使用 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

location然而据我所知,在命名位置不可能有嵌套块。

您是否有更好的想法来根据对实际 URI 的测试添加这些标头?

谢谢!

答案1

根据 Richard 对原帖的评论,我最初想到的解决方案不是坏的。

然而,由于我不想重复,我选择包含一个包含@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;
   }
}

将其发布在这里以防有人真的喜欢它。

如果您有更好的方法来处理这种情况,请告诉我,我很乐意听取您的选择!

相关内容