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はこんな感じで変更。

Tags: tDiary
本日のツッコミ(全1件) [ツッコミを入れる]
kp (2014-01-17 14:25)

test