====== Полезные шаблоны конфигов и сниппеты для Nginx ======
Готовые варианты конфигурации для NGINX, а также полезные сниппеты для настройки необходимых условий.
===== Команды Nginx =====
Основные команды для выполнения базовый операций во время работы NGINX.
* ''nginx -V'' - проверить версию NGINX, его скомпилированные параметры конфигурации и установленные модули.
* ''nginx -t'' - протестировать конфигурационный файл и проверить его расположение.
* ''nginx -s reload'' - перезапустить конфигурационный файл без перезагрузки NGINX.
===== Location блок на PHP =====
Простой шаблон для быстрой и легкой установки PHP, FPM или CGI на ваш сайт.
location ~ \.php$ {
try_files $uri =404;
client_max_body_size 64m;
client_body_buffer_size 128k;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/path/to/php.sock;
}
===== Rewrite и Redirection =====
==== Force www ====
[[https://nginx.org/en/docs/http/converting_rewrite_rules.html|Корректный способ]] определить удаленный сервер по домену без //www// и перенаправить его c //www//:
server {
listen 80;
server_name example.org;
return 301 $scheme://www.example.org$request_uri;
}
server {
listen 80;
server_name www.example.org;
...
}
//Также работает для HTTPS//
==== Force no-www ====
Корректный способ определить удаленный сервер по домену c //www// и перенаправить его без //www//:
|
server {
listen 80;
server_name example.org;
}
server {
listen 80;
server_name www.example.org;
return 301 $scheme://example.org$request_uri;
}
|
==== Force HTTPS ====
Способ для переадресации с HTTP на HTTPS:
|
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
# let the browsers know that we only accept HTTPS
add_header Strict-Transport-Security max-age=2592000;
...
}
|
==== Force Trailing Slash ====
Данная строка добавляет слэш ''/'' в конце каждого URL только в том случае, если в URL нет точки или параметров. То есть после //example.com/index.php// или //example.com/do?some=123// слэш не поставится.
|
rewrite ^([^.\?]*[^/])$ $1/ permanent;
|
==== Редирект на страницу ====
|
server {
location = /oldpage.html {
return 301 http://example.org/newpage.html;
}
}
|
==== Редирект на сайт ====
|
server {
server_name old-site.com
return 301 $scheme://new-site.com$request_uri;
}
|
==== Редирект на определенный путь в URI ====
|
location /old-site {
rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent;
}
|
===== Производительность =====
==== Кэширование ====
Навсегда разрешить браузерам кэшировать статические содержимое. NGINX установит оба заголовка: Expires и Cache-Control.
|
location /static {
root /data;
expires max;
}
|
Запретить кэширование браузерам (например для отслеживания запросов) можно следующим образом:
|
location = /empty.gif {
empty_gif;
expires -1;
}
|
==== Gzip сжатие ====
|
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
gzip_disable "msie6";
|
==== Кэш файлов ====
Если у вас кешируется большое количество статических файлов через NGINX, то кэширование метаданных этих файлов позволит сэкономить время задержки.
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
==== SSL кэш ====
Подключение SSL кэширования позволит возобновлять SSL сессии и сократить время к следующим обращениям к SSL/TLS протоколу.
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
==== Поддержка Upstream ====
Активация кеширования c использованием Upstream подключений:
upstream backend {
server 127.0.0.1:8080;
keepalive 32;
}
server {
...
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
==== Мониторинг ====
По умолчанию [[https://nginx.org/ru/docs/http/ngx_http_stub_status_module.html|Stub Status]] модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра —with-http_stub_status_module и активировать с помощью:
|
location /status {
stub_status on;
access_log off;
}
|
Данная настройка позволит вам получать статус в обычном текстовом формате по общему количеству запросов и клиентским подключениям (принятым, обработанным, активным).
Более информативный статус от NGINX можно получить с помощью [[https://luameter.com/|Luameter]], который несколько сложнее в установке и требует наличия NGINX Lua модуля. Это предоставит следующие метрики по различным конфигурационным группам в формате JSON:
* Общее количество запросов/ответов.
* Общее количество ответов сгруппирированных по статус кодам: 1xx, 2xx, 3xx, 4xx, 5xx.
* Общее количество байт принятых/отправленных клиенту.
* Промежуточные отрезки времени для оценки минимума, максимума, медианы, задержек и тд.
* Среднестатистическое количество запросов для простоты мониторинга и составления прогнозов по нагрузке.
* [[https://luameter.com/metrics|И прочее…]]
[[https://luameter.com/demo|Демо от Luameter]].
Также для сбора статистики отлично подходит [[https://github.com/lebinh/ngxtop|ngxtop]].
===== Безопасность =====
==== Активация базовой аунтификации ====
Для начала вам потребуется создать пароль и сохранить его в обычной текстовом файле:
имя:пароль
Затем установить настройки для server/location блока, который необходимо защитить:
auth_basic "This is Protected";
auth_basic_user_file /path/to/password-file;
==== Открыть только локальный доступ ====
location /local {
allow 127.0.0.1;
deny all;
...
}
==== Защита SSL настроек ====
* Отключить SSLv3, если он включен по умолчанию. Это предотвратит [[https://nginx.com/blog/nginx-poodle-ssl/|POODLE SSL Attack]].
* Шифры, которые наилучшим образом обеспечат защиту. [[https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx|Mozilla Server Side TLS and Nginx]].
====== don’t use SSLv3 ref: POODLE CVE-2014-356 - http://nginx.com/blog/nginx-poodle-ssl/ ======
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
====== Ciphers set to best allow protection from Beast, while providing forwarding secrecy, as defined by Mozilla (Intermediate Set) - https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx ======
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
===== Прочее =====
==== Подзапросы после завершения ====
Бывают ситуации, когда вам необходимо передать запрос на другой бэкэнд **в дополнении или после его обработки**. Первый случай - отслеживать количество завершенных загрузок путем вызова API, после того как пользователь скачал файл. Второй случай -отслеживать запрос, к которому вы бы хотели вернуться как можно быстрее (возможно с пустым .gif) и сделать соответствующие записи в фоновом режиме. **[[https://wiki.nginx.org/HttpCoreModule#post_action|post_action**]]** , который позволяет вам определить подзапрос и будет отклонен по окончанию текущего запроса - является [[https://mailman.nginx.org/pipermail/nginx/2008-April/004524.html|лучшим решением]] для обоих вариантов.
|
location = /empty.gif {
empty_gif;
expires -1;
post_action @track;
}
location @track {
internal;
proxy_pass http://tracking-backend;
}
|
==== Распределение ресурсов между источниками ====
Самый простой и наиболее известный способ кросс-доменного запроса на ваш сервер:
|
location ~* \.(eot|ttf|woff) {
add_header Access-Control-Allow-Origin *;
}
|
==== Коллекция готовых конфигурационных шаблонов для популярных CMS и фреймворков. ====
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/asgard-cms.conf|Asgard CMS]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/bolt-cms.conf|Bolt CMS]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/cms-made-simple.conf|CMS Made Simple]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/codeigniter.conf|Codeigniter]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/concerte5.conf|Concerte5]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/data-life-engine.conf|Data Life Engine]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/drupal-7-8.conf|Drupal 7, 8]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/fuelphp.conf|FuelPHP]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/ipb3.conf|Invision Power Board 3]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/joomla-2-3.conf|Joomla 2, 3]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/kodicms.conf|KodiCMS]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/kohana.conf|Kohana]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/laravel.conf|Laravel]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/maxsite-cms.conf|MaxSite CMS]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/mediawiki.conf|MediaWiki]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/modx-revolution.conf|MODx Revolution]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/octobercms.conf|Octobercms]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/opencart-15.conf|OpenCart 1.5]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/phalcon.conf|Phalcon]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/phpbb3.conf|phpBB3]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/processwire-2.conf|ProcessWire 2]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/symfony.conf|Symfony]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/umi-cms.conf|UMI.CMS]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/wordpress-4.conf|Wordpress 4]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/yii-advanced.conf|Yii Advanced]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/yii-basic.conf|Yii Basic]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/zencart-15.conf|ZenCart 1.5]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/zend-framework.conf|Zend Framework]]
* [[https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/nginx/1c-bitrix.conf|1C Bitrix]]
===== Источники =====
* [[https://nginx.com/resources/admin-guide/|Nginx Official Guide]]
* [[https://github.com/h5bp/server-configs-nginx|HTML 5 Boilerplate’s Sample Nginx Configuration]]
* [[https://wiki.nginx.org/Pitfalls|Nginx Pitfalls]]