joppot

コピペで絶対動く。説明を妥協しない

サーバ

awsのec2上でredmineをnginxで使用する方法

投稿日:

Pocket

redmine_top_thumb

概要

みなさんこんにちはcandleです。今回はredmineをec2上で使用する方法を紹介します。
redmineはrailsで作られたwebアプリケーションです。railsで作られているということは、必然的にec2ではrailsが動く環境を作ってあげる必要があります。

やっていきましょう。

前提知識

ある程度awsを使い慣れている。セキュリティグループやec2の立ち上げなどはここでは解説しない。
linuxコマンドをある程度理解している

SPONSORED LINK


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

databasesetting-1

データベースの設定はできました。
次に、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"

redmineconfig

これで保存しましょう。
今はconfigフォルダにいるので1つ上のredmineフォルダに移動してgemをインストールします。

cd ..
bundle install --without development test --path vendor/bundle

bundleinstall

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"

addunicorngem

で以下のコマンドを実行

bundle install

unicornの起動や停止を行うrakeスクリプトを作成します。
redmineフォルダの「lib/tasks」ディレクトリにunicorn.rakeファイルを作成し、以下を記述します。

cd lib/tasks
touch unicorn.rake

createunicornrake

作成した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

redmineconfigfile

これでunicornの設定が終わりました。

nginxの設定

続いてnginxのrailsの設定をします。
/etc/nginx/conf.dに移動します。

cd /etc/nginx/conf.d

redmine.confを作成します。

sudo touch redmine.conf

redminenginxconf

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をひも付けてあげればブラウザからアクセスできます。

Redminesite

まとめ

私は3回ほど、サーバを立てるのに失敗して、できました。以外にきれいにサーバを作るって大変ですよね。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

sshコマンドをaliasかssh configを使って短縮する

概要 みなさんこんにちはcandleです。今回はsshの接続先のホスト名を短くする方法です。 ssh接続は非常に強力なネットワークツールですが、接続先の指定がやや面倒ですね。それを単純にする方法をまと …

vagrantで取得したlet’s encryptのssl証明書をec2のnginxで使用する

概要 みなさんこんにちはcandleです。今回は取得したvagrantのubuntuで取得したlet’s encryptを実際に使用してみます。 もしも、まだ取得してない人は前回の記事を確 …

Ubuntuにmemcachedをインストールする方法と動作確認

概要 みなさんこんにちは、今回はubuntuにmemcachedを入れて、起動や、動作確認を行ってみたいと思います。 memcachedとは比較的短期間「key=>value」という形で値を保存するサ …

macにmemcachedをインストールする方法と動作確認

概要 memcachedはrailsやphpのセッションを保持しておく時に使うソフトというかサーバ的なものです。一般にSNSやログイン式のサービスを提供する時はセッションというのを持ちます。セッション …

wordpress skeletonを使った開発環境の構築

はじめに みなさんこんにちはcandleです。wordpressは大変便利なのですが、いまいちgitで管理するのが難しいものです。 というのも、wordpress全体をgit管理対象にしてしまうと、w …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ