Перейти к основному содержанию

Установка Nginx на Ubuntu 22.04

Nginx

Для установки Nginx имеется инструкция:

https://nginx.org/ru/linux_packages.html

Мы её немного дополним начальной настройкой.

Установка Nginx

В стандартных репозиториях довольно старый пакет Nginx, так что будем устанавливать последний. Работаем под рутом.

Устанавливаем пакеты, необходимые для подключения apt-репозитория:

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

Импортируем официальный ключ, используемый apt для проверки подлинности пакетов:

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Проверяем, верный ли ключ был загружен:

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

Вывод команды должен содержать полный отпечаток ключа 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62:

pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>

nginx

Если отпечаток отличается от вышеуказанного, удалите файл ключа.

Подключаем репозиторий. Для подключения apt-репозитория для стабильной версии nginx:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Для подключения apt-репозитория для основной версии nginx (мой случай):

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Закрепим пакеты, чтобы они не тянулись из репозиториев Ubuntu, а брались только с репозитория nginx:

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

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

sudo apt update
sudo apt install nginx

Настройка Nginx

Включаем автостарт nginx:

systemctl enable --now nginx

Проверим статус:

systemctl status nginx

nginx

Nginx запущен: "Active: active (running)".

Проверим, какие порты прослушивает nginx:

netstat -plntu | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      102777/nginx: master

Видим, что Nginx слушает 80 порт на всех сетевых интерфейсах.

Создаём директорию для SSL сертификатов и ключей DH:

mkdir /etc/nginx/ssl

Создаём файл с параметрами DHE-шифрования:

openssl dhparam -out /etc/nginx/ssl/dhparams.pem 2048

Создадим директории для конфигурационных файлов сайтов.

mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled

Модифицируем настройки /etc/nginx/nginx.conf (для Nginx версии 1.26.x, для пользователя www-data):

  • user www-data;
    worker_processes auto;
    worker_cpu_affinity auto;
    worker_rlimit_nofile 10000;
    worker_shutdown_timeout 30;
    pid /var/run/nginx.pid;
    
    events {
            worker_connections 1024;
            # Для Linux 2.6+ - epool, Для FreeBSD - kqueue
            use epoll;
            multi_accept on;
    }
    
    http {
    
            ##
            # Basic Settings
            ##
            # Удаляем информацию об nginx в headers
            server_tokens off;
            # Метод отправки данных sendfile более эффективен, чем стандартный метод read+write (по умолчанию: off)
            sendfile on;
            # Будет отправлять заголовки и начало файла в одном пакете (по умолчанию: off)
            tcp_nopush on;
            tcp_nodelay on;
            # Будет ждать 60 секунд перед закрытием keepalive соединения (по умолчанию: 75s)
            keepalive_timeout 60s;
            # Задаёт максимальное число запросов, которые можно сделать по одному keep-alive соединению. После того, как сделано максимальное число запросов, соединение закрывается. (по умолчанию: 100)
            keepalive_requests 500;
            # Разрешает или запрещает сброс соединений по таймауту (по умолчанию: off)
            reset_timedout_connection on;
            # Будет ждать 30 секунд тело запроса от клиента, после чего сбросит соединение (по умолчанию: 60s)
            client_body_timeout 30s;
            # Не будет принимать запросы размером более 256Мб (по умолчанию: 1m)
            client_max_body_size 256m;
            # Если клиент прекратит чтение ответа, Nginx подождет 30 секунд и сбросит соединение (по умолчанию: 60s)
            send_timeout 30s;
            # Задаёт максимальный размер хэш-таблиц типов (по умолчанию: 1024)
            types_hash_max_size 2048;
            # Задаёт максимальный размер хэш-таблиц имён серверов (по умолчанию: 512)
            server_names_hash_max_size 8192;
            # Задаёт размер корзины в хэш-таблицах имён серверов (по умолчанию: зависит от размера строки кэша процессора)
            server_names_hash_bucket_size 128;
    
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
    
            ##
            # SSL Settings
            ##
            # Разрешает указанные протоколы
            ssl_protocols TLSv1.2;
            # Набор шифров, использовался сайт https://ssl-config.mozilla.org/ в режиме Intermediate
            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;
            # Задаем кривую для ECDHE-шифров
            ssl_ecdh_curve prime256v1:secp384r1:secp521r1;
            # Указываем, что при использовании протоколов SSLv3 и TLSv1 (мы их не используем, они устарели) серверные шифры были более приоритетны, чем клиентские
            ssl_prefer_server_ciphers off;
            # Указываем файл с параметрами для DHE-шифров
            ssl_dhparam /etc/nginx/ssl/dhparams.pem;
            # Задаём тип (разделяемый) и размеры кэшей для хранения параметров сессий
            ssl_session_cache shared:MAINSSL:10m;
            # Задаёт время, в течение которого клиент может повторно использовать параметры сессии
            ssl_session_timeout 1d;
    
            ##
            # Logging Settings
            ##
            log_format hosting '$remote_addr - $remote_user [$time_local] '
                            '"$request" $status $bytes_sent '
                            '"$http_referer" "$http_user_agent" '
                            '"$gzip_ratio"';
            log_format main '$remote_addr - $remote_user [$time_local] '
                            '"$request" $status $bytes_sent '
                            '"$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$host" $upstream_response_time';
            log_format bytes '$bytes_sent';
            log_format download '$remote_addr - $remote_user [$time_local] '
                            '"$request" $status $bytes_sent '
                            '"$http_referer" "$http_user_agent" '
                            '"$http_range" "$sent_http_content_range"';
            log_format postdata '$remote_addr [$time_local] "$request" $status "$request_body" "$http_cookie"';
    
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
    
            ##
            # Gzip Settings
            ##
            # Включаем сжатие gzip (по умолчанию: off)
            gzip on;
            # Устанавливает минимальную HTTP-версию запроса, необходимую для сжатия ответа. (по умолчанию: 1.1)
            gzip_http_version 1.0;
            # Задаёт число и размер буферов, в которые будет сжиматься ответ.
            gzip_buffers 64 8k;
            # Устанавливает степень сжатия ответа методом gzip. Более 5 лучше не ставить, т.к. будет повышеная нагрузка на CPU, а уровень сжатия изменится незначительно.
            gzip_comp_level 5;
            # Минимальная длина файла, которую нужно сжимать
            gzip_min_length 512;
            # MIME-типы файлов в дополнение к text/html, которые нужно сжимать
            gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
            # Для IE6 отключить
            gzip_disable msie6;
            # Cжатие для всех проксированных запросов (для работы NGINX+Apache)(по умолчанию: off)
            gzip_proxied any;
    
            ##
            # nginx fastcgi config
            ##
            # Задаёт размер буфера, в который будет читаться первая часть ответа, получаемого от FastCGI-сервера (по умолчанию: 4k или 8k)
            fastcgi_buffer_size 128k;
            # Задаёт число и размер буферов для одного соединения, в которые будет читаться ответ, получаемый от FastCGI-сервера(по умолчанию: 8 и 4k или 8k)
            fastcgi_buffers 4 256k;
            # При включённой буферизации ответов FastCGI-сервера, ограничивает суммарный размер буферов, которые могут быть заняты для отправки ответа клиенту, пока ответ ещё не прочитан целиком (по умолчанию 8k|16k размер ограничен двумя буферами, заданными директивами fastcgi_buffer_size и fastcgi_buffers)
            fastcgi_busy_buffers_size 256k;
            # Задаёт таймаут при чтении ответа FastCGI-сервера (по умолчанию: 60s)
            fastcgi_read_timeout 120s;
    
            ## Detect when HTTPS is used
            map $scheme $fastcgi_https {
              default off;
              https on;
            }
    
            ##
            # Virtual Host Configs
            ##
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    }

     Можно автоматически скачать конфигурационный файл, для пользователя nginx:

    wget https://gist.githubusercontent.com/CHERTS/4b1ad58e06404267591636a9f2b08114/raw/nginx.conf -O /etc/nginx/nginx.conf

Проверяем конфигурацию Nginx:

nginx -t

nginx

Ошибок нет, перезагружаем конфигурацию Nginx:

nginx -s reload

Меняем системные лимиты на количество открытых файлов. В nginx.conf параметр worker_rlimit_nofile = 10000, нужно настроить в системе то же самое. В Ubuntu используется система инициализации systemd и поэтому лимиты на максимальное количество открытых файлов нужно настроить для systemd:

mkdir -p /lib/systemd/system/nginx.service.d
echo "[Service]" >/lib/systemd/system/nginx.service.d/limit.conf
echo "LimitNOFILE=10000" >>/lib/systemd/system/nginx.service.d/limit.conf
systemctl daemon-reload
systemctl restart nginx

Проверим лимиты:

cat /proc/$(cat /var/run/nginx.pid)/limits

nginx

Смотрим Max open files. Видим наше значение 10000.

При начальной установке имеется один сайт по умолчанию "Welcome to nginx!". Его конфигурация находится в файле /etc/nginx/conf.d/default.conf:

cat /etc/nginx/conf.d/default.conf  | egrep -Ev "^\s*(;|#|$)"
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Начальная настройка завершена.

Теги

 

Похожие материалы

Обновляем Nginx на Ubuntu Server 20.04 из репозитория

Пришла задачка — обновить nginx на одном из web серверов. Главное требование, обновиться нужно на версию не ниже 1.21, потому что в более ранних версиях обнаружена какая-то уязвимость.

Теги