====== Полезные шаблоны конфигов и сниппеты для 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]]