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

# はじめに
mattermostを構築できている(ポート番号で接続できる状態)かつ該当ポート番号のファイヤーウォールを許可済みという**前提**で話を進めていきます。
構築できていない場合は他の方の投稿を確認してください。
今回私は以下の投稿を参考にいたしました。
> [Mattermost のインストール for CentOS 7.2 - shadowhatさんの投稿](http://qiita.com/shadowhat/items/c29a6d0362a2742425ba)
> *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としての接続ができ、リアルタイムでのチャットが可能になります。

# おまけ
最初に```ProxyPass```や```ProxyPassReverse```の設定を```http://localhost:8065```としていたのですが、最後の```/```を入れ損ねてしまってリソースの読み込みエラーが起きてしまったので必ず最後に```/```を入れなきゃNGです。ﾄﾎﾎ･･･

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

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