- Nginx — высокопроизводительный веб-сервер
- Установка и настройка php-fpm
- Настройка безопасного соединения
- Безопасность сайтов в nginx
- Установка nginx в Linux
- Для deb-based дистрибутивов (Debian и другие)
- Для rpm-based (CentOS и прочие)
- Запуск nginx
- Nginx в Docker
- Список запущенных контейнеров
- Структура каталогов nginx
- Установка и конфигурация nginx в Linux
- Первичная настройка nginx
- Пример конфигурации nginx.conf
- Создание файла конфигурации для сайта
- Перезапуск nginx и проверка конфигурации
- Автоматическое обновление SSL-сертификатов Let’s Encrypt
- Пример конфигурации
- Редирект с http на https
- Директивы nginx
- Переменные в nginx
- Команды nginx
- Статические файлы
- Кэширование в nginx
- Мониторинг nginx
- Балансировка нагрузки
- Безопасность сайтов в nginx
- Предотвращение DDoS атак
- Ошибки nginx
- Bad Gateway
- Service Unavailable
- Gateway Time-out
- Forbidden
- Not Found
- Заключение
- Известные проблемы и рекомендации
- Создаем локальный реестр образов
- Устанавливаем GitLab
- Создаем проект и добавляем ssh-ключ
Nginx — высокопроизводительный веб-сервер
Nginx — высокопроизводительный веб-сервер и почтовый прокси-сервер с открытым исходным кодом, обслуживающий огромное количество высоконагруженных сайтов по всему миру. Nginx завоевал широкую популярность благодаря своей лёгкости, надёжности, масштабируемости и простоте настройки.
Если вы хотите облегчить трудовые будни вашего сервера, nginx поможет снять с него часть нагрузки, а также повысить безопасность и отказоустойчивость ваших сайтов.
Установка и настройка php-fpm
Для установки и настройки php-fpm вам понадобится…
Настройка безопасного соединения
Для обеспечения безопасного соединения с сайтом…
Безопасность сайтов в nginx
Для обеспечения безопасности сайтов…
Установка nginx в Linux
Если nginx ещё не установлен в вашей системе, сделать это очень просто:
Для deb-based дистрибутивов (Debian и другие)
sudo apt update
sudo apt install nginx
Для rpm-based (CentOS и прочие)
sudo dnf update
sudo dnf install nginx
Запуск nginx
После установки nginx запуск службы можно выполнить командой:
sudo systemctl start nginx
Для автозапуска nginx после перезагрузки системы:
sudo systemctl enable nginx
Для проверки статуса службы:
sudo systemctl status nginx
Если все прошло успешно, вы должны увидеть строки:
Теперь, если в браузере ввести адрес вашего сервера, например http://localhost, то вы увидите тестовую страницу приветствия.
Nginx в Docker
Если ваш сайт будет работать в контейнере и Docker уже установлен, то запустить nginx в новом контейнере можно командой:
docker run -p 80:80 nginx
Список запущенных контейнеров
docker ps
Структура каталогов nginx
Основные каталоги и файлы в структуре nginx:
- /etc/nginx/ — конфигурационные файлы
- /var/log/nginx/ — логи запросов
- /usr/share/nginx/ — файлы сайтов
- /usr/lib/nginx/modules/ — модули nginx
Установка и конфигурация nginx в Linux
При установке nginx на вашем дистрибутиве Linux могут создаваться различные папки. Однако, основной файл конфигурации nginx.conf обычно находится в каталоге /etc/nginx/.
Если у вас на сервере будет работать несколько сайтов, полезно вынести их настройки в отдельные файлы. Например, Debian рекомендует использовать /etc/nginx/sites-available/ или /etc/nginx/conf.d/, а CentOS — только /etc/nginx/conf.d/.
Первичная настройка nginx
Общая структура конфигурации nginx включает блоки server (для общих настроек сайта) и location (для обработки конкретных URI запросов). Внутри и снаружи блоков могут располагаться директивы.
Можно добавить все настройки в файл nginx.conf, но удобнее придерживаться правила один сайт — один файл конфигурации.
Пример конфигурации nginx.conf
Пример конфигурации nginx.conf в Debian:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
index index.html index.php;
}
Пример конфигурации nginx.conf в CentOS:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
index index.html index.htm;
}
В Debian основная конфигурация содержит блок server для сайта по умолчанию, в то время как в CentOS этот блок вынесен в отдельный файл.
Создание файла конфигурации для сайта
Для добавления конфигурации своего первого сайта создайте файл example.conf в каталоге /etc/nginx/conf.d/:
sudo nano /etc/nginx/conf.d/example.conf
Вставьте следующий пример конфигурации для виртуального сервера:
server {
listen 8080;
server_name example.com;
root /var/www/example.com;
index index.html index.php;
}
Примечание: ваш виртуальный сервер будет слушать порт 8080, поскольку порт 80 занят сервером по умолчанию.
Перезапуск nginx и проверка конфигурации
После добавления конфигурации не забудьте перезапустить nginx:
sudo systemctl restart nginx
Проверьте результат, открыв в браузере ссылку http://localhost:8080/. Вы должны увидеть страницу приветствия.
Теперь вы можете настроить nginx для проксирования входящих соединений на другой сервис, например, php-fpm, добавив блок location в ваш конфигурационный файл.
Этот блок обработает все запросы к динамическим файлам с расширением .php, а директива fastcgi_pass здесь делает основную работу — проксирует запросы на порт 9000 (номер порта можно изменить). Адрес 127.0.0.1 используется, если оба сервера запущены на одном компьютере. Теперь можно настроить ваш основной сервер php-fpm на прослушивание локального адреса http://127.0.0.1:9000.
Обратите внимание на использование специальной директивы fastcgi_pass. Если вам нужно перенаправить запрос другой службе или другому серверу в сети, можно использовать более общий вариант — proxy_pass:
Полная версия конфигурации сайта теперь должна выглядеть таким образом:
После внесения изменений не забудьте перезапустить службу nginx:
## Установка и настройка php-fpm
Установить пакет php-fpm можно командой
sudo apt install php-fpm
для Debian и
sudo dnf install php-fpm
Конфигурация для CentOS будет находится в файле /etc/php-fpm.d/www.conf,
а для Debian в /etc/php/8.2/fpm/pool.d/www.conf.
Номер установленной версии PHP (в нашем примере 8.2) можно узнать так:
sudo ls /etc/php/
Затем в файле конфигурации www.conf добавьте строку:
listen = 127.0.0.1:9000
а существующую директиву listen закомментируйте:
Для проверки работы связки nginx — php-fpm давайте создадим тестовый файл:
и перезапустим службу php-fpm:
sudo systemctl restart php8.2-fpm
для Debian или
sudo systemctl restart php-fpm
Если вы всё сделали правильно, то по адресу http://localhost:8080/info.php в браузере откроется стандартный вывод phpinfo.
А если нет, лучше заглянуть в журнал /var/log/nginx/error.log. Кроме того, вы всегда можете проверить прослушиваемые порты командой:
Как видите, настройка веб-сервера nginx в связке с php-fpm также не вызывает особых сложностей.
## Настройка безопасного соединения
Если ваш сервер принимает или передаёт чувствительные данные пользователя, например данные авторизации или платёжную информацию, рекомендуется использовать протокол безопасной передачи данных HTTPS. Этот протокол по умолчанию использует порт 443. Для прослушивания этого порта в блок server в файле конфигурации сайта нужно добавить строку
listen 443 ssl;
Кроме того, для работы по протоколу HTTPS вам понадобится сертификат SSL. Его можно как купить, так и получить бесплатно, например в центре сертификации Let’s Encrypt. Для того, чтобы nginx самостоятельно проверял сертификаты, нужно добавить строки
ssl_certificate example.ru.crt ssl_certificate_key example.ru.key;
где www.example.ru.crt — абсолютный путь к файлу публичного сертификата, а www.example.ru.key — секретный ключ. Например, для сертификатов Let’s Encrypt эти строки могут выглядеть так:
ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;
Разумеется, права доступа к файлу с секретным ключом следует ограничить.
Таким образом, минимальная рабочая конфигурация сайта теперь может выглядеть примерно так:
Автоматическое обновление SSL-сертификатов Let’s Encrypt
Для автоматического обновления SSL-сертификатов Let’s Encrypt вы можете использовать клиент certbot. Документацию по его настройке можно найти на официальном сайте (на английском языке) или в статье Как установить бесплатный сертификат Let’s Encrypt и настроить автоматический перевыпуск.
Пример конфигурации
127.0.0.1 example.ru www.example.ru
Расположение файла hosts зависит от операционной системы. Для Windows это будет c:windowssystem32driversetchosts, для MacOS — /private/etc/hosts, а для Linux — /etc/hosts. Для редактирования этого файла потребуются права администратора.
После включения протокола HTTPS рекомендуется проверить соответствие ваших настроек современным требованиям безопасности. Для этого удобно использовать онлайн сервисы, например: Аудит страницы, Mozilla Observatory, Test SSL Wormly и другие.
Редирект с http на https
Для того, чтобы пользователи вашего сайта случайно не зашли на страницу авторизации по протоколу http, лучше перенаправить их на безопасный протокол https автоматически. Nginx легко справится и с этой задачей. Просто добавьте в файл конфигурации вашего сайта в блок server, прослушивающий порт 80, такую директиву:
return 301 https://$host$request_uri;
и перезапустите nginx.
В итоге полная версия файла будет такой:
server {
listen 80;
server_name example.ru;
return 301 https://$host$request_uri;
}
Если виртуальный сервер по умолчанию, созданный автоматически при установке nginx, вам больше не нужен, можно просто удалить блок server, описанный в начале этого руководства. В Debian вместо этого достаточно удалить только символическую ссылку на файл default:
sudo rm /etc/nginx/sites-enabled/default
После этого, если это необходимо, вы можете удалить директивы server_name из конфигурации вашего сайта, чтобы nginx использовал его по умолчанию.
Если вам понадобится изменять основной файл настройки nginx, лучше предварительно сохранить резервную копию:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.orig
Директивы nginx
Мы уже рассмотрели блочные директивы http, server и location. Теперь можно привести краткий справочник прочих директив, используемых в этом руководстве (в алфавитном порядке):
- include
- rewrite
- return
- server
- server_name
С полным перечнем директив можно ознакомиться на официальном сайте.
Важно упомянуть, что параметры nginx, установленные этими директивами в главном файле конфигурации, наследуются файлами виртуальных серверов, но вы всегда можете переопределить их там. Другими словами, все параметры, не указанные явно в конфигурации вашего сайта, nginx возьмёт из файла nginx.conf.
Переменные в nginx
В файлах конфигурации можно использовать встроенные переменные. Например, выше мы использовали переменные $host и $request_uri. $host содержит название вашего домена (в примере это example.ru или www.example.ru), а $request_uri — всю остальную часть запроса (путь) или пустую строку.
proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr;
Здесь мы использовали переменные $http_host и $remote_addr. С полным списком переменных можно ознакомиться в официальной документации.
Команды nginx
Мы уже упоминали, что после изменения настроек службы её нужно перезапустить командой restart. Но для этого в nginx есть и более удобная команда — reload:
sudo systemctl reload nginx
sudo nginx -s reload
Эта команда выполнит «горячую» перезагрузку без остановки nginx. При наличии ошибки в одном из файлов конфигурации перезагрузка выполнена не будет, а сервис продолжит работу. Настоятельно рекомендуется на рабочем сервере использовать именно reload.
Другая полезная команда, выполняющая проверку всех файлов конфигурации без перезагрузки, это
sudo nginx -t
Для немедленной остановки используется команда
sudo systemctl stop nginx
Статические файлы
Теперь, когда вы научились свободно обращаться с вашим сервером и выполнили основные настройки, пришло время сделать что-то полезное. Одна из самых востребованных функций nginx — возможность отдавать клиентам «статические» файлы, такие как css, js, изображения и любые другие. Для примера, давайте поместим эти файлы в отдельную папку и добавим в блок server такую запись:
Этот блок обработает все запросы, поступившие на адрес https://example.ru/static. Теперь ваш основной сервер не будет тратить ресурсы на передачу статического содержимого. Просто и эффективно, не правда ли?
При необходимости в блоке location вы можете использовать регулярные выражения так же, как мы делали это для файлов .php:
Кэширование в nginx
Что, если после того, как ваш сайт наберёт обороты, вы поймёте, что php-fpm начал плохо справляться с возросшей нагрузкой? В таком случае разумно будет на непродолжительное время запомнить наиболее частые ответы сервера во временных файлах (кэше) и отдавать эти файлы клиенту напрямую.
В nginx за этот режим отвечает директива proxy_cache_path. Вот пример:
proxy_cache_path /var/lib/nginx/proxy_cache keys_zone=nginx_proxy_cache:10m;
Здесь /var/lib/nginx/proxy_cache — путь хранения кэша. Этот каталог можно предварительно создать командой
sudo mkdir /var/lib/nginx/proxy_cache
где параметр keys_zone определяет имя зоны для хранения активных ключей и размер выделяемой для этого памяти.
Чтобы включить режим кэширования, нужно поместить директиву proxy_cache_path в блок http (контекст верхнего уровня), а в блок server добавить заданное этой директивой имя зоны. Например:
Мониторинг nginx
Кроме чтения журналов, nginx предоставляет возможность отслеживать его статус на «странице состояния» с помощью модуля ngx_http_stub_status_module. Проверить наличие этого модуля в вашей системе можно командой
Если модуль установлен, вы можете добавить в блок server ещё один блок location:
После перезагрузки nginx вы сможете открыть в браузере страницу https://example.ru/nginx-status, содержащую базовую информацию о состоянии службы, например:
Active connections: 21 server accepts handled requests 907 907 453 Reading: 12 Writing: 74 Waiting: 18
Полная версия файла конфигурации виртуального сервера теперь должна быть такой:
Доступные состояния расшифровываются так:
Балансировка нагрузки
Перед высоконагруженными сайтами часто встаёт задача распределения нагрузки между группой серверов, обрабатывающих запросы клиентов. Nginx в роли регулятора нагрузки может помочь вам справится с увеличением трафика без необходимости покупки дополнительного оборудования. Благодаря простоте настройки конфигурация такого балансировщика нагрузки может выглядеть очень лаконично:
Здесь load_balancer — произвольное имя вышестоящего потока (upstream), используемое в директиве proxy_pass. В этом примере nginx распределяет запросы между двумя независимыми службами, слушающими порты 9000 и 9001.
Безопасность сайтов в nginx
Мы уже рассматривали работу nginx по безопасному протоколу HTTPS. Теперь давайте включим авторизацию пользователей, например при просмотре настроенной выше страницы мониторинга. Для этого измените location таким образом:
После перезагрузки службы nginx будет запрашивать имя пользователя и пароль.
Создать файл /etc/nginx/conf.d/htpasswd можно так:
Ещё мы можем закрыть доступ к некоторым каталогам в структуре сайта, например блок
закроет доступ к директории .git.
Вот что у нас должно получиться:
Как видите, nginx позволяет нам свободно комбинировать различные ограничения.
Предотвращение DDoS атак
DoS, или Denial of Service (отказ в обслуживании), и его разновидность DDoS, или Distributed Denial of Service (распределённый отказ в обслуживании), — это тип хакерской атаки, вызывающий перегрузку сервера и, в результате, замедление или полную недоступность сайта. Конечно, nginx, конфигурация которого позволяет выполнять очень широкий спектр задач, придёт нам на помощь и в этот раз.
Предотвращать последствия DDoS атак можно несколькими методами. Выше мы уже рассматривали балансировку нагрузки и кэширование, которые также снижают возможный ущерб от DDoS. Ещё одним способом добиться стабильной работы сайта может стать ограничение скорости обработки запросов. Давайте добавим к конфигурации нашего сайта директивы limit_req_zone и limit_req:
Ещё один метод борьбы с нежелательным трафиком — ограничение количества одновременных подключений с помощью директивы limit_conn:
В этом примере мы позволяем подключиться к php-fpm не более 50-ти клиентам одновременно.
Конечно, на этом возможности по борьбе с хакерскими атаками не ограничиваются. Вы также можете использовать директиву keepalive_timeout, позволяющую удерживать одно соединение для каждого клиента вместо открытия нового для каждого запроса, настроить сжатие и буферизацию.
Ошибки nginx
Мы уже узнали, как настроить nginx и познакомились с общими методами решения возможных проблем, почти неизбежно возникающих при настройке сервера. Напомним, что лучшая практика при отладке служб — это анализ журналов (логов). Также, разумеется, первым делом нужно проверить статус служб и убедиться, что они находятся в активном состоянии. Кроме того, стоит обратить внимание на коды ошибок, которые предоставляет нам nginx. Вот некоторые из них:
Bad Gateway
Эта ошибка означает, что nginx не может получить ответ от службы, на которую перенаправлен запрос, в нашем случае php-fpm. Как правило, возникает из-за отключённого или неверно настроенного сервиса, а так же в случае ошибки 500 в самом сервисе. Рекомендации по устранению приведены в разделе «Установка и настройка php-fpm». Ошибка 502 может также возникать, если php-fpm не справляется с нагрузкой. В этом случае лучше ещё раз взглянуть на раздел «балансировка нагрузки».
Service Unavailable
Сервер временно не готов обработать запрос, например из-за перегрузки или при проведении технических работ.
Gateway Time-out
Означает, что служба не отвечает в течение установленного времени. В случае php-fpm можно попробовать увеличить это ограничение:
Forbidden
Возможно, клиент пытается загрузить слишком большой файл. Ограничение размера файла можно изменить директивой client_max_body_size в блоке server:
Not Found
Означает, что запрашиваемого файла просто нет в структуре сайта. Эта ошибка не имеет прямого отношения к nginx, но тем не менее её, как и другие ошибки, можно обработать.
Давайте будем показывать пользователям вместо сухой технической информации красивые страницы в фирменном стиле вашего сайта. Для этого добавьте в блок server ещё несколько директив, например:
При необходимости в блоке location вы также можете использовать директиву root для указания каталога, содержащего файл страницы ошибки.
Теперь вы можете отредактировать HTML страницу /var/www/html/404.html в стиле вашего сайта. Таким же образом можно обработать и другие ошибки. Вот полный пример:
Заключение
В этом руководстве мы намеренно приводим лишь минимальную работающую конфигурацию. Администратору сервера крайне желательно разобраться с каждым добавленным параметром самостоятельно. В дальнейшем это сэкономит вам массу времени и нервов в случае неожиданного «падения» вашего сайта, которое, как показывает практика, может произойти в самый неподходящий момент по независящим от вас причинам. Поэтому мы не даём готовых рецептов, но предлагаем хорошую отправную точку для начала работы.
В качестве домашнего задания рекомендуем перенести структуру вашего сайта из каталога по умолчанию /var/www/html, например, в домашнюю папку пользователя, используя директиву root в блоке server, и определить нужный индексный файл с помощью директивы index.
Конечно, этот краткий обзор не может включать в себя все варианты использования такого мощного сервера, как nginx. Тонкости его применения настолько обширны, что могут составить целую книгу. В любом случае, вся нужная информация содержится в официальном руководстве.
Удачи в настройке и работе!
Известные проблемы и рекомендации
Kaspersky Endpoint Security для Android имеет ряд проблем, не критичных для работы.
Известные проблемы при установке программы
Известные проблемы при обновлении версии приложения
Известные проблемы в работе Антивируса
Известные проблемы в работе Веб-Фильтра
Известные проблемы в работе Анти-Вора
Известные проблемы в работе Контроля приложений
Известные проблемы при настройке электронной почты
Известные проблемы при настройке надежности пароля разблокировки устройства
Известные проблемы при настройке Wi-Fi
Известные проблемы при настройке APN
Известные проблемы при работе с сетевым экраном
Известные проблемы при настройке VPN
Известные проблемы при работе с контейнерами
Известные проблемы, связанные с защитой от удаления приложения
Известные проблемы при настройке ограничений устройства
Известные проблемы при отправке команд на мобильные устройства
Известные проблемы, связанные с рабочим профилем Android
Известные проблемы, связанные с определенными моделями устройств
Известные проблемы при работе на Android 13
Время на прочтение
Автоматическая доставка проектных артефактов в тестовые и продуктивные среды является безусловной необходимостью современных процессов промышленной разработки ПО.
Мы пройдем полный процесс создания пайплайна для сборки и деплоя при помощи GitLab и сопутствующего ПО. Все операции мы проделаем на одном компьютере, хотя ничто не должно вам помешать сразу или в дальнейшем масштабировать полученное решение на один или несколько серверов. Для экспериментов лучше иметь достаточно современный компьютер с количеством оперативной памяти не менее 16 гигабайт, производительным процессором и хорошим интернет-каналом.
Предполагается, что у вас уже установлены Docker и ssh-сервер и вы немного умеете со всем этим обращаться.
Создаем локальный реестр образов
Вы можете использовать реестр DockerHub и пропустить этот шаг, а там, где надо будет вводить имя пользователя и пароль от реестра, указывать данные вашей регистрации.
В ином случае нам необходимо создать реестр докер-образов, который будет виден как с локального окружения, которое будет выполнять роль целевого сервера, так из окружений гитлаба.
Создадим каталог с докер-проектом:
mkdir docker-registry cd docker-registry mkdir auth
Для генерации пароля потребуется установить в систему пакет apache2-utils. Это можно сделать родным пакетным менеджером, если у вас Linux, или brew в MacOS и chocolately для Windows. В результате у нас должна начать срабатывать такая команда:
Для того, чтобы докер увидел наш наспех развернутый без корректно настроенного HTTPS реестр, мы добавим исключение в его конфигурацию:
Перезапустим сервис, чтобы настройки применились:
sudo systemctl restart docker
Теперь мы готовы запустить сервис реестра докер-образов:
docker container run -d -p 5000:5000 —name registry -v "$(pwd)"/auth:/auth -e REGISTRY_AUTH=htpasswd -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
Если что-то пошло не так, останавливайте контейнер, удаляйте:
docker stop registry docker rm registry
и пробуйте заново. Если хотите, чтобы этот контейнер запускался автоматически, выполните:
docker update —restart unless-stopped registry
Устанавливаем GitLab
Вместо разворачивания локального гитлаба можно использовать уже существующий корпоративный или воспользоваться сервисом gitlab.com или его аналогами и этот шаг пропустить.
Для сохранения данных гитлаба между перезапусками нам потребуется смапить несколько каталогов из хостового контекста. В документации советуют задать и использовать переменную окружения GITLAB_HOME:
Обратите внимание, при выполнении команд из-под sudo эта переменная может оказаться еще не прочитанной. Если значение не задано, то будет использоваться путь /data/gitlab.
docker run —detach —hostname 172.17.0.1 —env GITLAB_OMNIBUS_CONFIG="external_url ‘http://172.17.0.1’" —publish 443:443 —publish 80:80 —publish 22:22 —name gitlab —restart always —volume $GITLAB_HOME/config:/etc/gitlab —volume $GITLAB_HOME/logs:/var/log/gitlab —volume $GITLAB_HOME/data:/var/opt/gitlab —shm-size 256m gitlab/gitlab-ce:latest
При запуске был создан пользователь root с правами администратора, его сгенерированный пароль можно получить, выполнив следующую команду:
sudo docker exec -it gitlab grep ‘Password:’ /etc/gitlab/initial_root_password
Используйте пароль для входа сразу после запуска сервиса, открыв в браузере http://172.17.0.1
Создаем проект и добавляем ssh-ключ
Сгенерируем новый ключ, если у вас его еще нет:
Создадим новый проект в интерфейсе гитлаба и запушим в него код проекта. Инструкции как это правильно сделать можно увидеть после создания репозитория в гитлабе.




