Quais são os diferentes usos para sites disponíveis versus o diretório conf.d para nginx

99

Eu tenho alguma experiência usando linux, mas nenhum usando nginx. Fui encarregado de pesquisar opções de balanceamento de carga para um servidor de aplicativos.

Eu usei o apt-get para instalar o nginx e tudo parece bem.

Eu tenho algumas perguntas.

Qual é a diferença entre a pasta disponível em sites e a pasta conf.d. Ambas as pastas foram INCLUÍDAS na configuração padrão do nginx. Os tutoriais usam os dois. Para que servem e qual é a melhor prática?

Para que é usada a pasta habilitada para sites? Como eu uso isso?

A configuração padrão faz referência a um usuário www-data? Eu tenho que criar esse usuário? Como concedo a esse usuário permissões ideais para executar o nginx?

Seth Spearman
fonte
Tente evitar a oscilação do escopo ao fazer uma pergunta; www-dataé um tópico separado. A maioria dos sistemas operacionais define um usuário separado com permissões mais baixas que o processo pode executar após a ligação à porta 80 como raiz. É definido no arquivo de configuração. Aplique práticas básicas de segurança a partir daí; não permita que o usuário grave nada em que o servidor da web não precise gravar, não permita que outros usuários gravem nos arquivos, a menos que seja deliberado.
Andrew B

Respostas:

94

As pastas sites- * são gerenciadas por nginx_ensitee nginx_dissite. Para usuários httpd do Apache que encontrarem isso com uma pesquisa, os equivalentes são a2ensite/ a2dissite.

A sites-availablepasta é para armazenar todas as suas configurações de vhost, estejam elas ativadas ou não.

A sites-enabledpasta contém links simbólicos para arquivos na pasta disponível em sites. Isso permite que você desative seletivamente vhosts removendo o link simbólico.

conf.dfaz o trabalho, mas você precisa mover algo para fora da pasta, excluí-lo ou fazer alterações quando precisar desabilitar algo. A abstração da pasta sites- * torna as coisas um pouco mais organizadas e permite gerenciá-las com scripts de suporte separados.

(a menos que você seja como eu e um dos muitos administradores do debian que acabou de gerenciar os links simbólicos diretamente, sem conhecer os scripts ...)

Andrew B
fonte
12
Eu entendi algo errado? Não entendendo o voto negativo.
Andrew B
1
Estou curioso, isso está embutido no Nginx? i instalado manualmente github.com/perusio/nginx_ensite
lfender6445
18
É importante notar que isso sites-available|sites-enabledé um debian-ism e não é algo que o nginx ou o Apache fazem. Provavelmente era bastante útil no passado, mas sua utilidade é um pouco limitada em uma era de gerenciamento de configuração e contêineres.
Michael Hampton
Você pode comentar como o gerenciamento de configuração e os contêineres limitam o utilitário de sites disponíveis | habilitados para sites?
karthik vee
1
@karthikvee o ponto é que hoje em dia os servidores costumam aparecer como contêineres efêmeros que servem apenas um único site / serviço; portanto, isso pode ser incluído nginx.confsem perda de legibilidade. Isso é contrário à abordagem de alguns anos atrás, quando os servidores normalmente armazenavam dezenas de sites.
adamczi 07/07
38

Gostaria de acrescentar às respostas anteriores que o mais importante não é como você chama os diretórios (embora seja uma convenção muito útil), mas o que você realmente inseriu nginx.conf. Exemplo de configuração:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}

A única diretiva usada aqui é include , portanto não há diferença interna entre eg conf.d/e sites-enabled/.

A partir da documentação acima:

Syntax:     include file | mask;
Default:    —
Context:    any

Includes another file, or files matching the specified mask, 
into configuration. Included files should consist of 
syntactically correct directives and blocks.

Portanto, para responder à pergunta original: não há diferença interna e você pode usá-las da melhor maneira possível, lembrando-se dos conselhos das outras respostas. E por favor, não esqueça de escolher a resposta 'certa'.

Yaroslav Nikitenko
fonte
1
Certo, sites-enabledfoi um pouco inventado por alguma distribuição, mexendo como um intermediário irritante. Vá pegar o nginx da fonte oficial : você obterá um produto atualizado, além de se livrar dessa porcaria de configuração / inferno.
Bernard Rosset
2
Isso explica por que não há uma única referência desta convenção de nomes na documentação oficial do Nginx. É um projeto de terceiros! github.com/perusio/nginx_ensite
AxeEffect
30

Normalmente, a sites-enabledpasta é usada para definições de host virtual, enquanto conf.dé usada para configuração global do servidor. Se você oferece suporte a vários sites - como hosts virtuais -, cada um obtém seu próprio arquivo, para que você possa habilitá-los e desabilitá-los com muita facilidade, entrando e saindo de arquivos sites-enabled(ou criando e removendo links simbólicos, o que provavelmente é uma ideia melhor).

Use conf.dpara coisas como carregamento de módulos, arquivos de log e outras coisas que não são específicas para um único host virtual.

A configuração padrão faz referência a um usuário www-data? Eu tenho que criar esse usuário?

Você deve ter o nginx em execução como um usuário não root. Em alguns casos www-data, isso é nomeado , mas você pode nomear o que quiser.

Como concedo a esse usuário permissões ideais para executar o nginx?

Tenho menos certeza da resposta a esta pergunta (não estou executando o nginx no momento), mas se for algo como o Apache, a resposta é que o www-datausuário só precisa de permissões de leitura para arquivos estáticos (e leia + execute nos diretórios ) que você está servindo ou lê / executa permissões em coisas como scripts CGI e nenhuma permissão em outro lugar.

larsks
fonte
1
ter um usuário dedicado para executar o servidor da web também é importante devido à desativação do recurso de login desse usuário, removendo o registro de shell válido.
DukeLion
> 'Você deve ter o nginx em execução como um usuário não root' - você poderia elaborar mais sobre isso?
lfender6445
1
A execução como um usuário não privilegiado é uma maneira de conter os danos que podem resultar de um comprometimento remoto. Se você estiver executando um servidor da Web roote houver algum tipo de comprometimento remoto, o invasor terá acesso total ao sistema imediatamente. Ao executar como um usuário sem privilégios, o acesso administrativo só estaria disponível em combinação com algum tipo de exploração local.
Larsks
14

O que está acontecendo?

Você deve estar usando Debian ou Ubuntu, pois o evil sites-available / sites-enabledlogic não é usado pelo pacote upstream do nginx em http://nginx.org/packages/ .

Em ambos os casos, ambos são implementados como uma convenção de configuração com a ajuda da includediretiva padrão no /etc/nginx/nginx.conf.

Aqui está um trecho de /etc/nginx/nginx.confum pacote oficial upstream do nginx do nginx.org:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

Aqui está um trecho /etc/nginx/nginx.confdo Debian / Ubuntu :

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Portanto, do ponto de vista do NGINX, a única diferença seria que os arquivos conf.dserão processados ​​mais cedo e, como tal, se você tiver configurações que conflitam silenciosamente entre si, as de conf.dpodem ter precedência sobre as do Windows sites-enabled.


As melhores práticas são conf.d.

Você deve estar usando /etc/nginx/conf.d, pois essa é uma convenção padrão e deve funcionar em qualquer lugar.

Se você precisar desativar um site, basta renomear o nome do arquivo para não ter mais um .confsufixo, muito fácil, direto e à prova de erros:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

Ou o contrário para ativar um site:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}


Evite sites-availablee a sites-enabledtodo custo.

Não vejo absolutamente nenhuma razão para usar sites-available/ sites-enabled:

  • Algumas pessoas mencionaram nginx_ensitee nginx_dissitescripts - os nomes desses scripts são ainda piores que o restante deste desastre - mas esses scripts também não são encontrados em nenhum lugar - eles estão ausentes no nginxpacote, mesmo no Debian (e provavelmente no Ubuntu também) , e também não está presente em um pacote, você realmente precisa de um script de terceiros não padrão para mover e / ou vincular os arquivos entre os dois diretórios ?!

  • E se você não estiver usando os scripts (que é, de fato, uma escolha inteligente, conforme mencionado acima), surge a questão de como você gerencia os sites:

    • Você cria links simbólicos de sites-availablepara sites-enabled?
    • Copiar os arquivos?
    • Mover os arquivos?
    • Edite os arquivos no local sites-enabled?

O exposto acima pode parecer alguns problemas menores a serem resolvidos, até que várias pessoas comecem a gerenciar o sistema ou até que você tome uma decisão rápida, apenas para esquecê-lo meses ou anos depois da linha…

O que nos leva a:

  • É seguro remover um arquivo sites-enabled? É um link suave? Um link rígido? Ou a única cópia da configuração? Um excelente exemplo de configuração infernal.

  • Quais sites foram desativados? (Com conf.d, basta fazer uma inversão de busca por arquivos que não terminem com .conf- find /etc/nginx/conf.d -not -name "*.conf"ou use grep -v.)

Não apenas todas as opções acima, mas também observe a includediretiva específica usada pelo Debian / Ubuntu - /etc/nginx/sites-enabled/*- nenhum sufixo de nome de arquivo é especificado sites-enabled, ao contrário de conf.d.

  • O que isso significa é que, se um dia você decidir editar rapidamente um ou dois arquivos /etc/nginx/sites-enablede emacscriar um arquivo de backup como default~, então, de repente, você terá os dois defaulte os default~incluirá como configuração ativa, que, dependendo das diretrizes usadas, pode nem fornecer quaisquer avisos e causar uma sessão de depuração prolongada. (Sim, aconteceu comigo; foi durante um hackathon e fiquei totalmente intrigado com o motivo de minha confissão não estar funcionando.)

Assim, estou convencido de que sites-enabledé puro mal!

cnst
fonte
Além de todas as opções acima, aparentemente, também é muito comum criar links simbólicos incorretos! stackoverflow.com/a/14107803/1122270 Apenas no caso de você não pensar que sites-enabledera suficientemente mau!
cnst 27/08/17
Ou, às vezes, pode acontecer que alguém decida editar os arquivos sites-enabled, mas outra pessoa decide desativá-lo, excluindo-o, possivelmente pensando que seja apenas um link simbólico, exigindo um despejo de memória subsequente do nginx heap para recuperar o arquivo conf: stackoverflow.com/q/45852224/1122270
cnst
Eu tenho que discordar das afirmações sobre sites-availablee sites-enabled; é importante poder preparar arquivos de configuração fora do diretório de recebimento 'live', de modo que, se o nginx fosse recarregado ou reiniciado, ele não pegaria arquivos de configuração parciais. Também pode ser útil manter os arquivos de configuração que não estão mais em uso ativo. Criar links simbólicos não é uma tarefa particularmente difícil se você tiver experiência suficiente para gerenciar o nginx em primeiro lugar, o IMO.
BE77Y
@ BE77Y você está adotando uma abordagem mais complicada. Na programação, é considerado uma prática recomendada remover completamente o código não utilizado, não apenas desabilitá-lo ou comentá-lo; Não vejo razão para que o DevOps seja diferente - se uma configuração não for mais necessária, remova-a (ela ainda deve existir no seu VCS). O mesmo acontece com os arquivos conf parciais - por que você os edita ativados e o nginx é recarregado nas suas costas? ( USR1, que reabre os logs, não recarrega o arquivo conf.) Acho que os comentários da "experiência" do link simbólico foram mal direcionados - o problema é uma questão de consistência, que pouco tem a ver com a experiência.
CNST
2
É claro que a) este não é o meio apropriado para esta discussão e, talvez ainda mais importante, b) provavelmente será infrutífero em qualquer caso. Vamos concordar em discordar.
BE77Y