knowledgeにはnginxがお手軽か?

メモ:

情報共有ツール knowledgeの Version 1.11.0 がリリースされ、バージョンアップをしようとしたところメンテナンスモードの画面は表示されるものの更新は実行されません。よくよく調べてみると、 Knowledge は 一部の機能で WebSocket と呼ばれる技術を使用しており運用していた環境では WebSocket が通りませんでした。今回は、Apache から nginx へ変更して WebSocket へ対応していきます。Apache では対応できないというわけではないです、wstunnel を使えばできるのですが nginx のシンプルさに惹かれただけです。

バージョンアップ前に運用していた環境:

  • CentOS 7
  • Apache 2.4
  • Tomcat 8
  • proxy_ajp_module で Apache と Tomcat を連携
  • PostgreSQL9.5

バージョンアップ用の環境:

  • CentOS 7
  • nginx 1.12.2
  • Tomcat 8
  • PostgreSQL9.5

Apache のアンインストール

Apache を nginx へ差し替えるため Apache をアンインストールします。

$ sudo yum remove httpd

nginx のインストール

nginx をインストールします。詳細は、「nginxのインストール」を参照してください。(内容はたいして変わりません。。。)

nginx のリポジトリを登録していきます。

$ sudo vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/[OS]/[OSRELEASE]/$basearch/
gpgcheck=0
enabled=1

[OS]の部分は、「centos」に変更し、[OSRELEASE]の部分は今回の対象となるOSのバージョン「7」としてファイルを作成します。 ※[OS]は、「rhel」 や 「centos」などを指定し、[OSRELEASE]には「5」 , 「6」 , 「7」など環境に合わせて指定します。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

yumコマンドを使って nginx をインストールしていきます。

$ sudo yum -y install nginx

サービスとして自動起動するよう登録していきます。

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

リバースプロキシとしての設定

nginx がリバースプロキシとして動作するよう /etc/nginx/conf.d/default.conf へ設定していきます。

server {
    listen       80;
    server_name  localhost;

    location /knowledge/ {
        proxy_pass http://localhost:8080/knowledge/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

location ブロックに追加した proxy_pass ディレクティブは、 location へアクセスした際にリクエストを指定されたサーバへ転送します。ここでの設定では、 http://hogehoge/knowledge/ へ送られたリクエストが http://localhost:8080/knowledge/ へ転送されます。

今回の目的である WebSocket が使えるようにしたいのですが、転送を設定しただけでは WebSocket のハンドシェイク時に使われる Upgrade ヘッダと Connection ヘッダがバックエンドサーバまで届きません。 WebSocket の通信をプロキシする場合は、明示的にこれらのヘッダをバックエンドに渡すように設定する必要があります。

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_http_version ディレクティブで HTTPプロトコル 1.1 を使用するよう設定します。(デフォルトでは 1.0 が使用されます。)

proxy_set_header ディレクティブで Upgrade ヘッダと Connection ヘッダがバックエンドサーバへ渡るよう設定します。

※ location ディレクティブに /knowledge と指定する場合と /knowledge/ と指定する場合では、動作が変わってくるので注意が必要となります。また、proxy_pass ディレクティブも同様に http://localhost:8080/knowledge/ と指定する場合と http://localhost:8080/knowledge と指定する場合で動作が変わってくるため注意が必要です。

knowledge のバージョンアップ

knowledge を配置したディレクトリ(例:/opt/apache-tomcat-8.0.32/webapps/)へ knowledge.war を上書きしてブラウザからアクセスするとメンテナンスモードが表示されます。管理者でアクセスすると、データベースの更新などを行うボタンを使用することができボタンを押下することでバージョンアップ処理が実行されます。

以上でバージョンアップが完了しました。

もともと、エクスポートや検索用のインデックス再構築、デスクトップ通知 などで WebSocket が使われていたようです。