swampdragon x apacheでリアルタイムWebアプリをデプロイする

(大体、一番下のhttpd.confの書き方を見れば、きっかけくらいにはなるはず…)

# 前提
pythonモジュールのdjangoを使うという前提で、リアルタイムWebを実現する方法はいくつかあるだろうが、その前提条件を生かす形(=pythonモジュール or Djangoの延長として使える)となると数が少ない。
軽く調べて出てくるのは、

* channels
* swampdragon

といったあたり。

当時はchannelsに比べて更新が進んでおり、(どちらも少ないながらも)swampdragonの方が日本語のドキュメント(使用例)が多いという理由でswampdragonを選択した。

現在(16/12/29)はすでに公式サイトの更新も停止しているような状況だが、当時(16/07/xx)はそちらを選んだ(当時の時点で公式サイトは閉まっていたが)。
結果、苦労してデプロイした過程をまとめる。

なお、モジュールの導入手順は省き、何を導入して、どのように設定したかという話に終始する。

# デプロイしたいもの
デプロイしたいアプリケーションの開発環境は、

* windows7 32bit
* python 3.5.*(3.5.1使用)
* redis 2.8(swapmdragonを動かすのに必要)
* postgreSQL 9.6(データベース)

加えて、モジュールとして以下を導入していた。

* asgi-redis 0.13.1(redisを動かす)
* django 1.8.13(swampdragonがここにしか対応していない)
* psycopg2 2.6.1(postgresを動かす)
* swampdragon 0.4.2.2
* swampdragon-auth 0.1.3

デプロイ先は、AWS上に立てた特に初期設定等されていない、何の変哲もないCentOS7である。
まっさらなのでとりあえずapacheから入れる必要があった。

# デプロイ先の準備
CentOS7上に、Webアプリケーションを動かす土台を作る。
今回は以下を導入する。

* apache
* postgresql
* redis

何れも最新であれば問題ない(はず)。
ついでに、wsgi環境の準備のためにmod_wsgiも導入する。

加えて、CentOS7に素で入っていたPythonのバージョンが2.7だったので、``python3.5``という形式のコマンドで使えるようにPython3.5.1をインストールした。

また、redisは何も考えずにインストールすると、2.8以前のバージョンしか入らないので、[ここ](http://qiita.com/n0bisuke/items/2448010c0dfaf8a20167)を参照し、直接導入した。

というところで本題のデプロイである。

# デプロイ(djangoの普通の手順)
デプロイしたいアプリケーションはgithub上に配置していたので、以下のディレクトリにクローンして配置した。

    /var/www/cgi-bin/

場所はapacheの初期設定っぽい場所である。

後は特に何も考えず、[バージョン違いの公式ドキュメント](http://docs.djangoproject.jp/en/latest/howto/deployment/wsgi/modwsgi.html)に従いhttpd.confを修正…。

が、これだけで動くわけもない。

リアルタイムWeb実現のためには、swampdragonのサーバーへのルーティング、redisサーバーの起動が必要だった。

# デプロイ(swampdragonがあるときの手順)
今回、CentOS上で動かす必要のあるサーバーは以下の４つ。

* Webサーバー(apache)
* DBサーバー(postgresql)
* APサーバー(django(swampdragon))
* セッションサーバー(redis)

このうち前者二つは、以下のコマンドから起動できる。

    systemctl start httpd
    systemctl start postgresql

バックグラウンドで動作するため、コンソールを制圧されるようなこともない。

問題は後者二つである。
djangoそのものはapache上で動いてくれるが、そのモジュールとして導入したswampdragonはdjangoとは別にサーバーを立てる必要がある。
そして、redisもサーバーを起動すると、他の操作ができなくなってしまう。

故に新たに導入したのがtmuxである。
単純にtmuxを導入し、コンソールを分割することで、同時起動を可能とした。

が、問題はまだ残っている。
それがapacheからswampdragonサーバーへのルーティングである。
ここに関する文献が全然見つからず、非常に苦労した。

最終的なapacheの設定(httpd.conf)の中身は以下の通りである(アプリのパスはぼかしている)。

	Listen 80
	Listen 443

	<VirtualHost *:443>
	ProxyPass /data ws://127.0.0.1:9999/data
	ProxyPassReverse /data ws://127.0.0.1:9999/data
	ProxyPass /settings.js http://127.0.0.1:9999/settings.js
	ProxyPassReverse /settings.js http://127.0.0.1:9999/settings.js
	ProxyPreserveHost On
	ProxyRequests Off
	ProxyVia On
	</VirtualHost>

	LoadModule wsgi_module /usr/lib64/httpd/modules/mod_wsgi.so
	WSGIPythonPath /var/www/cgi-bin/path/to/app:/usr/local/bin/python3.5/site-packages
	DocumentRoot "/var/www/cgi-bin/path/to/documentroot"
	Alias /static/ /var/www/cgi-bin/path/to/static/

	<Directory /var/www/cgi-bin/path/to/app/>
	<Files wsgi.py>
	Order deny,allow
	Allow from all
	</Files>
	</Directory>
	WSGIScriptAlias / /var/www/cgi-bin/path/to/wsgi.py

なお、~://127.0.0.1:9999/~はswampdragonを導入した際のデフォルト設定(のはず)。

下半分のLoadModule以下は、ほぼほぼdjango公式サイトの内容通りである。

肝は443ポートの設定である。
swampdragonはが受け取るべき通信は二か所分ある。
ウェブソケット通信用の/dataとhttp用の/settings.jsである。

バーチャルホストとして設定し、別に立てるswampdragonのサーバーへと転送してやれば、そこからredisのサーバーにさらに投げられセッション情報が保存されるようになる。

# まとめ
最終的にはこんな感じのコマンドでリアルタイムwebアプリケーションを起動できるだろう。

	tmux
	systemctl start postgresql
	systemctl start httpd
	sudo redis-server /etc/redis.conf
	
	python3.5 server.py

swampdragonを使うときには、

1. apacheとredisが必須
2. /dataと/settings.jsの転送をそれぞれ指定する必要がある
3. たぶんtmuxつかってサーバー立てるのが一番早いと思います。

以上が、初手動デプロイのお話である。