概要
みなさんこんにちはcandleです。今回はredmineをec2上で使用する方法を紹介します。
redmineはrailsで作られたwebアプリケーションです。railsで作られているということは、必然的にec2ではrailsが動く環境を作ってあげる必要があります。
やっていきましょう。
前提知識
ある程度awsを使い慣れている。セキュリティグループやec2の立ち上げなどはここでは解説しない。
linuxコマンドをある程度理解している
rubyをインストールする
ec2を立ち上げたら、sshでログインします。
まずはyumをupdateします。
sudo yum -y update
railsとかで使用するパッケージをインストールします。
sudo yum install -y wget git curl gcc openssl openssl-devel libxml2 libxml2-devel libxslt libxslt-devel gcc-c++ curl-devel libffi-devel
sudo yum install -y ruby-devel ImageMagick ImageMagick-devel apr-devel apr-util-devel readline readline-devel ruby-devel nodejsglibc-headers libyaml-devel zlib zlib-devel
次にrubyのバージョンを管理できるrbenvをインストールします。
/usr/localにrbenvをインストールします。
sudo git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv
rbenvフォルダ以下全てのユーザー権限をrootからec2-userに変更します。
sudo chown -R ec2-user /usr/local/rbenv
インストールしたrbenvを使う為/etc/profileを書き換えますが、バックアップを取っておきます。
sudo cp -p /etc/profile /etc/profile.ORG
/etc/profileの最後に以下を記述します。
export RBENV_ROOT=/usr/local/rbenv export PATH="${RBENV_ROOT}/bin:${PATH}" eval "$(rbenv init -)"
rbenvはこれだけではrubyを管理できないので、ruby-buildのプラグインをインストールします。
rbenv以下は先ほどec2-user権限になったのでsudoは必要ありません
git clone git://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
rbenvをリフレッシュします。
rbenv rehash
これでrbenvのインストールは完了しました。
which rbenvと入力して「/usr/local/rbenv/bin/rbenv」と出れば成功です。
railsは外部ライブラリを扱う為にgemという管理ツールを使用します。gemの設定をしないといらないリファレンスをインストールしてしまいます。
/home/ec2-user/に.gemrcファイルを作り、以下を記述します。
gem: --no-rdoc --no-ri install: --no-document update: --no-document
rubyをrbenvを使用してインストールします。redmineはちょっと前まで、rubyのバージョンんが2.0.0のみ対応してましたが、redmine3.2からrubyのバージョンが2.2.3になりました。
ruby 2.2.3をインストールします。
rbenv install 2.2.3 rbenv global 2.2.3 rbenv rehash
railsをインストールする
gemでbundlerとnokogiri、railsをインストールします。
bundlerはrailsのgemを管理するものです。
nokogiriはec2の問題で、オプションをつけてあらかじめインストールしておかないと動きません。
以下を実行しましょう。
gem install bundler gem install nokogiri -- --use-system-libraries gem install rails rbenv rehash
これでrailsがインストールできました。
nginxをインストールする
nginxはrailsを動かす動かす為に必要です。
sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
sudo yum -y install nginx sudo service nginx start sudo chkconfig nginx on
nginxをインストールできました。
mysqlをインストールする
redmineのデータベースの使用はmysqlをec2にインストールするかawsのサービスのRDSを使うかの選択肢があります。
本当に業務とかで使うならrdsにする方をお勧めします。今回はec2にmysqlをインストールして、使用します。
sudo yum install -y mysql-server mysql-devel sudo service mysqld start sudo chkconfig mysqld on
mysqlのrootユーザーを使うのはよろしくないので、ユーザーを作成します。
まずはmysqlにログインします。
パスワードは無しでログインします。
mysql -u root -p
ユーザーを作成します。redmine_productionデータベースを扱う為のredhogehogeというユーザーを作成しました。パスワードは長めに20文字くらいで作りました。パスワードは同じにしないでください。
GRANT ALL PRIVILEGES ON redmine_production.* TO redhogehoge@localhost IDENTIFIED BY 'W5jPyqA0kEnXlfQmnsh2' WITH GRANT OPTION;
redmineのダウンロードと環境構築
redmineの3.2.0をダウンロードします。
nginxの公開ディレクトリである/usr/share/nginx/に移動して、プロジェクトをgithubからダウンロードします。
cd /usr/share/nginx sudo wget https://github.com/redmine/redmine/archive/3.2.0.zip
ダウンロードしたzipを解凍します。zipファイルの削除とディレクトリ名を変更します。
sudo unzip 3.2.0.zip sudo rm 3.2.0.zip sudo mv redmine-3.2.0 redmine
redmine以下の権限がrootだと設定が面倒なので、ec2-user権限に変更します。
sudo chown -R ec2-user ./redmine
次にデータベースに接続する為の設定をするのでredmineフォルダのconfigに移動します。
cd ./redmine/config
database.yml.exampleをコピーします。
cp -p database.yml.example database.yml
そしたら、database.ymlを開いて、一番上のmysqlのproductionの所を以下の様に書き換えます。ユーザー名とパスワードは先ほど作成したものを使います。
production: adapter: mysql2 database: redmine_production host: localhost username: red67dbuser password: "W5jPyqA0kEnXlfQmnsh2" encoding: utf8
データベースの設定はできました。
次に、redmineの設定を行います。これは同じくconfigフォルダの中に、「configuration.yml.example」というファイルがあるので、これをコピーして作成します。
cp -p configuration.yml.example configuration.yml
ここでのセッティングは「Simple SMTP server at localhost」の所ぐらいです。
delivery_method: :smtp smtp_settings: address: "localhost" port: 25 domain: "example.com"
これで保存しましょう。
今はconfigフォルダにいるので1つ上のredmineフォルダに移動してgemをインストールします。
cd .. bundle install --without development test --path vendor/bundle
gemがインストールされたら、
セッションのシークレットトークンを生成します。以下のコマンドだけで作られます。
bundle exec rake generate_secret_token
私の場合は以下の警告がでましたが問題ないでしょう。
warning: duplicated key at line 466 ignored: “inodot”
redmineのデータベースを作成します。
bundle exec rake db:create RAILS_ENV=production
redmineのデータベースはまだ空なので、migrationファイルを反映してテーブルとカラムを作成します。
bundle exec rake db:migrate RAILS_ENV=production
redmineはrailsアプリケーションです。railsをnginxで動かすにはunicornというを使用します。
redmineフォルダの中にあるGemfileに以下を追加します。
gem "unicorn"
で以下のコマンドを実行
bundle install
unicornの起動や停止を行うrakeスクリプトを作成します。
redmineフォルダの「lib/tasks」ディレクトリにunicorn.rakeファイルを作成し、以下を記述します。
cd lib/tasks touch unicorn.rake
作成したunicorn.rakeに以下を記述します。
# coding: utf-8 # Unicorn signal handling see: http://unicorn.bogomips.org/SIGNALS.html namespace :unicorn do def unicorn_kill(signal) pid = File.read("/tmp/unicorn.pid").to_i Process.kill(signal, pid) rescue Errno::ENOENT, Errno::ESRCH STDERR.puts "Unicorn doesn't seem to be running" end desc 'Start unicorn' task :start do sh "bundle exec unicorn_rails -c #{Rails.root}/config/unicorn.rb -E production -D" end desc 'Quick shutdown' task :shutdown do unicorn_kill :INT end desc 'Graceful shutdown' task :stop do unicorn_kill :QUIT end desc 'Graceful restart (Application code can be loaded)' task :graceful do unicorn_kill :USR2 end desc 'Reopen all logs owned by the master and all workers' task :reopen do unicorn_kill :USR1 end desc 'Increment the number of worker processes by one' task :increment do unicorn_kill :TTIN end desc 'Decrement the number of worker processes by one' task :decrement do unicorn_kill :TTOU end end
次にunicornの設定ファイルを作ります。redmineのconfigフォルダの中にunicorn.rbを作成して以下を記述します。
cd config/ touch unicorn.rb
@app_path = '/usr/share/nginx/redmine' worker_processes 1 working_directory "#{@app_path}/" preload_app true timeout 30 listen "/tmp/unicorn.sock", :backlog => 64 pid "/tmp/unicorn.pid" stderr_path "#{@app_path}/log/unicorn.stderr.log" stdout_path "#{@app_path}/log/unicorn.stdout.log" 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の設定が終わりました。
nginxの設定
続いてnginxのrailsの設定をします。
/etc/nginx/conf.dに移動します。
cd /etc/nginx/conf.d
redmine.confを作成します。
sudo touch redmine.conf
redmine.confに以下を記述
upstream unicorn_server { # This is the socket we configured in unicorn.rb server unix:/tmp/unicorn.sock fail_timeout=0; } server { listen 80; client_max_body_size 4G; server_name redmine-test.com; keepalive_timeout 5; root /usr/share/nginx/redmine/public; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://unicorn_server; break; } } error_page 500 502 503 504 /500.html; location = /500.html { root /usr/share/nginx/redmine/public; } }
これで保存します。
nginxをrestartします。
sudo service nginx restart
続いて、unicornを起動します。
redmineフォルダの権限をec2-userとグループをnginxにします。
cd /usr/share/nginx sudo chown -R ec2-user:nginx ./redmine cd ./redmine
bundle exec rake unicorn:start
もしも、エラーが出た場合は以下の問題です。configフォルダのunicorn.rbの「preload_app true」
をコメントアウトしてください。これはメモリが足りない場合によく起こります。
また、/tmpディレクトリにあるunicorn.pidとunicorn.sockが古かったりするとうまく起動できない場合が有ります。その時はこの2つのファイルを削除してください。
後はサーバにアクセスすれば動きます。
サーバーへのアクセスはec2のグローバルIPアドレスでもおそらくアクセスできます。
nginxの設定ではドメインを「redmine-test.com」としました。dnsを設定しない場合は、自分のパソコンのhostsに
ec2のグローバルIPアドレスとredmine-test.comをひも付けてあげればブラウザからアクセスできます。
まとめ
私は3回ほど、サーバを立てるのに失敗して、できました。以外にきれいにサーバを作るって大変ですよね。