2014-01-17 [長年日記]
nginx+Rack環境に移行した
歴史的経緯で、いままでこの日記はapache+cgiという昔ながらの環境で動かしていたのだけど、バージョンアップ時のトラブルやプラグインの管理等々で手間がかかることがままあったので、パッケージの更新はgemで、サーバーはRackで動かして、proxy serverとしてnginxを使うことにした。
tDiary側
基本的には公式リリースのgemを使用するつもりなので、
$gem install tdiary
でいいのだけど、tdiary-contribはHEADを追いかけたいので今回だけ、githubから最新版を持ってきてgemを作って入れた。やり方はこの間書いたので省略。
$ gem list --local | grep tdiary tdiary (4.0.2.20131215)
こんなかんじになっていればOK。
$tdiary new ~/diary $cd ~/diary $bundle exec server start
で動くことを確認して一旦停止。 起動時に動くように/etc/init.d/tdiaryを以下のような内容で作成。
#! /bin/sh ### BEGIN INIT INFO # Provides: tDiary # Required-Start: $local_fs $remote_fs $network $syslog $named # Required-Stop: $local_fs $remote_fs $network $syslog $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: tDiary initscript # Description: tDiary initscript # placed in /etc/init.d. ### END INIT INFO # Author: kp <knomura.1394@gmail.com> # USER=www-data RBENV_ROOT=/home/kp/.rbenv PATH=$RBENV_ROOT:/sbin:/usr/sbin:/bin:/usr/bin DESC="tDiary server" NAME=tdiary PIDFILE=$NAME.pid TDIARY_PATH="/home/kp/diary" echo -n "Stopping:tDiary " case "$1" in start) echo -n "Starting:tDiary " start-stop-daemon --start --pidfile $TDIARY_PATH/$PIDFILE --background \ --chdir $TDIARY_PATH --chuid $USER \ --exec $RBENV_ROOT/shims/bundle \ -- exec $NAME server -b localhost && echo [ OK ] || echo [FAIL] ;; stop) start-stop-daemon --stop --oknodo --pidfile $TDIARY_PATH/$PIDFILE && echo [ OK ] || echo [FAIL] ;; restart) $0 stop $0 start ;; *) echo "Usage:$0 {start|stop|restart}" exit 1; ;; esac
あとは、
- 独自にカスタマイズしたpluginをdiary/custom/pluginに移動し、tdiary.confに記述
- いままでの日記のデータをdiary/dataに移動し、www-dataで書けるようにユーザ権限を設定
- 使用しているテーマをディレクトリごとdiary/themeにコピー
- Gemfile.localにtidary-contribをパス指定で記述
したくらい。
nignx
インストールしてserverを設定。一部抜粋すると、
server { listen 80; listen [::]:80; server_name mmho.net; access_log /var/log/nginx/$server_name-access.log; error_log /var/log/nginx/$server_name-error.log error; rewrite ^([^.]*[^/])$ $1/ permanent; location /diary/ { proxy_pass http://localhost:19292/; proxy_redirect default; } location = / { rewrite ^ http://$server_name:$server_port/diary/; } }
こんな感じ。
いままでどおり、/diaryでアクセスできるように設定したのだけど、proxyまわりの設定がよくわからなくて難儀した。 proxy_passの最後のスラッシュがないと動きが変わるので注意。
(追記)
リンク元として自分自身が記録されていたので、X-Forwarded-Hostを設定し、 base_urlをconfig.ruで設定するようにしたけど、まだなにかおかしい気がする。
--- mmho.bak 2014-01-20 10:24:10.926716279 +0900 +++ mmho 2014-01-17 16:43:38.566865066 +0900 @@ -19,8 +19,10 @@ rewrite ^([^.]*[^/])$ $1/ permanent; location /diary/ { - proxy_pass http://localhost:19292/; + proxy_pass http://localhost:19292; proxy_redirect default; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Server $host; } location = / {
nginxの設定の差分はこんなかんじで、
--- config.ru.bak 2014-01-20 10:29:32.870703472 +0900 +++ config.ru 2014-01-17 15:00:37.078819871 +0900 @@ -2,5 +2,5 @@ require 'tdiary/application' use ::Rack::Reloader unless ENV['RACK_ENV'] == 'production' -base_dir = '/' +base_dir = '/diary/' run TDiary::Application.new( base_dir )
config.ruはこんな感じで変更。
test