Найкращі практики NGinx


46

Які найкращі практики ви використовуєте під час використання NGinx?


Лише зауважте, що це не працює для установки Magento. Досі досліджую причини, але, думаю, це має щось спільне з рядком запиту.
Джадер Хо

розташування / wordpress має бути корисним, коли у вас є wordpress у підкаталозі під назвою "wordpress". Що робити, коли у нас є wordpress у веб-корені "/"?
rahul286

Відповіді:




15

Як правило, використання "якщо" є поганою практикою (за словами автора nginx). якщо можливо, краще скористатись пробним файлом директив error_page, а не "if (-f ...)"

Поєднуючи підказку з файлом maintenence.html та підказку з try_files, ми отримуємо:

Місцезнаходження / {
    try_files /maintenance.html $ uri $ uri / @wordpress;
}

Коли технічне обслуговування закінчується, просто mv support.html від $ root.


16
Це не ідеально, оскільки /mainnance.html буде подано у відповідь 200. Напевно, ви хочете, щоб пошукові системи визнавали, що сторінка технічного обслуговування не є вашим фактичним веб-сайтом. Ви, ймовірно, захочете повернути 503 (Служба тимчасово недоступна). Єдиний спосіб я зрозуміти, як це зробити - це за допомогою if (-f ...) { return 503; }і error_page 503 /maintenance.html. Що ти думаєш?
Аарон Гібралтер


8

Часто ефективніше використовувати 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;

}

5
ви знаєте, що ви можете зробити ім'я сервера mysite.tld * .mysite.tld
невідомо

8

empty_gifМодуль також дуже корисно, особливо якщо вам потрібно відповідей монітор з веб - сервера ( з допомогою Nagios / моніт / і т.д.):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 

1
Чи можете ви надати для цього приклад із реального світу? Я досі не повністю розумію, наскільки це корисно.
The Pixel Developer

1
@ Розробник Pixel, його єдиний справді корисний для швидкості. Nginx зберігає дані для порожнього gif в пам'яті, щоб ніколи не завантажуватися з диска.
Невідомо

5
також access_log off;для цих локацій є звичайною практикою
SaveTheRbtz

6

Ми створили Nginx разом із шеф-кухарем, використовуючи цю кулінарну книгу, яка містить сценарії для обробки конфігурації nginx, аналогічну тому, як Debian робить Apache2, а також деякі зразки шаблонів із звичайними за замовчуванням.


5

Ось хороший метод повернення сторінки обслуговування. Усі запити переписуються і повертається правильний 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;
}

1
Насправді я не згоден - я додав коментар до serverfault.com/questions/18994/nginx-best-practices/… . В основному, ви хочете повернути помилку 503, інакше боти та індексатори подумають, що ваша сторінка технічного обслуговування є частиною вашого фактичного веб-сайту ... Немає нічого поганого в ifзаяві, якщо ви правильно його використовуєте - документи говорять, що ifs безпечний, якщо ви просто робиш return xxx;.
Аарон Гібральтер

Також, чи location = /maintenance.html { break; }потрібно?
Аарон Гібралтер

4

З nginx 0.7.12 і пізніше "" можна використовувати в ім'я_сервера для лову запитів без заголовка "Хост".

Ви можете використовувати наступне в якості опису для невизначених віртуальних хостів.

server {
  server_name _ "";
}

Чи працює ваш зразок лише для запитів із невизначеним vhost або також буде працювати з запитами з невідомим (неправильним) vhost?
Бенуа

@Benoit працює для всього, що не визначено.
Невідомий

Чи "ім'я_сервера _ *" не підтримується nginx 0.7 далі?
rahul286

1
Зверніть увагу, це лише частково правда. "" вловить заголовок MISSING Host, але він не буде запитом із заголовком Host, який нічого не відповідає. Якщо ви хочете загальнодоступний блок сервера, перегляньте прапор default_server відповідно до директиви прослуховування.
Мартін Фьордвальд


3

Я не знаю, чи це найкраща практика, але, безумовно, акуратний злом, щоб отримати вкладені умови в 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
Я б поставив це до категорії "потворних, але час від часу необхідних занять" - звичайно, не те, що слід заохочувати.
живіт

2

Якщо вам потрібно контекстно переходити між 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

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

Пастки Сторінка з Nginx вікі має деякі відмінні поради про кращі практики.


1

Якщо ви використовуєте nginx як проксі, налаштування тайм-ауту може бути важливим для того, щоб у вас не було підключень nginx до того, як ваша програма буде виконана з ними, особливо якщо ви маєте справу з додатком із високим трафіком:

proxy_connect_timeout
proxy_send_timeout

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.