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

Установка 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

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

Теги

Let's Encrypt — настройка certbot в Ubuntu 22

Установим и настроим certbot для получения и обновления SSL сертификатов Let's Encrypt. Операционная система Ubuntu 22.04.4, веб-сервер Nginx. Настраивать будем на примере развёрнутого SeaFile.

Теги