Какие лучшие практики вы используете при использовании 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). если возможно, лучше использовать try_file директив error_page вместо "if (-f ...)"
Объединяя tip с файлом maintenence.html и tip с try_files, мы получаем:
место нахождения / { try_files /maintenance.html $ uri $ uri / @wordpress; }
Когда обслуживание закончится, просто запустите mv maintenance.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 с помощью Chef, используя эту кулинарную книгу, которая содержит сценарии для обработки конфигурации 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_name можно использовать «» для перехвата запросов без заголовка «Host».
Вы можете использовать следующее как ловушку для неопределенных виртуальных хостов.
server {
server_name _ "";
}
Некоторое время назад я также писал о том, как правильно обрабатывать сжатие gzip с помощью nginx, так как в старых браузерах могут возникнуть проблемы только с общим выражением gzip. НТН.
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
Вы посмотрели здесь?