Настройка nginx на облачном сервере linux

Статья описывает основные шаги по настройке nginx на облачном сервере linux для работы веб приложения.

В данной статье рассматриваются основные шаги по настройке nginx на облачном сервере linux.

Установка основных пакетов

Устанавливаем nginx: 

1sudo apt-get install nginx

После установки проверяем что сервис запущен:

1sudo systemctl status nginx

Добавляем бота для работы с сертификатами Let’s encrypt. Он позволит автоматически генерировать и продлевать ssl сертификаты для сайтов.

1sudo apt-get install software-properties-common 2sudo add-apt-repository ppa:certbot/certbot 3sudo apt-get update 4sudo apt-get install python-certbot-nginx

Базовая настройка nginx

Базовый файл настроек nginx.conf располагается в /etc/nginx и выглядит следующим образом:

1user www-data; 2worker_processes auto; 3pid /run/nginx.pid; 4include /etc/nginx/modules-enabled/*.conf; 5 6events { 7 worker_connections 768; 8 # multi_accept on; 9} 10 11http { 12 sendfile on; 13 tcp_nopush on; 14 tcp_nodelay on; 15 keepalive_timeout 65; 16 types_hash_max_size 2048; 17 server_tokens off; 18 client_max_body_size 200m; 19 server_name_in_redirect off; 20 21 include /etc/nginx/mime.types; 22 default_type application/octet-stream; 23 24 access_log /var/log/nginx/access.log; 25 error_log /var/log/nginx/error.log; 26 27 gzip on; 28 29 gzip_proxied any; 30 gzip_comp_level 3; 31 gzip_min_length 1000; 32 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 33 34 include /etc/nginx/conf.d/*.conf; 35 include /etc/nginx/sites-enabled/*; 36}

Настройка работы сайтов на 80 порту

Создаем в каталоге /etc/nginx/conf.d пустой файл с названием сайта и добавляем в него:

1server { 2 listen 80; 3 listen [::]:80; 4 5 server_name sitename.com www.sitename.com; 6 7 location / { 8 proxy_pass http://localhost:8888; 9 } 10}

Данные директивы перенаправят запросы к сайтам sitename.com и www.sitename.com на порт 8888 локальной машины. Это может быть докер контейнер или что-то еще.

После этого просим nginx протестировать обновленные конфигурационные файлы:

1nginx -t

И если ошибок нет, то подгружаем обновленный файл конфигурации:

1nginx -s reload

Проверяем доступность сайта через браузер по нешифрованному протоколу http://sitename.com. В случае если не открывается, можно проверить, к какому ip привязано доменное имя в DNS с помощью команды dig:

1dig sitename.com

Если А запись содержит ip соответсвующий ip облачного сервиса, то стоит обратиться к логам nginx, которые располагаются в файлах /var/log/nginx/error.log и /var/log/nginx/access.log. Если же ip другой, то следует проанализировать настройки DNS.

Настройка работы сайта на 443 порту

Генерируем ключ шифрования для сервера. Это нужно сделать только один раз при создании сервера.

1sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Добавляем к nginx папку со сниппетами сертификатов.

1sudo mkdir -p /etc/nginx/snippets/ 2sudo nano /etc/nginx/snippets/ssl-params.conf

Добавляем в файл текст ниже.

1ssl_session_timeout 1d; 2ssl_session_cache shared:SSL:10m; # about 40000 sessions 3ssl_session_tickets off; 4 5ssl_dhparam /etc/ssl/certs/dhparam.pem; 6 7ssl_protocols TLSv1.2 TLSv1.3; 8ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; 9ssl_prefer_server_ciphers off; 10 11add_header Strict-Transport-Security "max-age=63072000" always;

Эти параметры будут применяться ко всем сайтам, использующим ssl. Мы перечислим их один раз в этом файле, чтобы затем переиспользовать там, где это необходимо. Больше информации по параметрам настройки ssl в файле можно найти тут.

Запускаем команду на генерацию нового сертификата.

1sudo certbot --nginx certonly

После запуска команды, выбираем сайты, для которых необходимо создание сертификата, и в результате в разделе important notes будет указан путь где сохранился сертификат. Обычно это папка /etc/letsencrypt/live/. Далее открываем файл настроек сайта в директории conf.d и изменяеего.

1server { 2 listen 80; 3 listen [::]:80; 4 5 server_name sitename.com www.sitename.com 6 return 301 https://sitename.com$request_uri; # редиректим 80 порт на 443 7} 8 9server { 10 listen 443 ssl http2; 11 listen [::]:443 ssl http2; 12 13 server_name www.sitename.com; 14 return 301 https://sitename.com$request_uri; 15 16 ssl_certificate /path/to/signed_cert_plus_intermediates; # путь из предудущей команды 17 ssl_certificate_key /path/to/private_key; 18 ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; 19 20 include snippets/ssl-params.conf; 21} 22 23server { 24 listen 443 ssl http2; 25 listen [::]:443 ssl http2; 26 27 server_name sitename.com; 28 location / { 29 proxy_pass http://localhost:8888; 30 } 31 32 ssl_certificate /path/to/signed_cert_plus_intermediates; 33 ssl_certificate_key /path/to/private_key; 34 ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; 35 36 include snippets/ssl-params.conf; 37}

Для сайтов, доступнных на 80 порту и на 443, но с субдоменом www, мы добавляем редирект на sitename.com. И также добавляем сам сайт sitename.com, указав, что требуется перенаправление запросов на сервис, которые работает локально на 8000 порту, с помощью директивы proxy_pass. Такая конструкция обычно используется, если сервис запущен в докере локально.

В случае если у вас статические файлы, как например в react simgle page application, то директива location может выглядить следующим образом:

1location / { 2 root /usr/share/nginx/html; 3 index index.html index.htm; 4 try_files \$uri /index.html; 5 }

В данном случае собранная с помощью команды build сборка react приложения должна находиться в папке /usr/share/nginx/html.

Также нужно обратить внимание, что и для сайта www.sitename.com также указаны ssl сертификаты. Без них браузер может не дать произвести редирект, начав ругаться на то, что сертификата нет.

Для каждого из ssl сайтов был добавлен сниппет, созданный ранее, для того чтобы избежать повторяющихся настроек и уменьшить объем файла.

1include snippets/ssl-params.conf;

Это были основные шаги при настройке nginx.

Тэги:
common
Дата публикации:
21.09.2023

avatar
master
Admin

Похожие статьи