[
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Elasticweb.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# Полезные шаблоны конфигов для Nginx\n\nПереведено и дополнено на основе репозитория [nginx-conf](https://github.com/lebinh/nginx-conf) от [@lebinh](https://github.com/lebinh)\n\n## Содержание\n- [Команды Nginx](#Команды-nginx)\n- [Location блок на PHP](#location-блок-на-php)\n- [Rewrite и Redirection](#rewrite-и-redirection)\n    - [Force www](#force-www)\n    - [Force no-www](#force-no-www)\n    - [Force HTTPS](#force-https)\n    - [Force Trailing Slash](#force-trailing-slash)\n    - [Редирект на страницу](#Редирект-на-страницу)\n    - [Редирект на сайт](#Редирект-на-сайт)\n    - [Редирект на определенный путь в URI](#Редирект-на-определенный-путь-в-uri)\n- [Производительность](#Производительность)\n    - [Кэширование](#Кэширование)\n    - [Gzip сжатие](#gzip-сжатие)\n    - [Кэш файлов](#Кэш-файлов)\n    - [SSL Кэш](#ssl-кэш)\n    - [Поддержка Upstream](#Поддержка-upstream)\n- [Мониторинг](#Мониторинг)\n- [Безопасность](#Безопасность)\n    - [Активация базовой аунтификации](#Активация-базовой-аунтификации)\n    - [Открыть только локальный доступ](#Открыть-только-локальный-доступ)\n    - [Защита SSL настроек](#Защита-ssl-настроек)\n- [Прочее](#Прочее)\n    - [Подзапросы после завершения](#Подзапросы-после-завершения)\n    - [Распределение ресурсов между источниками](#Распределение-ресурсов-между-источниками)\n- [Источники](#Источники)\n\n\n## Команды Nginx\nОсновные команды для выполнения базовый операций во время работы Nginx.\n\n* `nginx -V` - проверить версию Nginx, его скомпилированные параметры конфигурации и установленные модули.\n* `nginx -t` - протестировать конфигурационный файл и проверить его расположение.\n* `nginx -s reload` - перезапустить конфигурационный файл без перезагрузки Nginx.\n\n## Location блок на PHP\nПростой шаблон для быстрой и легкой установки PHP, FPM или CGI на ваш сайт.\n```\nlocation ~ \\.php$ {\n  try_files $uri =404;\n  client_max_body_size 64m;\n  client_body_buffer_size 128k;\n  include fastcgi_params;\n  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n  fastcgi_pass unix:/path/to/php.sock;\n}\n```\n## Rewrite и Redirection\n### Force www\n[Корректный способ](http://nginx.org/en/docs/http/converting_rewrite_rules.html) определить удаленный сервер по домену без *www* и перенаправить его c *www*:\n```\nserver {\n  listen 80;\n  server_name example.org;\n  return 301 $scheme://www.example.org$request_uri;\n}\n\nserver {\n  listen 80;\n  server_name www.example.org;\n  ...\n}\n```\n*Также работает для HTTPS *\n\n### Force no-www\nКорректный способ определить удаленный сервер по домену c *www* и перенаправить его без *www*:\n```\nserver {\n  listen 80;\n  server_name example.org;\n}\n\nserver {\n  listen 80;\n  server_name www.example.org;\n  return 301 $scheme://example.org$request_uri;\n}\n```\n### Force HTTPS\nСпособ для переадресации с HTTP на HTTPS:  \n```\nserver {\n  listen 80;\n  return 301 https://$host$request_uri;\n}\n\nserver {\n  listen 443 ssl;\n\n  # let the browsers know that we only accept HTTPS\n  add_header Strict-Transport-Security max-age=2592000;\n\n  ...\n}\n```\n### Force Trailing Slash\nДанная строка добавляет слэш `/` в конце каждого URL, только в том случаее если в URL нет точки или параметров. Тоесть после *example.com/index.php* или *example.com/do?some=123* слэш не поставится.  \n```\nrewrite ^([^.\\?]*[^/])$ $1/ permanent;\n```\n### Редирект на страницу\n```\nserver {\n  location = /oldpage.html {\n    return 301 http://example.org/newpage.html;\n  }\n}\n```\n### Редирект на сайт\n```\nserver {\n  server_name old-site.com\n  return 301 $scheme://new-site.com$request_uri;\n}\n```\n### Редирект на определенный путь в URI\n```\nlocation /old-site {\n  rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent;\n}\n```\n## Производительность\n\n### Кэширование\nНавсегда разрешить браузерам кэшировать статические содержимое. Nginx установит оба заголовка: Expires и Cache-Control.\n```\nlocation /static {\n  root /data;\n  expires max;\n}\n```\nЗапретить кэширование браузерам (например для отслеживания запросов) можно следующим образом:\n```\nlocation = /empty.gif {\n  empty_gif;\n  expires -1;\n}\n```\n### Gzip сжатие\n```\ngzip  on;\ngzip_buffers 16 8k;\ngzip_comp_level 6;\ngzip_http_version 1.1;\ngzip_min_length 256;\ngzip_proxied any;\ngzip_vary on;\ngzip_types\n  text/xml\n  application/xml\n  application/atom+xml\n  application/rss+xml\n  application/xhtml+xml\n  image/svg+xml\n  text/javascript\n  application/javascript\n  application/x-javascript\n  text/x-json\n  application/json\n  application/x-web-app-manifest+json\n  text/css\n  text/plain\n  text/x-component\n  font/opentype\n  application/x-font-ttf\n  application/vnd.ms-fontobject\n  image/x-icon;\ngzip_disable \"msie6\";\n```\n### Кэш файлов\nЕсли у вас кешируется большое количество статических файлов через Nginx, то кэширование метаданных этих файлов позволит сэкономить время задержки.\n```\nopen_file_cache max=1000 inactive=20s;\nopen_file_cache_valid 30s;\nopen_file_cache_min_uses 2;\nopen_file_cache_errors on;\n```\n### SSL кэш\nПодключение SSL кэширования позволит возобновлять SSL сессии и сократить время к следующим обращениям к SSL/TLS протоколу.\n```\nssl_session_cache shared:SSL:10m;\nssl_session_timeout 10m;\n```\n### Поддержка Upstream\nАктивация кеширования c использованием Upstream подключений:\n```\nupstream backend {\n  server 127.0.0.1:8080;\n  keepalive 32;\n}\n\nserver {\n  ...\n  location /api/ {\n    proxy_pass http://backend;\n    proxy_http_version 1.1;\n    proxy_set_header Connection \"\";\n  }\n}\n```\n### Мониторинг\nПо умолчанию [Stub Status](http://nginx.org/ru/docs/http/ngx_http_stub_status_module.html) модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра —with-http_stub_status_module и активировать с помощью:\n```\nlocation /status {\n  stub_status on;\n  access_log off;\n}\n```\nДанная настройка позволит вам получать статус в обычном текстовом формате по общему количеству запросов и клиентским подключениям (принятым, обработанным, активным).\n\nБолее информативный статус от Nginx можно получить с помощью [Luameter](https://luameter.com/), который несколько сложнее в установке и требует наличия Nginx Lua модуля. Это предоставит следующие метрики по различным конфигурационным группам в формате JSON:\n\n* Общее количество запросов/ответов.\n* Общее количество ответов сгруппирированных по статус кодам: 1xx, 2xx, 3xx, 4xx, 5xx.\n*  Общее количество байт принятых/отправленных клиенту.\n*  Промежуточные отрезки времени для оценки минимума, максимума, медианы, задержек и тд.\n* Среднестатистическое количество запросов для простоты мониторинга и составления прогнозов по нагрузке.\n* [И прочее...](https://luameter.com/metrics)\n\n[Пример дашборда от Luameter](https://luameter.com/demo).\n\nТакже для сбора статистики отлично подходит [ngxtop](https://github.com/lebinh/ngxtop).\n\n## Безопасность\n### Активация базовой аунтификации\nДля начала вам потребуется создать пароль и сохранить его в обычной текстовом файле:\n```\nимя:пароль\n```\n\nЗатем установить найтройки для server/location блока, который необходимо защитить:\n```\nauth_basic \"This is Protected\";\nauth_basic_user_file /path/to/password-file;\n```\n### Открыть только локальный доступ\n```\nlocation /local {\n  allow 127.0.0.1;\n  deny all;\n  ...\n}\n```\n### Защита SSL настроек\n* Отключить SSLv3, если он включен по умолчанию. Это предотвратит [POODLE SSL Attack](http://nginx.com/blog/nginx-poodle-ssl/).\n* Шифры, которые наилучшим образом обеспечат защиту. [Mozilla Server Side TLS and Nginx](https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx).\n\n\t\t# don’t use SSLv3 ref: POODLE CVE-2014-356 - http://nginx.com/blog/nginx-poodle-ssl/\n\t\tssl_protocols  TLSv1 TLSv1.1 TLSv1.2;  \n\n\t\t# 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\n\t\t    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';\n\t\tssl_prefer_server_ciphers  on;\n\n## Прочее\n###Подзапросы после завершения\nБывают ситуации, когда вам необходимо передать запрос на другой бэкэнд **в дополнении или после его обработки**. Первый случай -  отслеживать количество завершенных загрузок путем вызова API, после того как пользователь скачал файл. Второй случай  -отслеживать запрос, к которому вы бы хотели вернуться как можно быстрее (возможно с пустым .gif) и сделать соответствующие записи в фоновом режиме.  [**post_action**](http://wiki.nginx.org/HttpCoreModule#post_action), который позволяет вам определить подзапрос и будет отклонен по окончанию текущего запроса - является [лучшим решением](http://mailman.nginx.org/pipermail/nginx/2008-April/004524.html) для обоих вариантов.\n```\nlocation = /empty.gif {\n  empty_gif;\n  expires -1;\n  post_action @track;\n}\n\nlocation @track {\n  internal;\n  proxy_pass http://tracking-backend;\n}\n```\n### Распределение ресурсов между источниками\n\nСамый простой и наиболее известный способ кросс-доменного запроса на ваш сервер:\n```\nlocation ~* \\.(eot|ttf|woff) {\n  add_header Access-Control-Allow-Origin *;\n}\n```\n## Источники\n\n- [Nginx Official Guide](http://nginx.com/resources/admin-guide/)\n- [HTML 5 Boilerplate's Sample Nginx Configuration](https://github.com/h5bp/server-configs-nginx)\n- [Nginx Pitfalls](http://wiki.nginx.org/Pitfalls)\n"
  }
]