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

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

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

Устанавливаем nginx:
sudo apt-get install nginx
После установки проверяем что сервис запущен:
sudo systemctl status nginx
Добавляем бота для работы с сертификатами Let’s encrypt. Он позволит автоматически генерировать и продлевать ssl сертификаты для сайтов.
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

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

Базовый файл настроек nginx.conf располагается в /etc/nginx и выглядит следующим образом:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;
    client_max_body_size 200m;
    server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;

    gzip_proxied any;
    gzip_comp_level 3;
    gzip_min_length 1000;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

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

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

    server_name sitename.com www.sitename.com;

    location / {
        proxy_pass http://localhost:8888;
    }
}
Данные директивы перенаправят запросы к сайтам sitename.com и www.sitename.com на порт 8888 локальной машины. Это может быть докер контейнер или что-то еще.

После этого просим nginx протестировать обновленные конфигурационные файлы:
nginx -t
И если ошибок нет, то подгружаем обновленный файл конфигурации:
nginx -s reload
Проверяем доступность сайта через браузер по нешифрованному протоколу http://sitename.com. В случае если не открывается, можно проверить, к какому ip привязано доменное имя в DNS с помощью команды dig:
dig sitename.com
Если А запись содержит ip соответсвующий ip облачного сервиса, то стоит обратиться к логам nginx, которые располагаются в файлах /var/log/nginx/error.log и /var/log/nginx/access.log. Если же ip другой, то следует проанализировать настройки DNS.

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

Генерируем ключ шифрования для сервера. Это нужно сделать только один раз при создании сервера.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Добавляем к nginx папку со сниппетами сертификатов.
sudo mkdir -p /etc/nginx/snippets/
sudo nano /etc/nginx/snippets/ssl-params.conf
Добавляем в файл текст ниже.
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m; # about 40000 sessions
ssl_session_tickets off;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_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;
ssl_prefer_server_ciphers off;

add_header Strict-Transport-Security "max-age=63072000" always;
Эти параметры будут применяться ко всем сайтам, использующим ssl. Мы перечислим их один раз в этом файле, чтобы затем переиспользовать там, где это необходимо. Больше информации по параметрам настройки ssl в файле можно найти тут.

Запускаем команду на генерацию нового сертификата.
sudo certbot --nginx certonly
После запуска команды, выбираем сайты, для которых необходимо создание сертификата, и в результате в разделе important notes будет указан путь где сохранился сертификат. Обычно это папка /etc/letsencrypt/live/. Далее открываем файл настроек сайта в директории conf.d и изменяеего.
server {
    listen 80;
    listen [::]:80;

    server_name sitename.com www.sitename.com
    return 301 https://sitename.com$request_uri; # редиректим 80 порт на 443
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name www.sitename.com;
    return 301 https://sitename.com$request_uri;

    ssl_certificate /path/to/signed_cert_plus_intermediates; # путь из предудущей команды
    ssl_certificate_key /path/to/private_key;
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    include snippets/ssl-params.conf;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name sitename.com;
    location / {
        proxy_pass http://localhost:8888;
    }

    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

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

В случае если у вас статические файлы, как например в react single page application, то директива location может выглядеть следующим образом:
location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files \$uri /index.html;
}
В данном случае собранная с помощью команды build сборка react приложения должна находиться в папке /usr/share/nginx/html.

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

Для каждого из ssl сайтов был добавлен сниппет, созданный ранее, для того чтобы избежать повторяющихся настроек и уменьшить объем файла.
include snippets/ssl-params.conf;
Это были основные шаги при настройке nginx.