LoginSignup
7
11

More than 5 years have passed since last update.

Apache経由でMattermostを使いたいとき

Posted at

はじめに

mattermostを構築できている(ポート番号で接続できる状態)かつ該当ポート番号のファイヤーウォールを許可済みという前提で話を進めていきます。
構築できていない場合は他の方の投稿を確認してください。
今回私は以下の投稿を参考にいたしました。

Mattermost のインストール for CentOS 7.2 - shadowhatさんの投稿
http://qiita.com/shadowhat/items/c29a6d0362a2742425ba

環境は以下の通りです。OSによって設定方法が異なる場合がありますので適宜変更願います。

環境 内容
OS CentOS 7.3.1611
mattermost 3.4.0 TeamEdition
mattermostの言語(サーバー・クライアント) 日本語(Beta)
apache 2.4.6

モジュールのチェック(有効化)

今回はWebsocketを利用するので必要なapacheモジュールを用意します。CentOS版のapacheは基本は読み込まれているはずですので特に設定する必要はないでしょう。
もし読み込まれていなかったら以下の項目をhttpd.confに追記してください。
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

本題

今回私はVirtualHostを利用して設定しました。以下の内容はproxy設定前の設定です。

<VirtualHost team.example.com:80>
DocumentRoot "/var/www/html"
ServerName team.example.com
RewriteEngine on
RewriteRule ^(.*)$ https://team.example.com/ [R=301,L]
<Directory "/var/www/html">
allow from all
Require all granted
</Directory>
</VirtualHost>
<VirtualHost team.example.com:443>
DocumentRoot "/var/www/html"
ServerName team.example.com:443
<Directory "/var/www/html">
allow from all
Require all granted
</Directory>
Header always set Strict-Transport-Security "max-age=15768000"
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/team.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/team.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/team.example.com/chain.pem
SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on
SSLCompression          off
</VirtualHost>
  • <Directory>項目は設定する必要はないと思いますが一応設定しています。
  • team.example.comにしていますが、適宜変更してください。
  • SSL証明書は"Let's Encrypt"を使用していますが、他のものでも構いません。

これにProxyを設定するのですが、以下の内容は不正解です。

ProxyRequests Off
ProxyPreserveHost On
ProxyPass / "http://localhost:8065/"
ProxyPassReverse / "http://localhost:8065/"

上記の設定では接続はできますが、WebSocketでの通信ができません。ログを見ても

[YYYY/MM/DD {TIME} JST] [EROR] github.com/mattermost/platform/api.connect:31 :: ウェブソケット接続エラー: websocket: could not find connection header with token 'upgrade'

と出てしまいます。ですのでリアルタイムでのチャットができません。

これが正解

Header add Upgrade "Websocket"
Header add Connection "Upgrade"
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / "ws://localhost:8065/"
ProxyPassReverse / "ws://localhost:8065/"

※今回私はSSLのVirtualHostに設定しました。
※ポート番号を変更している場合は該当ポートに変更してください。
こうすればWebSocketとしての接続ができ、リアルタイムでのチャットが可能になります。

おまけ

最初にProxyPassProxyPassReverseの設定をhttp://localhost:8065としていたのですが、最後の/を入れ損ねてしまってリソースの読み込みエラーが起きてしまったので必ず最後に/を入れなきゃNGです。トホホ・・・

プロコトルはwsに設定しましたがwssに設定したら"Internal Server Error"を吐いてしまいました。対応してなかったのかな・・・。

設定が終わったらセキュリティのため該当ポートのファイヤーウォールは閉じておきましょう!(または接続待ちアドレスをlocalhost:8065127.0.0.1:8065に変更でも可)

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11