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.