nginx best practices

NGINX – це швидкий та надійний веб-сервер з відкритим кодом. Він придбав свою популярність завдяки низькому споживанню пам’яті, високій масштабованості, простоті конфігурації та підтримці переважної більшості різних протоколів.

Даний сервер я часто використовую у своїх проектах. Для свого нового проекту по тренуванню швидкості друку https://keypro.io також вирішив використати цей сервер, а заодно і налаштувати його якомога ефективніше.

Коротко розглянемо як налаштувати HTTPS за допомогою SSL сертифікату, увімкнути HTTP/2 протокол, налаштувати GZIP стиснення та увімкнути кешування. Фінальну версію файлів налаштування можна знайти на GitHub.

Генерування SSL сертифікату Let’s Encrypt за допомогою Certbot

Let’s Encrypt є центром сертифікації (Certificate Authority, CA), що дозволяє отримувати та встановлювати безкоштовні сертифікати TLS/SSL, тим самим дозволяючи використовувати шифрований HTTPS на веб-серверах. Процес отримання сертифікатів спрощується шляхом наявності клієнта Certbot, який намагається автоматизувати велику частину (якщо не всі) необхідних операцій. В даний час весь процес отримання та установки сертифікатів повністю автоматизований і для Apache і для Nginx.

Встановимо Certbot на сервер. Спочатку додаємо репозиторій.

sudo add-apt-repository ppa:certbot/certbot

add-apt-repository не входить в стандартний пакет Ubuntu тому його потрібно встановити додатково.

Встановимо пакет Certbot для Nginx за допомогою apt:

sudo apt install python-certbot-nginx

Отримуємо SSL сертифікат. Certbot надає кілька способів отримання сертифікатів SSL з використанням плагінів. Плагін для Nginx бере на себе налаштування Nginx і перезавантаження конфігурації, коли це необхідно. Для використання плагіну виконаємо команду:

sudo certbot --nginx -d example.com -d www.example.com

example.com замінюємо на назву свого домену.

Після цього всі необхідні сертифікати будуть згенеровані, а Nginx автоматично оновлений. Дані сертифікати видаються терміном на 3 місяці. Certbot автоматично додає нову таску в cronjobs яка буде кожен день оновлювати сертифікати.

Детальніше можна прочитати тут.

Налаштування HTTP/2 протоколу

HTTP/2 – це нова версія транспортного протоколу гіпертексту, яка використовується в Інтернеті для доставлення сторінок з сервера на браузер. HTTP/2 – це перше суттєве оновлення HTTP за майже два десятиліття: HTTP1.1 був представлений громадськості ще в 1999 році, коли веб-сторінки були просто одним HTML-файлом із вбудованою таблицею стилів CSS. Інтернет з цього часу сильно змінився, і тепер ми стикаємося з обмеженнями HTTP 1.1 – протокол обмежує потенційні швидкості передачі для більшості сучасних веб-сайтів, оскільки він завантажує частини сторінки почергово (попередній запит повинен повністю завантажитися перед завантаженням наступного), а середня сучасна веб-сторінка потребує завантаження близько 100 запитів (кожен запит – це зображення, js-файл, файл css тощо).

Тут все просто. Перш за все необхідно встановити останню версію Nginx. Після налаштування SSL сертифікатів можна легко увімкнути HTTP2 протокол.

listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot  
listen 443 ssl http2; # managed by Certbot

В рядках де вказується порт 443 для прослуховування, відразу за ssl додаємо http2 команду.

Після внесення змін у файл налаштування потрібно перевірити коректність за допомогою команди:

sudo nginx -t

Яка повинна повернути наступний результат:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Якщо все ОК то можна перезавантажити сервер.

sudo systemctl restart nginx

або

sudo service nginx restart

Щоб перевірити що зміни працюють, необхідно в DevTool браузера Chrome перевірити протокол.

Поле протокол буде мати значення h2.

Налаштування стиснення файлів GZIP

Зменшення розміру файлів, що передаються, може зробити завантаження веб-сайту не тільки швидшим, але і дешевшим для тих, хто повинен платити за трафік. Можна звернути увагу на підхід Mobile First.

gzip – популярна програма стиснення даних. Ви можете налаштувати Nginx для використання gzip для стиснення файлів, які він обслуговує на льоту. Потім ці файли декомпресуються браузерами без втрати якості.

Налаштувати можна дефолтний файл конфігурації всього Nginx або для конкретного сайту. Я налаштував лише для свого сайту. Тому редагуємо файл:

sudo nano /etc/nginx/sites-available/example.com

Даний файл повинен бути створений окремо спеціально для налаштувань конкретного домену. Ну і звичайно example.com повинно бути змінено на назву вашого сайту. Дописуємо наступні зміни:

gzip on;  
gzip_min_length 10240;  
gzip_comp_level 9;  
gzip_vary on;  
gzip_disable msie6;  
gzip_proxied any;  
gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml application/rss+xml application/atom+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
  • gzip on; – вмикає gzip стиснення
  • gzip_vary on: – говорить proxies кешувати як gzipped так і regular версії ресурсів
  • gzip_min_length 1024; – інформує NGINX щоб не стискати файли меншим розміром
  • gzip_proxied – стискати дані навіть для клієнтів які підключенні через проксі. В даному випадку для всіх клієнтів
  • gzip_types – перераховуємо тифи файлів для яких застосовувати стиснення
  • gzip_disable msie6; – вимикаємо стиснення для Internet Explorer версій 1-6
  • gzip_comp_level 9; – вказуємо ступінь стиснення. За замовчуванням стоїть 1. Максимальне значення 9.

Для перевірки відкриваємо наший сайт і дивимось на Response Headers і шукаємо там content-encoding: gzip

Вмикаємо кешування файлів

Редагуємо той самий файл що і для стиснення. Дописуємо наступний код:

# cache informations about FDs, frequently accessed files  
# can boost performance, but you need to test those values  
open_file_cache max=200000 inactive=20s;  
open_file_cache_valid 30s;  
open_file_cache_min_uses 2;  
open_file_cache_errors on;  
location ~* \.(ttf|eot|svg|woff|jpg|jpeg|png|ico|css|js)$ 
{  
    expires 1y;  add_header Cache-Controll public; }

Вказуємо щоб статичні файли кешувались клієнтом на 1 рік.

Налаштовуємо редірект з http на https

Оскільки ми використовували Certbot для підключення HTTPS, то процес налаштування редіректа максимально спрощується. При генеруванні сертифікатів він запитує чи увімкнути перенаправлення. В результаті конфігурація виглядає наступним чином:

server {     
if ($host = www.example.com) {
     return 301 https://$host$request_uri;     
} # managed by Certbot     
if ($host = example.com) {
     return 301 https://$host$request_uri;     
} # managed by Certbot     
listen 80;     
listen [::]:80;     
server_name example.com www.example.com;     
return 404; # managed by Certbot }

Додаткові налаштування

Ховаємо версію Nginx сервера з відповіді. Це зробить сервер більше безпечним. Якщо хтось спробує зламати його – це буде важче не знаючи точну версію сервера.

server_tokens off;

Вказуємо дозволені шифри SSL. Шифри задаються в форматі, підтримуваному бібліотекою OpenSSL. Вказуємо лише сучасні та безпечні, ніяких MD5.

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Результат роботи можна знайти на GitHub.

Схожі статті