# 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.

После подключения бесплатного сертификата сервис Джино сам создаст необходимые перенаправления и защитит ваше подключение.

Можно проверить это, указав в браузере адрес нашего сервера с мессенджером. В адресной строке должен появиться индикатор безопасности подключения (замок):

«ssl_enter»

Теперь можно переходить непосредственно к работе с мессенджером и начинать новый проект.