Nginx

使用嵌套位置正則表達式在命名位置添加代理標頭

  • January 25, 2017

我正在嘗試使用 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;
  }
}

在此處發布此內容,以防有人可能真的喜歡這種方式。

如果您有更好的方法來處理這種情況,請告訴我,我很樂意有您的選擇!

引用自:https://serverfault.com/questions/828546