nginx dividir arquivo de configuração grande

16

Meu arquivo de configuração padrão do nginx está se tornando enorme. Gostaria de dividi-lo em arquivos de configuração menores, cada um incluindo apenas um, no máximo 4 locais para cada arquivo, para que eu possa ativar / desativar rapidamente.

O arquivo real fica assim:

server {
    listen 80 default_server;
    root /var/www/

    location /1 {
        config info...;
    }

    location /2 {
        config info....;
    }        
    location /abc {
        proxy_pass...;
    }

    location /xyz {
        fastcgi_pass....;
    }
    location /5678ab {
        config info...;
    }

    location /admin {
        config info....;
    }

Agora, se eu quiser dividir isso para ter apenas alguns locais em cada arquivo (locais pertencentes um ao outro), qual seria a maneira correta de fazê-lo sem causar caos (como declarar raiz em cada arquivo, portanto, ter caminhos estranhos que o nginx tenta encontrar arquivos)?

oliverjkb
fonte

Respostas:

22

Você provavelmente está procurando a includefunção do Nginx : http://nginx.org/en/docs/ngx_core_module.html#include

Você pode usá-lo assim:

server {
  listen 80;
  server_name example.com;
  […]
  include conf/location.conf;
}

include também aceita curingas para que você também possa escrever

include include/*.conf;

para incluir todos os arquivos * .conf no diretório include .

FLXN
fonte
Eu já considerei isso, mas ignorei, porque significaria editar o conteúdo dos arquivos, em vez de apenas desvincular os arquivos da pasta habilitada para sites.
23915 oliverjkb
@ardukar, então sua solução foi usar a pasta habilitada para sites?
Mark Stosberg
Estou um pouco confuso agora ...
FLXN
Desculpe por responder tão tarde! Parece que não li a notificação. -.- Já estou usando a solução da FLXN. Mas isso não me faz feliz. Como estou construindo um servidor para uma empresa menor, onde a administração é feita exclusivamente via navegador, prefiro não querer fazer alterações dentro de um arquivo. Se um serviço for desativado pelo navegador, quero que a subpasta (digamos 'local') no nginx também seja desativada, portanto, desvincular o arquivo de configuração na pasta habilitada para sites parece ser a melhor ideia.
Oliverjkb
5

Você pode criar pastas de sites com

mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled

# E depois divida seu your_config.confarquivo grande em arquivos menores sites-available/com:

YOURCONF="/etc/nginx/conf.d/your_config.conf"
cd /etc/nginx
mkdir -p sites-available sites-enabled
cd  sites-available/
csplit "$YOURCONF" '/^\s*server\s*{*$/' {*}
for i in xx*; do
  new=$(grep -oPm1 '(?<=server_name).+(?=;)' $i|sed -e 's/\(\w\) /\1_/g'|xargs);
  if [[ -e $new.conf ]] ; then
    echo "" >>$new.conf
    cat "$i">>$new.conf
    rm "$i"
  else
    mv "$i" $new.conf
  fi
done

(Eu aprimorei isso a partir desta fonte: /programming//a/9635153/1069083 )

Certifique-se de adicionar isso no final dentro do httpbloco do seu /etc/nginx/conf.d/*.conf;:

include /etc/nginx/sites-enabled/*.conf; 

Nota: os comentários fora dos serverblocos são cortados na parte inferior de cada arquivo, portanto, não deve haver comentários ANTES de um serverbloco. mova os comentários na primeira linha DENTRO do bloco.

rubo77
fonte