# Mattermost. Часть 3. Установка обратного прокси
Это третья часть инструкции по настройке корпоративного мессенджера Mattermost, в которой мы установим и настроим Nginx в качестве обратного прокси для работы мессенджера. Сами разработчики не рекомендуют использовать Mattermost напрямую подключённым к сети, а предлагают подключать к нему Nginx.
Основные преимущества Nginx при работе в качестве стандартного реверс-прокси:
- простота настройки защищёного соединения;
- ведение лога событий;
- редирект протоколов с HTTP на HTTPS;
- проксирование портов — запросы будут приходить на стандартный порт (80 или 443) и проксироваться на рабочий порт Mattermost (8065) без изменений внутри конфигурационного файла Mattermost.
Нам понадобится установленный и запущенный в работу сервер Mattermost.
# Установка Nginx
Устанавливать Nginx будем из стандартного репозитория Ubuntu:
sudo apt install nginx
После установки запустим Nginx и добавим его в автозагрузку, чтобы веб-сервер автоматически запускался после перезагрузки сервера:
sudo systemctl start nginx
sudo systemctl enable nginx
После запуска Nginx отключим запущенный по умолчанию виртуальный хост:
sudo rm /etc/nginx/sites-enabled/default
# Настройка Nginx
Общий случай создания виртуальных хостов Nginx описан в отдельной инструкции. Основные принципы создания виртуального хоста соблюдаются и при подключении Nginx к Mattermmost. Основным отличием будет наличие нескольких новых аргументов и директив в конфигурационном файле, которые будут описывать непосредственно работу мессенджера. Итак, перейдём к настройке веб-сервера.
Создадим новый конфигурационный файл, в котором опишем новый виртуальный хост и путь проксирования:
sudo vim /etc/nginx/sites-available/mattermost
Содержимое нового файла будет следующим:
upstream backend {
server 127.0.0.1:8065;
keepalive 32;
}
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;
server {
listen 80 default_server;
server_name mattermost.example.com;
location ~ /api/v[0-9]+/(users/)?websocket$ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 50M;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
client_body_timeout 60;
send_timeout 300;
lingering_timeout 5;
proxy_connect_timeout 90;
proxy_send_timeout 300;
proxy_read_timeout 90s;
proxy_pass http://backend;
}
}
Здесь в первой части файла директивой upstream backend
мы описываем сервер, к которому будут проксироваться запросы, приходящие на внешний адрес. Мы указываем локальный адрес сервера и номер порта, использующийся по умолчанию.
Если при настройке соединения и проверке работы Mattermost в конфигурационном файле /opt/mattermost/config/config.json
в строке SiteURL
вы указывали имя хоста, то его нужно удалить. По умолчанию Mattermost воспримет пустую строку как localhost
.
Далее добавляем информацию о кэш-памяти сервера, которая будет использоваться при обработке запросов, и затем переходим непосредственно к серверной части. В ней мы описываем не только бэкэнд сервер, на который будут проксироваться запросы, но и свойства устанавливаемого канала связи.
В строке server_name
указываем имя хоста, на котором будет функционировать наш мессенджер. Это та ссылка, которую мы будем указывать в браузере, чтобы войти в мессенджер.
Обратите внимание, что в нашем случае мы описываем проксирование только HTTP-запросов. В официальной документации Mattermost описан процесс проксирования HTTPS-запросов с помощью директив конфигурационного файла Nginx. Мы рассмотрим настройку безопасного соединения чуть позже.
После добавления всех необходимых директив в конфигурационный файл сохраним его и закроем. Далее создадим символьную ссылку на него в разделе sites-enabled
:
sudo ln -s /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/mattermost
Теперь осталось только проверить правильность синтаксиса нашего конфигурационного файла и, если всё в порядке, перезагрузить веб-сервер:
sudo nginx -t
# Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl restart nginx
Сейчас сервер Mattermost функционирует и доступен при обращении к нему через браузер. В адресной строке можно указать имя сервера, которое вы указывали в конфигурационном файле Nginx: должна открыться стартовая страница Mattermost.
# Создание безопасного подключения
В официальной документации Mattermost при подключении Nginx в качестве обратного прокси рекомендуется настраивать безопасное соединение при помощи Certbot’а и SSL-сертификатов от Let’s Encrypt.
В этом случае нужно не только самостоятельно получить сертификат от Let’s Encrypt при помощи Certbot, но и подключить его к реверс-прокси, создав дополнительный серверный блок в конфигурационном файле. В этом блоке нужно будет указать обработку запросов, приходящих на стандартный порт для HTTPS-запросов (443), переадресацию запросов с порта 80 на пустую страницу и т.д.
Мы создадим шифрованное подключение проще и быстрее.
Если ваш VPS расположен на Джино, то для создания безопасного подключения нужно просто воспользоваться сервисом получения бесплатного SSL-сертификата.
Для этого в разделе Домены в контрольной панели аккаунта на Джино перейдите в Настройки домена, к которому будет прикреплён ваш мессенджер. На вкладке «SSL» подключите бесплатный сертификат, отметив опцию «Wildcard-сертификат».
«Wildcard-сертификат» подключит SSL-сертификат не только на выбранный домен, но и на всего его поддомены вида subdomain.example.com
.
После подключения бесплатного сертификата сервис Джино сам создаст необходимые перенаправления и защитит ваше подключение.
Можно проверить это, указав в браузере адрес нашего сервера с мессенджером. В адресной строке должен появиться индикатор безопасности подключения (замок):
Теперь можно переходить непосредственно к работе с мессенджером и начинать новый проект.