Добавьте заголовки прокси в именованном местоположении, используя регулярное выражение вложенного расположения
Я пытаюсь настроить конечную точку WebSocket в своем Rails API с помощью Nginx и Puma.
Что у меня (работает но некрасиво)
Следующая конфигурация 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?
Спасибо!
1 ответ
Согласно Ричарду из его комментария к оригинальному сообщению, оригинальное решение, которое я придумал, не так уж и плохо.
Однако, поскольку я не хочу повторяться, я решил включить файл, который содержит общую часть конфигурации между @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;
}
}
Размещать это здесь на тот случай, если кому-то это действительно понравится.
Пожалуйста, скажите мне, если у вас есть лучший способ справиться с этой ситуацией, я бы хотел получить ваше мнение!