Добавить заголовки прокси в указанное местоположение с помощью регулярного выражения вложенного местоположения

Я пытаюсь настроить конечную точку 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 именованным местоположением, которое будет добавлять заголовки самостоятельно, используя вложенное местоположение

Однако, как правило, невозможно иметь вложенный блок местоположения в именованном местоположении.

Есть ли у вас лучшая идея добавить эти заголовки на основе теста на фактический URI?

Спасибо!

3
задан 25 January 2017 в 16:47
1 ответ

Согласно Ричарду из его комментария к исходному сообщению, исходное решение, которое я придумал, не , что плохо.

Однако, поскольку я предпочитаю избегать повторений Я решил включить файл, который содержит общую часть конфигурации между @puma и (скрытым). В итоге я получаю что-то вроде этого:

/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;
   }
}

Публикуем это здесь на случай, если кому-то это действительно понравится.

Скажите, пожалуйста, если у вас есть лучший способ справиться с этой ситуацией, я хотел бы получить ваше мнение!

1
ответ дан 3 December 2019 в 07:23

Теги

Похожие вопросы