さくらVPSで nginx + MySQL + Unicorn + Redmine の運用
さくらVPSにRedmineを入れることになったたので、その手順をメモします。
構成
バージョン管理: Redmine
プロキシサーバ: nginx
データベース: MySQL
nginxに redmine.example.com としてアクセスされたら、Redmineを起動している 127.0.0.1:5001 へ繋ぐという形にしました。
下記をほぼ参考にしています。
http://letsspeak.hatenablog.com/entry/2012/10/31/025819
redmine のインストール
githubにあるredmineを clone してきます。
# git clone https://github.com/redmine/redmine.git
# cd redmine
# bundle install --path vendor/bundle --without development test rmagick postgresql sqlite
redmine 用のDB、接続ユーザーを作成
DB名は redmine、redmineというユーザー名で作成します。
パスワードは password を変更して下さい。
# mysql -u root -p
# mysql> create database redmine character set utf8;
# mysql> create user 'redmine'@'localhost' identified by 'password';
# mysql> grant all privileges on redmine.* to 'redmine'@'localhost';
# mysql> exit
redmine の DB接続情報を修正
config/database.yaml.example を config/database.yaml にコピーします。
# cp config/database.yaml.example confing/database.yaml
config/database.yaml を下記のように編集します。
(password は「redmine 用のDB、接続ユーザーを作成」で指定したものを入れる)
# Default setup is given for MySQL with ruby1.8. If you're running Redmine
# with MySQL and ruby1.9, replace the adapter name with mysql2.
# Examples for PostgreSQL and SQLite3 can be found at the end.
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: password
encoding: utf8
development:
adapter: mysql2
database: redmine_development
host: localhost
username: redmine
password: password
encoding: utf8
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
adapter: mysql
database: redmine_test
host: localhost
username: root
password:
encoding: utf8
test_pgsql:
adapter: postgresql
database: redmine_test
host: localhost
username: postgres
password: "postgres"
test_sqlite3:
adapter: sqlite3
database: db/test.sqlite3
redmine の DB を構築します
2つ目のコマンドを実行すると言語選択が表示されます。ここでは「ja」と入力してリターンします。
# RAILS_ENV=production rake db:migrate
# RAILS_ENV=production rake redmine:load_default_data
webrick で起動テスト
redmine と MySQLのインストールが問題なくできているか確認するために webrick という Ruby 簡易 HTTP サーバを利用して Redmine を起動テストします。
下記のコマンドではポート3000として起動します。アクセスし、 Redmine が開けば成功です。
# ruby script/rails server webrick -e production
(2012/12/29 06:56 追記)
500 error がでて、log/production.log 内を確認したら、「ArgumentError (A secret is required to generate an integrity hash for cookie session data. Use config.secret_token = "some secret phrase of at least 30 characters"in config/initializers/secret_token.rb):」を発見。
対処方法は、 「rake generate_secret_token」で解決。
unicorn のインストール
本番環境では unicorn を利用して起動します。
unicorn は Ruby の Rails サーバで Ruby 版のHTTPサーバ + daemontools のようなもので、落ちても自動再起動してくれるものです。
gem コマンドで unicorn を入れます。
# gem install unicorn
Redmine を unicorn で起動する
config/unicorn.rbを作成します。
#vi config/unicorn.rb
unicorn.rbは下記ように作成します。
worker_processes 2
#working_directory /home/www/rails/charag
listen File.expand_path("tmp/unicorn.sock", ENV['RAILS_ROOT'])
pid File.expand_path("tmp/unicorn.pid", ENV['RAILS_ROOT'])
timeout 60
preload_app true # ダウンタイムをなくす
stdout_path File.expand_path("log/unicorn.stdout.log", ENV['RAILS_ROOT'])
stderr_path File.expand_path("log/unicorn.stderr.log", ENV['RAILS_ROOT'])
GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true
before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
Process.kill(sig, File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end
sleep 1
end
after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
そして、 unicorn.rb を指定して Redmine を起動します。
# bundle exec unicorn_rails -c config/unicorn.rb -E production -D -p 5001
5001ポートにアクセスして Redmine が開けば成功です。
ps コマンド、netstat コマンドでポート開放、 unicorn がどんな風に起動しているか確認してみるといいでしょう。
今後のトラブル対策になります。
unicorn を止めるには psコマンドで unicorn の master プロセスを確認し、 kill 9 プロセスNo で止められます。
nginx のプロキシ、バーチャルホスト設定、 nginx の再起動
nginx.conf を編集します。
# vi /etc/nginx/nginx.conf
「 http { 」の下に下記のコードを入れます。
upstream redmine{
server 127.0.0.1:5001;
}
virtual.conf を編集します。
# vi /etc/nginx/conf.d/virtual.conf
virtual.vconf に下記のコードを入れます。
server {
listen 80;
server_name redmine.example.com;
access_log /var/log/nginx_redmine_access.log;
error_log /var/log/nginx_redmine_error.log;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
auth_basic "Secret Area";
auth_basic_user_file "/home/www/rails/redmine/.htpasswd";
location / {
root /home/www/rails/redmine/public;
if (-f $request_filename){
break;
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://redmine;
proxy_redirect off;
}
}
nginx を再起動します。
# service nginx restart
virtual.conf で指定した server_name にアクセスして Redmine が開けば成功です。
最後に
git clone で redmine を入れた時、root 権限で行ったため、 nginx の実行ユーザーとは別になっていたのでうまく起動できませんでした。
500 エラーが発生した時は、フォルダ及びアクセス権限のパーミッションをチェックしてみるといいでしょう。
Redmine の初期設定等は下記のURLが詳しいです。