Você pode definir os locais de um servidor em vários arquivos de configuração do nginx?


14

Eu tenho vários aplicativos ruby ​​em execução no mesmo host:

~/app1
~/app2
~/app3

E eu quero ter o proxy nginx esses aplicativos usando subdiretórios como:

   http://example.com/app1
   http://example.com/app2
   http://example.com/app3

Estou curioso para saber se o nginx me permite definir esses locais em vários arquivos, para que eu possa manter cada configuração com o aplicativo, em vez de ter um arquivo de configuração monolítico para todos os aplicativos:

~/app1/nginx.conf
~/app2/nginx.conf
~/app3/nginx.conf

Minha tentativa ingênua de definir o servidor com uma diretiva de localização única em cada um dos 3 arquivos de configuração levou a conflicting server name "example.com" on [::]:80, ignoredconfigurações que se parecem com isso:

upstream app1 { server 127.0.0.1:4567; }
server {
  listen      [::]:80;
  listen      80;
  servername  example.com
  location    /app1 {
     proxy_pass  http://app1;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header X-Forwarded-Port $server_port;
     proxy_set_header X-Request-Start $msec;
  }
}

Existe uma maneira de organizar as configurações dessa maneira?

Respostas:


9

Você pode incluir configurações externas via include:

include /path/to/config1.conf;
include /path/to/config2.conf;
include /path/to/confdir/*.conf;

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;
}

E dentro da configuração separada, você pode usar qualquer bloco de código válido:

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}

5
Isso realmente funciona? O módulo upstream não precisa estar fora do bloco de módulos do servidor?
— Curley

5
Parece que a diretiva de localização não é permitida fora do bloco do servidor. Pelo menos para mim, os relatórios nginx "location" directive is not allowed here.
— Alexander Amelkin

Sim ... não vejo uma maneira simples de fazer isso corretamente, sem vários arquivos por aplicativo: um que funcione dentro de um bloco de servidor, outro que funcione fora. Eu acho que para a flexibilidade e para torná-lo limpar um curinga poderia ser usado: include /etc/nginx/above_server.d/*einclude /etc/nginx/in_server.d/*
— jeteon

1
Esta resposta está errada
— AmirHossein

11

Eu acredito que você poderia usar esta configuração:

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;

    include /path/to/applications/*/nginx.conf;
}

e, em seguida, no diretório de cada aplicativo, configure o redirecionamento da seguinte maneira:

location    /app1 {
    proxy_pass  http://app1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
}

2
A desvantagem seria que você não pode definir vários fluxos ascendentes dentro do serverbloco, mas acho que o caso de uso do OP é bem servido por esta resposta.
— jeteon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.