├── LICENSE └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Elasticweb.org 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Полезные шаблоны конфигов для Nginx 2 | 3 | Переведено и дополнено на основе репозитория [nginx-conf](https://github.com/lebinh/nginx-conf) от [@lebinh](https://github.com/lebinh) 4 | 5 | ## Содержание 6 | - [Команды Nginx](#Команды-nginx) 7 | - [Location блок на PHP](#location-блок-на-php) 8 | - [Rewrite и Redirection](#rewrite-и-redirection) 9 | - [Force www](#force-www) 10 | - [Force no-www](#force-no-www) 11 | - [Force HTTPS](#force-https) 12 | - [Force Trailing Slash](#force-trailing-slash) 13 | - [Редирект на страницу](#Редирект-на-страницу) 14 | - [Редирект на сайт](#Редирект-на-сайт) 15 | - [Редирект на определенный путь в URI](#Редирект-на-определенный-путь-в-uri) 16 | - [Производительность](#Производительность) 17 | - [Кэширование](#Кэширование) 18 | - [Gzip сжатие](#gzip-сжатие) 19 | - [Кэш файлов](#Кэш-файлов) 20 | - [SSL Кэш](#ssl-кэш) 21 | - [Поддержка Upstream](#Поддержка-upstream) 22 | - [Мониторинг](#Мониторинг) 23 | - [Безопасность](#Безопасность) 24 | - [Активация базовой аунтификации](#Активация-базовой-аунтификации) 25 | - [Открыть только локальный доступ](#Открыть-только-локальный-доступ) 26 | - [Защита SSL настроек](#Защита-ssl-настроек) 27 | - [Прочее](#Прочее) 28 | - [Подзапросы после завершения](#Подзапросы-после-завершения) 29 | - [Распределение ресурсов между источниками](#Распределение-ресурсов-между-источниками) 30 | - [Источники](#Источники) 31 | 32 | 33 | ## Команды Nginx 34 | Основные команды для выполнения базовый операций во время работы Nginx. 35 | 36 | * `nginx -V` - проверить версию Nginx, его скомпилированные параметры конфигурации и установленные модули. 37 | * `nginx -t` - протестировать конфигурационный файл и проверить его расположение. 38 | * `nginx -s reload` - перезапустить конфигурационный файл без перезагрузки Nginx. 39 | 40 | ## Location блок на PHP 41 | Простой шаблон для быстрой и легкой установки PHP, FPM или CGI на ваш сайт. 42 | ``` 43 | location ~ \.php$ { 44 | try_files $uri =404; 45 | client_max_body_size 64m; 46 | client_body_buffer_size 128k; 47 | include fastcgi_params; 48 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 49 | fastcgi_pass unix:/path/to/php.sock; 50 | } 51 | ``` 52 | ## Rewrite и Redirection 53 | ### Force www 54 | [Корректный способ](http://nginx.org/en/docs/http/converting_rewrite_rules.html) определить удаленный сервер по домену без *www* и перенаправить его c *www*: 55 | ``` 56 | server { 57 | listen 80; 58 | server_name example.org; 59 | return 301 $scheme://www.example.org$request_uri; 60 | } 61 | 62 | server { 63 | listen 80; 64 | server_name www.example.org; 65 | ... 66 | } 67 | ``` 68 | *Также работает для HTTPS * 69 | 70 | ### Force no-www 71 | Корректный способ определить удаленный сервер по домену c *www* и перенаправить его без *www*: 72 | ``` 73 | server { 74 | listen 80; 75 | server_name example.org; 76 | } 77 | 78 | server { 79 | listen 80; 80 | server_name www.example.org; 81 | return 301 $scheme://example.org$request_uri; 82 | } 83 | ``` 84 | ### Force HTTPS 85 | Способ для переадресации с HTTP на HTTPS: 86 | ``` 87 | server { 88 | listen 80; 89 | return 301 https://$host$request_uri; 90 | } 91 | 92 | server { 93 | listen 443 ssl; 94 | 95 | # let the browsers know that we only accept HTTPS 96 | add_header Strict-Transport-Security max-age=2592000; 97 | 98 | ... 99 | } 100 | ``` 101 | ### Force Trailing Slash 102 | Данная строка добавляет слэш `/` в конце каждого URL, только в том случаее если в URL нет точки или параметров. Тоесть после *example.com/index.php* или *example.com/do?some=123* слэш не поставится. 103 | ``` 104 | rewrite ^([^.\?]*[^/])$ $1/ permanent; 105 | ``` 106 | ### Редирект на страницу 107 | ``` 108 | server { 109 | location = /oldpage.html { 110 | return 301 http://example.org/newpage.html; 111 | } 112 | } 113 | ``` 114 | ### Редирект на сайт 115 | ``` 116 | server { 117 | server_name old-site.com 118 | return 301 $scheme://new-site.com$request_uri; 119 | } 120 | ``` 121 | ### Редирект на определенный путь в URI 122 | ``` 123 | location /old-site { 124 | rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent; 125 | } 126 | ``` 127 | ## Производительность 128 | 129 | ### Кэширование 130 | Навсегда разрешить браузерам кэшировать статические содержимое. Nginx установит оба заголовка: Expires и Cache-Control. 131 | ``` 132 | location /static { 133 | root /data; 134 | expires max; 135 | } 136 | ``` 137 | Запретить кэширование браузерам (например для отслеживания запросов) можно следующим образом: 138 | ``` 139 | location = /empty.gif { 140 | empty_gif; 141 | expires -1; 142 | } 143 | ``` 144 | ### Gzip сжатие 145 | ``` 146 | gzip on; 147 | gzip_buffers 16 8k; 148 | gzip_comp_level 6; 149 | gzip_http_version 1.1; 150 | gzip_min_length 256; 151 | gzip_proxied any; 152 | gzip_vary on; 153 | gzip_types 154 | text/xml 155 | application/xml 156 | application/atom+xml 157 | application/rss+xml 158 | application/xhtml+xml 159 | image/svg+xml 160 | text/javascript 161 | application/javascript 162 | application/x-javascript 163 | text/x-json 164 | application/json 165 | application/x-web-app-manifest+json 166 | text/css 167 | text/plain 168 | text/x-component 169 | font/opentype 170 | application/x-font-ttf 171 | application/vnd.ms-fontobject 172 | image/x-icon; 173 | gzip_disable "msie6"; 174 | ``` 175 | ### Кэш файлов 176 | Если у вас кешируется большое количество статических файлов через Nginx, то кэширование метаданных этих файлов позволит сэкономить время задержки. 177 | ``` 178 | open_file_cache max=1000 inactive=20s; 179 | open_file_cache_valid 30s; 180 | open_file_cache_min_uses 2; 181 | open_file_cache_errors on; 182 | ``` 183 | ### SSL кэш 184 | Подключение SSL кэширования позволит возобновлять SSL сессии и сократить время к следующим обращениям к SSL/TLS протоколу. 185 | ``` 186 | ssl_session_cache shared:SSL:10m; 187 | ssl_session_timeout 10m; 188 | ``` 189 | ### Поддержка Upstream 190 | Активация кеширования c использованием Upstream подключений: 191 | ``` 192 | upstream backend { 193 | server 127.0.0.1:8080; 194 | keepalive 32; 195 | } 196 | 197 | server { 198 | ... 199 | location /api/ { 200 | proxy_pass http://backend; 201 | proxy_http_version 1.1; 202 | proxy_set_header Connection ""; 203 | } 204 | } 205 | ``` 206 | ### Мониторинг 207 | По умолчанию [Stub Status](http://nginx.org/ru/docs/http/ngx_http_stub_status_module.html) модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра —with-http_stub_status_module и активировать с помощью: 208 | ``` 209 | location /status { 210 | stub_status on; 211 | access_log off; 212 | } 213 | ``` 214 | Данная настройка позволит вам получать статус в обычном текстовом формате по общему количеству запросов и клиентским подключениям (принятым, обработанным, активным). 215 | 216 | Более информативный статус от Nginx можно получить с помощью [Luameter](https://luameter.com/), который несколько сложнее в установке и требует наличия Nginx Lua модуля. Это предоставит следующие метрики по различным конфигурационным группам в формате JSON: 217 | 218 | * Общее количество запросов/ответов. 219 | * Общее количество ответов сгруппирированных по статус кодам: 1xx, 2xx, 3xx, 4xx, 5xx. 220 | * Общее количество байт принятых/отправленных клиенту. 221 | * Промежуточные отрезки времени для оценки минимума, максимума, медианы, задержек и тд. 222 | * Среднестатистическое количество запросов для простоты мониторинга и составления прогнозов по нагрузке. 223 | * [И прочее...](https://luameter.com/metrics) 224 | 225 | [Пример дашборда от Luameter](https://luameter.com/demo). 226 | 227 | Также для сбора статистики отлично подходит [ngxtop](https://github.com/lebinh/ngxtop). 228 | 229 | ## Безопасность 230 | ### Активация базовой аунтификации 231 | Для начала вам потребуется создать пароль и сохранить его в обычной текстовом файле: 232 | ``` 233 | имя:пароль 234 | ``` 235 | 236 | Затем установить найтройки для server/location блока, который необходимо защитить: 237 | ``` 238 | auth_basic "This is Protected"; 239 | auth_basic_user_file /path/to/password-file; 240 | ``` 241 | ### Открыть только локальный доступ 242 | ``` 243 | location /local { 244 | allow 127.0.0.1; 245 | deny all; 246 | ... 247 | } 248 | ``` 249 | ### Защита SSL настроек 250 | * Отключить SSLv3, если он включен по умолчанию. Это предотвратит [POODLE SSL Attack](http://nginx.com/blog/nginx-poodle-ssl/). 251 | * Шифры, которые наилучшим образом обеспечат защиту. [Mozilla Server Side TLS and Nginx](https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx). 252 | 253 | # don’t use SSLv3 ref: POODLE CVE-2014-356 - http://nginx.com/blog/nginx-poodle-ssl/ 254 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 255 | 256 | # 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 257 | 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'; 258 | ssl_prefer_server_ciphers on; 259 | 260 | ## Прочее 261 | ###Подзапросы после завершения 262 | Бывают ситуации, когда вам необходимо передать запрос на другой бэкэнд **в дополнении или после его обработки**. Первый случай - отслеживать количество завершенных загрузок путем вызова API, после того как пользователь скачал файл. Второй случай -отслеживать запрос, к которому вы бы хотели вернуться как можно быстрее (возможно с пустым .gif) и сделать соответствующие записи в фоновом режиме. [**post_action**](http://wiki.nginx.org/HttpCoreModule#post_action), который позволяет вам определить подзапрос и будет отклонен по окончанию текущего запроса - является [лучшим решением](http://mailman.nginx.org/pipermail/nginx/2008-April/004524.html) для обоих вариантов. 263 | ``` 264 | location = /empty.gif { 265 | empty_gif; 266 | expires -1; 267 | post_action @track; 268 | } 269 | 270 | location @track { 271 | internal; 272 | proxy_pass http://tracking-backend; 273 | } 274 | ``` 275 | ### Распределение ресурсов между источниками 276 | 277 | Самый простой и наиболее известный способ кросс-доменного запроса на ваш сервер: 278 | ``` 279 | location ~* \.(eot|ttf|woff) { 280 | add_header Access-Control-Allow-Origin *; 281 | } 282 | ``` 283 | ## Источники 284 | 285 | - [Nginx Official Guide](http://nginx.com/resources/admin-guide/) 286 | - [HTML 5 Boilerplate's Sample Nginx Configuration](https://github.com/h5bp/server-configs-nginx) 287 | - [Nginx Pitfalls](http://wiki.nginx.org/Pitfalls) 288 | --------------------------------------------------------------------------------