it-swarm-ru.tech

NGinx Best Practices

Какие лучшие практики вы используете при использовании NGinx?

46
The Pixel Developer

Безусловно, лучшие советы, которые я когда-либо видел , получены от автора на его странице ловушек: https://www.nginx.com/ресурсы/вики/запуск/темы/учебники/config_pitfalls /

21
Roger

Как объединить блоки HTTP и HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Это было опубликовано как ответ на другой вопрос. см. Здесь .

21
Jauder Ho

Как правило, использование "если" является плохой практикой (по мнению автора nginx). если возможно, лучше использовать try_file директив error_page вместо "if (-f ...)"

Комбинируя tip с файлом maintenence.html и tip с try_files, мы получаем:

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

Когда обслуживание закончится, просто запустите mv maintenance.html из $ root.

15
Slava K

Настройте nginx для использования более надежных шифров SSL. По умолчанию SSLv2 включен (который вы должны отключить, если это возможно).

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

11
Jauder Ho

Часто более эффективно использовать директиву map вместо регулярных выражений при переключении корня для соответствующих поддоменов:

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;

}
8
Phillip B Oldham

empty_gif модуль также очень полезен, особенно если вам нужно отслеживать ответы от веб-сервера (используя nagios/monit/etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 
8
Phillip B Oldham

Мы настроили Nginx с помощью Chef, используя эта кулинарная книга , которая содержит сценарии для обработки конфигурации nginx, аналогичные тому, как Debian выполняет Apache2, а также некоторые примеры шаблонов со стандартными значениями по умолчанию.

6
jtimberman

Вот хороший способ вернуть страницу обслуживания. Все запросы переписываются и возвращается правильный http-код. (503 Служба Недоступна)

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;
}
5
The Pixel Developer

Начиная с nginx 0.7.12 и более поздних, в server_name можно использовать "" для перехвата запросов без заголовка "Host".

Вы можете использовать следующее как ловушку для неопределенных виртуальных хостов.

server {
  server_name _ "";
}
4
Unknown

Некоторое время назад я также писал о том, как правильно обрабатывать сжатие gzip с помощью nginx, так как в старых браузерах могут возникнуть проблемы только с общим выражением gzip. НТН.

http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx

3
Jauder Ho

Я не знаю, является ли это наилучшей практикой, но, безусловно, это хороший способ получить вложенные условия в nginx. Вот пример из вики 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.
  } 
}
3
sajal

Если вам нужно контекстно переключаться между http и https для поддоменов, обрабатываемых одним и тем же блоком сервера, вы можете использовать переменные для этого. Возможно, это не самый эффективный способ, но он работает:

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;
  }

}
2
Phillip B Oldham

Я всегда стараюсь использовать директиву root в верхней части блока сервера, чтобы использовать преимущества $document_root переменная и никогда, но никогда, не включайте директиву root внутри блока местоположения.

В Pitfalls Page из вики Nginx есть несколько полезных советов о лучших практиках.

2
Pablo Olmos de Aguilera C.

Если вы используете nginx в качестве прокси-сервера, то изменение настроек тайм-аута может быть важно, чтобы убедиться, что у вас нет разрываемых соединений nginx до того, как ваше приложение будет с ними работать, особенно если вы работаете с приложением с высоким трафиком:

proxy_connect_timeout
proxy_send_timeout
1
wjimenez5271
0
KPWINC