Які найкращі практики ви використовуєте під час використання NGinx?
Які найкращі практики ви використовуєте під час використання NGinx?
Відповіді:
Як комбінувати блоки HTTP та HTTPS.
server {
listen 80;
listen 443 default ssl;
# other directives
}
Це було розміщено як відповідь на інше запитання. Дивіться тут .
Напевно, найкращі поради, які я коли-небудь бачив, - від автора на його сторінці про підводні камені: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
Як правило, використання "якщо" є поганою практикою (за словами автора nginx). якщо можливо, краще скористатись пробним файлом директив error_page, а не "if (-f ...)"
Поєднуючи підказку з файлом maintenence.html та підказку з try_files, ми отримуємо:
Місцезнаходження / { try_files /maintenance.html $ uri $ uri / @wordpress; }
Коли технічне обслуговування закінчується, просто mv support.html від $ root.
if (-f ...) { return 503; }
і error_page 503 /maintenance.html
. Що ти думаєш?
Налаштуйте 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
Часто ефективніше використовувати 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;
}
empty_gif
Модуль також дуже корисно, особливо якщо вам потрібно відповідей монітор з веб - сервера ( з допомогою Nagios / моніт / і т.д.):
location /token {
empty_gif;
}
location /favicon.ico {
empty_gif;
}
location /img/1px.gif {
empty_gif;
}
access_log off;
для цих локацій є звичайною практикою
Ми створили Nginx разом із шеф-кухарем, використовуючи цю кулінарну книгу, яка містить сценарії для обробки конфігурації nginx, аналогічну тому, як Debian робить Apache2, а також деякі зразки шаблонів із звичайними за замовчуванням.
Ось хороший метод повернення сторінки обслуговування. Усі запити переписуються і повертається правильний 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;
}
if
заяві, якщо ви правильно його використовуєте - документи говорять, що if
s безпечний, якщо ви просто робиш return xxx;
.
location = /maintenance.html { break; }
потрібно?
З nginx 0.7.12 і пізніше "" можна використовувати в ім'я_сервера для лову запитів без заголовка "Хост".
Ви можете використовувати наступне в якості опису для невизначених віртуальних хостів.
server {
server_name _ "";
}
Я також опублікував деякий час тому про те, як правильно обробляти компресію gzip за допомогою nginx, оскільки у старих браузерах можуть виникнути проблеми із простою заявою gzip. HTH.
http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx
Я не знаю, чи це найкраща практика, але, безумовно, акуратний злом, щоб отримати вкладені умови в 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.
}
}
Якщо вам потрібно контекстно переходити між 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;
}
}
Я завжди намагаюся використовувати root
директиву у верхній частині серверного блоку, щоб я міг скористатися $document_root
змінною і ніколи, але ніколи не включати root
директиву всередині блоку розташування.
Пастки Сторінка з Nginx вікі має деякі відмінні поради про кращі практики.
Якщо ви використовуєте nginx як проксі, налаштування тайм-ауту може бути важливим для того, щоб у вас не було підключень nginx до того, як ваша програма буде виконана з ними, особливо якщо ви маєте справу з додатком із високим трафіком:
proxy_connect_timeout
proxy_send_timeout
Ви тут зазирнули?