websocket
centos7
Apache2.4
Mattermost

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

More than 1 year has passed since last update.


はじめに

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に変更でも可)