Práticas recomendadas do NGinx

46

Quais práticas recomendadas você usa ao usar o NGinx?

The Pixel Developer
fonte
Apenas observe que isso não funciona para uma configuração do Magento. Ainda estou investigando os motivos, mas acho que tem algo a ver com a string de consulta.
Jauder Ho 4/06/09
localização / wordpress deve ser útil quando você possui o wordpress no subdiretório chamado "wordpress". E quando temos o wordpress na raiz da web "/"?
rahul286

Respostas:

21

Como combinar blocos HTTP e HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Isso foi postado como resposta a uma pergunta diferente. Veja aqui .

Jauder Ho
fonte
15

Geralmente, usar "se" é uma má prática (de acordo com o autor do nginx). se possível, é melhor usar o try_file das diretivas error_page em vez de "if (-f ...)"

Combinando dica com o arquivo maintenence.html e dica com try_files, obtemos:

local / {
    try_files /maintenance.html $ uri $ uri / @wordpress;
}

Quando a manutenção terminar, apenas mv maintenance.html de $ root.

Slava K
fonte
16
Isso não é ideal, pois /maintenance.html será exibido como uma resposta de 200. Você provavelmente deseja que os mecanismos de pesquisa reconheçam que a página de manutenção não é o seu site real. Você provavelmente desejaria retornar um 503 (Serviço temporariamente indisponível). A única maneira de descobrir como fazer isso é com um if (-f ...) { return 503; }e error_page 503 /maintenance.html. O que você acha?
Aaron Gibralter
11

Configure o nginx para usar cifras SSL mais fortes. Por padrão, o SSLv2 está ativado (que você deve desativar, se possível).

ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;

http://tumblelog.jauderho.com/post/121851623/nginx-and-stronger-ssl

Jauder Ho
fonte
8

Geralmente é mais eficiente usar a mapdiretiva no lugar de expressões regulares ao alternar a raiz para subdomínios correspondentes:

server {

    server_name mysite.tld ~^.+\.mysite\.tld$;

    map $host $files {
        default            common;
        mysite.tld         common;
        www.mysite.tld     common;
        admin.mysite.tld   admin;
        system.mysite.tld  system;
        *.mysite.tld       users;
    }

    root /var/www/mysite/$files;

}
Phillip B Oldham
fonte
5
você sabe que pode fazer server_name mysite.tld * .mysite.tld
Desconhecido
8

O empty_gifmódulo também é muito útil, especialmente se você precisar monitorar as respostas do servidor da web (usando nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 
Phillip B Oldham
fonte
1
Você pode fornecer um exemplo do mundo real para isso? Ainda não entendo completamente como é útil.
The Pixel Developer
1
@ The Pixel Developer, só é realmente útil para velocidade. O Nginx mantém os dados de um gif vazio na memória para que ele nunca precise ser carregado do disco.
Desconhecido
5
Também access_log off;para esses locais é prática comum
SaveTheRbtz
6

Nós configuramos o Nginx com o Chef, usando este livro de receitas que contém scripts para lidar com a configuração do nginx semelhante à maneira como o Debian faz o Apache2, e também alguns modelos de amostra com padrões saudáveis.

jtimberman
fonte
5

Aqui está um bom método para retornar uma página de manutenção. Todas as solicitações são reescritas e o código http correto é retornado. (503 serviço indisponível)

error_page 503 /maintenance.html;

location /
{
    if (-f $document_root/maintenance.html)
    {
        return 503;
    }

    try_files $uri /index.php?$args;
}

location = /maintenance.html
{
    rewrite ^ /maintenance.html break;
}
The Pixel Developer
fonte
1
Na verdade, eu discordo - adicionei um comentário em serverfault.com/questions/18994/nginx-best-practices/… . Basicamente, você deseja retornar um erro 503 ou os bots e os indexadores acharão que sua página de manutenção faz parte do site atual ... Não há nada errado com uma ifdeclaração se você a usar corretamente - os documentos dizem que ifsão seguros se você estou apenas fazendo return xxx;.
Aaron Gibralter
Além disso, é location = /maintenance.html { break; }necessário?
Aaron Gibralter
4

A partir do nginx 0.7.12 e posterior, um "" é utilizável em server_name para capturar solicitações sem um cabeçalho "Host".

Você pode usar o seguinte como uma catchall para hosts virtuais indefinidos.

server {
  server_name _ "";
}
Desconhecido
fonte
Seu exemplo funciona apenas para solicitações com um vhost indefinido ou também funciona com solicitações com um vhost desconhecido (errado)?
Benoit
@Benoit funciona para qualquer coisa que não esteja definida.
314 Unknown
"Server_name _ *" não é suportado no nginx 0.7 em diante?
rahul286
1
Observe que isso é apenas parcialmente verdadeiro. "" capturará um cabeçalho MISSING Host, mas não capturará uma solicitação com um cabeçalho Host que não corresponda a nada. Se você deseja um bloco de servidor abrangente, consulte o sinalizador default_server sob a diretiva listen.
Martin Fjordvald
3

Não sei se é uma prática recomendada, mas definitivamente um truque interessante para obter condições aninhadas no nginx. Aqui está um exemplo do wiki nginx .

location /xxxx/ {
  set $test "";

  if ($request_method = POST) {
    set $test  P;
  }

  if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
    set $test  "${test}C";
  }

  if ($test = PC) {
    #rewrite rule goes here.
  } 
}
sajal
fonte
3
Eu colocaria isso na categoria de "prática feia, mas ocasionalmente necessária" - certamente não é algo a ser encorajado.
Womble
2

Se você precisar alternar contextualmente entre http e https para subdomínios manipulados pelo mesmo bloco de servidor, poderá usar variáveis ​​para fazer isso. Pode não ser a maneira mais eficiente de fazer as coisas, mas funciona:

server {
  server mysite.tld ~^.+\.mysite\.tld$;

  set $req_ssl = 0;

  map $host $files {
      default            common;
      mysite.tld         common;
      www.mysite.tld     common;
      admin.mysite.tld   admin;
      system.mysite.tld  system;
      *.mysite.tld       users;
  }

  root /var/www/mysite/$files;

  if ( $files = "admin" ){
    set $req_ssl 1;
  }

  if ( $files = "common" ){
    set $req_ssl 2;
  }

  if ( $scheme = http )
  {
    set $req_ssl $req_ssl.1;
  }

  if ( $scheme = https )
  {
    set $req_ssl $req_ssl.2;
  }

  if ($req_ssl = 1.1){
    rewrite ^ https://$host$uri;
  }

  if ($req_ssl = 2.2){
    rewrite ^ http://$host$uri;
  }

}
Phillip B Oldham
fonte
2

Eu sempre tento usar a rootdiretiva na parte superior do bloco do servidor para tirar proveito da $document_rootvariável e nunca, mas nunca, incluir a rootdiretiva dentro de um bloco de localização.

A página Pitfalls do wiki Nginx tem ótimas dicas sobre práticas recomendadas.

pablox
fonte
1

Se você estiver usando o nginx como proxy, ajustar as configurações de tempo limite pode ser importante para garantir que você não tenha conexões de queda do nginx antes que seu aplicativo seja concluído, especialmente se você estiver lidando com um aplicativo de alto tráfego:

proxy_connect_timeout
proxy_send_timeout
wjimenez5271
fonte