Mejores prácticas de NGinx

46

¿Qué mejores prácticas utilizas mientras usas NGinx?

The Pixel Developer
fuente
Solo una nota de que esto no funciona para una configuración de Magento. Todavía estoy investigando las razones, pero creo que tiene algo que ver con la cadena de consulta.
Jauder Ho
location / wordpress debe ser útil cuando tienes wordpress en el subdirectorio llamado "wordpress". ¿Qué pasa cuando tenemos WordPress en la raíz web "/"?
rahul286

Respuestas:

21

Cómo combinar bloques HTTP y HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Esto fue publicado como respuesta a una pregunta diferente. Vea aquí .

Jauder Ho
fuente
15

En general, usar "if" es una mala práctica (según el autor de nginx). si es posible, mejor usar try_file de las directivas error_page en lugar de "if (-f ...)"

Combinando tip con maintenence.html y tip con try_files obtenemos:

ubicación / {
    archivos_probar /maintenance.html $ uri $ uri / @wordpress;
}

Cuando finaliza el mantenimiento, solo mv maintenance.html de $ root.

Slava K
fuente
16
Esto no es ideal ya que /maintenance.html se servirá como una respuesta 200. Probablemente desee que los motores de búsqueda reconozcan que la página de mantenimiento no es su sitio web real. Probablemente desee devolver un 503 (Servicio temporalmente no disponible). La única forma en que puedo descubrir cómo hacer esto es con un if (-f ...) { return 503; }y error_page 503 /maintenance.html. ¿Qué piensas?
Aaron Gibralter
8

A menudo es más eficiente usar la mapdirectiva en lugar de expresiones regulares al cambiar la raíz por subdominios coincidentes:

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
fuente
55
sabes que puedes hacer server_name mysite.tld * .mysite.tld
Desconocido
8

El empty_gifmódulo también es muy útil, especialmente si necesita monitorear las respuestas del servidor web (usando nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 
Phillip B Oldham
fuente
1
¿Puedes proporcionar un ejemplo del mundo real para esto? Todavía no entiendo completamente cómo es útil.
The Pixel Developer
1
@ The Pixel Developer, solo es realmente útil para la velocidad. Nginx guarda los datos de un gif vacío en la memoria para que nunca tenga que cargarse desde el disco.
Desconocido
55
también access_log off;para esos lugares es una práctica común
SaveTheRbtz el
6

Configuramos Nginx con Chef, usando este libro de cocina que contiene scripts para manejar la configuración de nginx de forma similar a como Debian hace Apache2, y también algunas plantillas de muestra con valores predeterminados sanos.

jtimberman
fuente
5

Aquí hay un buen método para devolver una página de mantenimiento. Todas las solicitudes se reescriben y se devuelve el código http correcto. (503 Servicio no Disponible)

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
fuente
1
En realidad, no estoy de acuerdo: agregué un comentario a serverfault.com/questions/18994/nginx-best-practices/… . Básicamente, desea devolver un error 503 o, de lo contrario, los robots e indexadores pensarán que su página de mantenimiento es parte de su sitio real ... No hay nada malo con una ifdeclaración si la usa correctamente; los documentos dicen que ifson seguros si usted solo lo estás haciendo return xxx;.
Aaron Gibralter
Además, ¿es location = /maintenance.html { break; }necesario?
Aaron Gibralter
4

Desde nginx 0.7.12 y posteriores, se puede usar un "" en server_name para capturar solicitudes sin un encabezado "Host".

Puede usar lo siguiente como un catchall para hosts virtuales indefinidos.

server {
  server_name _ "";
}
Desconocido
fuente
¿Su ejemplo funciona solo para solicitudes con un vhost indefinido o también funcionará con solicitudes con un vhost desconocido (incorrecto)?
Benoit
@Benoit funciona para cualquier cosa que no esté definida.
Desconocido
¿"Server_name _ *" no es compatible con nginx 0.7 en adelante?
rahul286
1
Tenga en cuenta que esto es solo parcialmente cierto. "" detectará un encabezado de Host PERDIDO, pero no capturará una solicitud con un encabezado de Host que no coincida con nada. Si desea un bloque de servidor general, vea el indicador default_server debajo de la directiva listen.
Martin Fjordvald
3

No sé si es una mejor práctica, pero definitivamente es un buen truco para obtener condiciones anidadas en nginx. Aquí hay una muestra de la wiki de 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
fuente
3
Lo pondría en la categoría de "práctica fea pero ocasionalmente necesaria", ciertamente no es algo para alentar.
womble
2

Si necesita alternar contextualmente entre http y https para subdominios manejados por el mismo bloque de servidor, puede usar variables para hacerlo. Puede que no sea la forma más eficiente de hacer las cosas, pero 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
fuente
2

Siempre trato de usar la rootdirectiva en la parte superior del bloque del servidor para poder aprovechar la $document_rootvariable y nunca, pero nunca, incluir la rootdirectiva dentro de un bloque de ubicación.

La página Pitfalls de la wiki de Nginx tiene algunos consejos excelentes sobre las mejores prácticas.

pablox
fuente
1

Si está usando nginx como proxy, tener la configuración de tiempo de espera ajustada puede ser importante para asegurarse de que no tenga conexiones nginx drop antes de que su aplicación termine con ellas, especialmente si se trata de una aplicación de alto tráfico:

proxy_connect_timeout
proxy_send_timeout
wjimenez5271
fuente