Adicione cabeçalhos de proxy na localização nomeada usando regex de localização aninhada

2

Estou tentando configurar um endpoint WebSocket na minha API Rails usando Nginx e Puma.

O que eu tenho (trabalhando, mas feio)

A seguinte configuração do Nginx funciona bem , no entanto, sinto que posso usar algo mais inteligente para evitar duplicação nos locais com @puma e @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;
   }
}

Note: I'm using a regex for the WS location (~ ^/api/websocket) because in my actual use case I need to have more than one WS endpoints. I simplified for the sake of this post's simplicity.

Idéia inicial

Minha primeira ideia era ter apenas um local nomeado @puma , que teria um local aninhado com o regex que adicionaria apenas os dois proxy_set_header necessários.

Dessa forma, eu teria apenas um try_files com o único local com nome @puma , que adicionaria os cabeçalhos por si só usando um location

aninhado

No entanto, não é possível ter o bloco location aninhado em um local nomeado.

Você tem uma ideia melhor para adicionar esses cabeçalhos com base em um teste no URI real?

Obrigado!

    
por Jordan Becker 25.01.2017 / 15:31

1 resposta

1

De acordo com Richard, de seu comentário no post original, a solução original que surgiu não é que é ruim.

No entanto, como gosto de não me repetir, optei por incluir um arquivo que contém a parte de configuração comum entre @puma e @puma_ws .

Então, estou acabando com algo assim:

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

Arquivo de configuração do host

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

Publicando isso aqui caso alguém realmente goste desse jeito.

Por favor, diga-me se você tem uma maneira melhor de lidar com essa situação, eu adoraria ter sua opinião!

    
por 25.01.2017 / 17:12