Настройка Unix-сокетов и нескольких рабочих процессов¶
Настройка Unix-сокетов для веб-сервиса¶
Выполненные ранее настройки показывают, как запустить веб-сервис tessa
с привязкой к порту localhost:5000
, после чего веб-серверы Nginx
или Apache
работают как reverse proxy на этот порт. Работу веб-сервиса можно ускорить при высокой нагрузке, если настроить использование unix-сокетов. Также это позволяет упростить настройку нескольких рабочих процессов.
При настройке сервиса tessa необходимо указать имя сокета tessa.sock
в настройке ExecStart
. При условии, что настройки по ссылке уже выполнены, откройте для редактирования конфигурационный файл сервиса:
sudo nano /etc/systemd/system/tessa.service
Добавьте перед строкой ExecStart
следующую:
ExecStartPre=/bin/rm -f /home/tessa/tessa/sockets/tessa.sock
Замените существующую строку ExecStart
на следующую:
ExecStart=/home/tessa/tessa/web/Tessa.Web.Server /home/tessa/tessa/sockets/tessa.sock
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Для Calculate Linux
и системы инициализации OpenRC:
sudo nano /etc/init.d/tessa
Замените строку с настройкой DAEMONARGS
на следующую строку:
DAEMONARGS="/home/tessa/tessa/sockets/tessa.sock"
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Для всех дистрибутивов
:
Создайте папку, содержащую файл сокета. Доступ на чтение и на запись должен быть у пользователя tessa
и у группы www-data
(или у того пользователя, от имени которого запускаются сервис tessa
и веб-серверы Nginx
или Apache
).
sudo usermod -a -G www-data tessa
mkdir ~/tessa/sockets
sudo chgrp www-data ~/tessa/sockets
sudo chmod g+rwxs ~/tessa/sockets
Перезагрузите конфигурационные файлы сервиса и перезапустите веб-сервис tessa
:
sudo systemctl daemon-reload
sudo systemctl restart tessa
Если всё настроено правильно, то при просмотре статуса сервиса будет выведен зелёный кружок и отладочные сообщения.
sudo systemctl status tessa
Если информация по сервису не закроется сама, нажмите q
.
Для Calculate Linux
и системы инициализации OpenRC:
sudo /etc/init.d/tessa restart
Проверьте статус сервиса, отобразив содержимое файла лога:
cat ~/tessa/logs/tessa.log
Если последняя отображённая строка выглядит как “Application started”, то сервис успешно перезапущен.
Настройка Unix-сокетов для веб-сервера Nginx¶
Если вы используете веб-сервер Nginx
, то помимо настройки веб-сервиса также требуется настроить проксирование трафика по сокету к веб-сервису tessa
.
Откройте конфигурационный файл:
sudo nano /etc/nginx/sites-available/default
Найдите строку:
proxy_pass http://localhost:5000/;
Замените её на:
proxy_pass http://unix:/home/tessa/tessa/sockets/tessa.sock:/;
Important
В случае, если вы используете PathBase, удостоверьтесь, что он так же передается и в proxy_pass (например: http://unix:/home/tessa/tessa/sockets/tessa.sock:/awesome_path_base; ).
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Перезапустите веб-сервер Nginx
:
sudo systemctl restart nginx
Теперь проверьте функционирование системы.
Настройка Unix-сокетов для веб-сервера Apache¶
Если вы используете веб-сервер Apache
, то помимо настройки веб-сервиса также требуется настроить проксирование трафика по сокету к веб-сервису tessa
.
Откройте конфигурационный файл:
sudo nano /etc/apache2/sites-available/000-default.conf
Найдите строку:
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
Замените её на:
ProxyPass / unix:/home/tessa/tessa/sockets/tessa.sock|http://localhost/
ProxyPassReverse / unix:/home/tessa/tessa/sockets/tessa.sock|http://localhost/
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Доступ к файлу сокета /home/tessa/tessa/sockets/tessa.sock
должен иметь одновременно и веб-сервис tessa
, и веб-сервер Apache
. Для этого необходимо настроить права доступа. Для упрощения настройки, для запуска веб-сервиса tessa
использовалась учётная запись пользователя tessa
. Веб-сервер Apache
по умолчанию запускается от имени группы www-data
. Настройте запуск Apache
от имени того же пользователя tessa
, чтобы доступ к файлу сокета был гарантирован без дополнительных настроек.
Tip
Для повышенной безопасности веб-сервера настройте права для запуска веб-сервиса tessa
от имени группы www-data, тогда не следует изменять пользователя для веб-сервера Apache
, пропустите следующие настройки.
Откройте конфигурационный файл envvars
:
sudo nano /etc/apache2/envvars
Найдите строки:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
Замените в них группу www-data
на учётную запись пользователя tessa
:
export APACHE_RUN_USER=tessa
export APACHE_RUN_GROUP=tessa
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Также измените права доступа для следующих папок на пользователя tessa
(укажите имя дважды через точку, если пользователь называется иначе):
sudo chown tessa.tessa -R /var/lock/apache2 /var/log/apache2
Перезапустите веб-сервер Apache
:
sudo systemctl restart apache2
Перезапустите веб-сервер Apache
:
sudo systemctl restart apache2
Теперь проверьте функционирование системы.
Настройка нескольких рабочих процессов веб-сервиса¶
Несколько рабочих процессов веб-сервиса tessa
позволяют ускорить обработку параллельных запросов на многоядерных и многопроцессорных серверах приложений. Настраивать более одного рабочего процесса обычно не имеет смысла на тестовых контурах и серверах разработчиков, это актуально для production-серверов.
Остановите процесс веб-сервиса tessa
, настроенный ранее, и отключите его автозапуск.
sudo systemctl stop tessa && sudo systemctl disable tessa
Tip
Если вы уже настроили и запустили веб-сервис для Unix-сокетов, то также явно удалите файл сокета, созданный веб-сервисом: sudo rm /home/tessa/tessa/sockets/tessa.sock
Если папка, содержащая файлы сокетов, ещё не создана, то создайте её. Доступ на чтение и на запись должен быть у пользователя tessa
и у группы www-data
(или у того пользователя, от имени которого запускаются сервис tessa
и веб-серверы Nginx
или Apache
).
sudo usermod -a -G www-data tessa
mkdir ~/tessa/sockets
sudo chgrp www-data ~/tessa/sockets
sudo chmod g+rwxs ~/tessa/sockets
Создайте шаблон SystemD-сервиса, который позволяет запускать несколько сервисов параллельно. В этом примере каждый сервис работает для своего файла .sock
.
sudo nano /etc/systemd/system/tessa@.service
Вставьте следующее содержимое:
[Unit]
Description=Syntellect Tessa process %i
[Service]
WorkingDirectory=/home/tessa/tessa/web
ExecStartPre=/bin/rm -f /home/tessa/tessa/sockets/tessa.%i.sock
ExecStart=/home/tessa/tessa/web/Tessa.Web.Server /home/tessa/tessa/sockets/tessa.%i.sock
PIDFile=/var/run/tessa.%i.pid
Restart=always
RestartSec=10
SyslogIdentifier=tessa.%i
User=tessa
UMask=002
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Теперь настройте автозапуск нескольких процессов веб-сервиса и запустите их. В примере ниже указано 4
процесса, но вы легко можете увеличить их количество до требуемого. Мы рекомендуем запускать один процесс на каждое физическое ядро CPU (без учёта hyper-threading).
sudo systemctl enable tessa@{1..4} && sudo systemctl start tessa@{1..4}
Статус всех процессов можно вывести командой:
sudo systemctl status tessa@{1..4}
Если для всех процессов выведен зелёный кружок, то веб-сервис настроен корректно. Используйте стрелки для прокрутки вниз. Чтобы закрыть окно, нажмите q
.
Настройка нескольких рабочих процессов для веб-сервера Nginx¶
Если вы используете веб-сервер Nginx
, то помимо настройки веб-сервиса также требуется настроить балансировку для нескольких рабочих процессов.
Откройте конфигурационный файл:
sudo nano /etc/nginx/sites-available/default
Добавьте в его начало перечисление всех файлов .sock
в зависимости от количества настроенных процессов. Для заданных выше 4
процессов настройки выглядят так:
upstream tessa {
ip_hash;
server unix:/home/tessa/tessa/sockets/tessa.1.sock;
server unix:/home/tessa/tessa/sockets/tessa.2.sock;
server unix:/home/tessa/tessa/sockets/tessa.3.sock;
server unix:/home/tessa/tessa/sockets/tessa.4.sock;
}
Note
Указанный параметр ip_hash
позволяет “привязывать” сессии пользователей к рабочим процессам, чтобы последовательные запросы от одного и того же пользователя переходили к одному и тому же процессу. Это ускоряет обработку запросов для веб-сервиса tessa
.
Найдите настройку proxy_pass
:
proxy_pass ...;
И замените её на:
proxy_pass http://tessa;
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Настройте количество рабочих процессов веб-сервера Nginx, каждый из которых будет проксировать трафик к одному из процессов веб-сервиса tessa
.
Откройте конфигурационный файл nginx.conf
:
sudo nano /etc/nginx/nginx.conf
Найдите строку вида:
worker_processes ...;
Укажите такое же количество рабочих процессов, которые указали ранее. В данном примере это 4
процесса:
worker_processes 4;
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Перезапустите веб-сервер Nginx
:
sudo systemctl restart nginx
Теперь проверьте функционирование системы.
Настройка нескольких рабочих процессов для веб-сервера Apache¶
Если вы используете веб-сервер Apache
, то помимо настройки веб-сервиса также требуется настроить балансировку для нескольких рабочих процессов.
Установите плагин с алгоритмом балансировщика запросов:
sudo a2enmod lbmethod_byrequests
Откройте конфигурационный файл:
sudo nano /etc/apache2/sites-available/000-default.conf
Добавьте в его начало перечисление всех файлов .sock
в зависимости от количества настроенных процессов. Для каждого из процессов необходимо указать уникальный адрес сервиса. Если все рабочие процессы должны проксироваться на один и тот же адрес, например localhost
, необходимо добавить для них алиасы в hosts
: localhost2
, localhost3
, localhost4
и т.п.
Для заданных выше 4
процессов настройки выглядят так:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://tessa">
BalancerMember unix:/home/tessa/tessa/sockets/tessa.1.sock|http://localhost route=1
BalancerMember unix:/home/tessa/tessa/sockets/tessa.2.sock|http://localhost2 route=2
BalancerMember unix:/home/tessa/tessa/sockets/tessa.3.sock|http://localhost3 route=3
BalancerMember unix:/home/tessa/tessa/sockets/tessa.4.sock|http://localhost4 route=4
ProxySet lbmethod=byrequests stickysession=ROUTEID
</Proxy>
Note
Указанные настройки stickysession=ROUTEID
, а также настройки add Set-Cookie
и route=X
позволяют “привязывать” сессии пользователей к рабочим процессам, чтобы последовательные запросы от одного и того же пользователя переходили к одному и тому же процессу. Это ускоряет обработку запросов для веб-сервиса tessa
.
Ниже найдите строки вида:
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
И замените их на:
ProxyPass / balancer://tessa/
ProxyPassReverse / balancer://tessa/
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Теперь откройте файл /etc/hosts
на редактирование:
sudo nano /etc/hosts
Укажите псевдонимы для вашего сервера (в примере это localhost
, доступный по адресу 127.0.0.1
, для которого нужны псевдонимы для 4 серверов):
127.0.0.1 localhost localhost2 localhost3 localhost4
Сохраните и закройте файл: Ctrl+X, Y, Enter
.
Перезапустите веб-сервер Apache
:
sudo systemctl restart apache2