More than 1 year has passed since last update.

[概要]

CentOS7にNginx + UnicornでRedmine3.3を構築する。

[事前準備]

下記が構築済みであることが前提です。
CentOS7の初期セットアップ手順

[作業内容]

必要パッケージインストール

$ sudo yum install openssl-devel
$ sudo yum install readline-devel
$ sudo yum install curl-devel
$ sudo yum install libyaml-devel
$ sudo yum install ImageMagick
$ sudo yum install ImageMagick-devel
$ sudo yum install wget
$ sudo yum install git
$ sudo yum install bzip2
$ sudo yum install gcc

MySQLインストール

MySQLのリポジトリ追加

$ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

最新版のMySQLインストール

$ sudo yum install mysql mysql-server mysql-devel

my.cnfの編集

sudo vi /etc/my.cnf

元からある my.cnf を全て消して下記を設定する

/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

character-set-server = utf8

[mysql]
default-character-set = utf8

MySQL起動

$ sudo systemctl start mysqld.service

MySQL自動起動設定

$ sudo systemctl enable mysqld.service

MySQLの起動確認

running になってるのを確認

$ sudo systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2016-08-14 22:22:38 JST; 43s ago
 Main PID: 45334 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─45334 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

 8月 14 22:22:31 redmine.ghfdjk.me systemd[1]: Starting MySQL Server...
 8月 14 22:22:38 redmine.ghfdjk.me systemd[1]: Started MySQL Server.

MySQLの初期パスワード確認

初期パスワードが、設定されいるのでそれを確認

$ sudo cat /var/log/mysqld.log | grep password
2016-08-14T13:22:34.726150Z 1 [Note] A temporary password is generated for root@localhost: <..9k>ocRD8r

MySQLの初期設定

$ sudo mysql_secure_installation

Securing the MySQL server deployment.

### /var/log/mysqld.log に記載されていた初期パスワードを入力
Enter password for user root: ### <..9k>ocRD8r を入力

The existing password for the user account root has expired. Please set a new password.

New password: ### 新しいパスワードを入力

Re-enter new password: ### 新しいパスワードをもう一度入力

### パスワードのポリシーを強化するプラグインをインストール
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

### 強化されたポリシーに則りパスワードを再設定
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: ### 新しいパスワードを入力

Re-enter new password: ### 新しいパスワードをもう一度入力

### anonymous ユーザを削除
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

### リモートからの root ログインを禁止
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

### test データベースを削除する
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

### 権限設定を読み込む
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

/root/.my.cnf作成

$ sudo vi /root/.my.cnf

下記を参考に作成する
{password} は適宜修正してくだい。

[client]
user = root
password = {password}

Redmine用のデータベース作成とユーザ作成

redmineデータベース作成

$ sudo mysql -u root -p
mysql> CREATE DATABASE redmine charset="utf8";

redmineユーザ作成

{password} は適宜変更してください

mysql> GRANT ALL PRIVILEGES ON redmine.* TO redmine@localhost IDENTIFIED BY '{pasword}';
mysql> exit

rbenv + ruby-buildのセットアップ

$ cd /opt
$ sudo git clone https://github.com/sstephenson/rbenv.git
$ sudo mkdir /opt/rbenv/plugins
$ cd /opt/rbenv/plugins
$ sudo git clone https://github.com/sstephenson/ruby-build.git

profile.dにファイルを作成

$ sudo vi /etc/profile.d/rbenv.sh

下記を記述する

/etc/profile.d/rbenv.sh
export RBENV_ROOT="/opt/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init --no-rehash -)"

/opt/rbenv の権限を変更

$ sudo chgrp -R staff /opt/rbenv
$ sudo chmod -R 775 /opt/rbenv

rubyインストール

### 環境変数を読み込み
$ source /etc/profile.d/rbenv.sh

### ruby 2.3.1 をインストール
$ rbenv install 2.3.1

### ruby 2.3.1 を全体に反映
$ rbenv global 2.3.1

Redmineインストール

$ cd /opt
$ sudo wget http://www.redmine.org/releases/redmine-3.3.0.tar.gz

Redmineを解凍

$ sudo tar zxf redmine-3.3.0.tar.gz

Redmineのシンボリックリンク作成

$ sudo ln -s redmine-3.3.0 redmine

RedmineのDB設定

まずは、設定ファイルをバックアップ

$ sudo cp redmine/config/database.yml.example redmine/config/database.yml
$ sudo vi redmine/config/database.yml

password をmysql用DBのパスワードを設定する

/opt/redmine/config/database.yml
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: {password}
  encoding: utf8
  • 設定値について
    • database.ymlにはproduction以外にdevelopmenttestの設定がありますが、基本はproductionのみ使用するのでパスワード設定はproductionだけに設定すれば良いです。
    • adapterはMySQLの場合はmysql2を指定します。
    • databaseはRedmineで使用するデータベース名指定します。
    • usernameはMySQLのデータベースに接続するMySQLのユーザー名を指定します。
    • passwordusernameで指定したMySQLのユーザーのパスワードを指定します。
    • encodingはMySQLで使用する文字エンコーディングを指定します。通常utf8となる。

Redmineメール設定

まずは、設定ファイルをバックアップ

$ sudo cp /opt/redmine/config/configuration.yml.example /opt/redmine/config/configuration.yml

メール設定ファイル編集

$ sudo vi /opt/redmine/config/configuration.yml

production:の箇所に設定する

/opt/redmine/config/configuration.yml
# specific configuration options for production environment
# that overrides the default ones
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "localhost"
      port: 25

権限変更

$ sudo chgrp -R staff /opt/redmine*

システム共通のRubyモジュールインストール

$ cd /opt/redmine
$ gem install bundler --no-rdoc --no-ri

Redmineで必要なRubyモジュールインストール

$ cd /opt/redmine
$ bundle install --path vendor/bundler --without development test

セッションデータ暗号化

改ざん防止のため、セッションデータを格納するクッキーを暗号化する鍵をランダムに生成

$ bundle exec rake generate_secret_token
/opt/redmine-3.3.0/vendor/bundler/ruby/2.3.0/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: key "inodot" is duplicated and overwritten on line 466
### 上記のようにでればOK

データベースのスキーマ構築

$ bundle exec rake db:migrate RAILS_ENV=production

Railsアプリケーションサーバ(Unicorn)のインストール

$ sudo vi /opt/redmine/Gemfile.local

下記を記述
/opt/redmine/Gemfile.local
gem "unicorn"

Unicornのインストール

$ cd /opt/redmine
$ bundle update

Systemd用のUnicornサービス定義ファイルの作成

Redmine(Unicorn)は、起動時にデータベースに接続できないとエラー終了してしまいます。
そこで、[Unit]セクションにAfterで、mysqld.serviceが実行されてからredmine-unicorn.serviceが起動されるよう順序を指定します。

$ sudo vi /usr/lib/systemd/system/redmine-unicorn.service
/usr/lib/systemd/system/redmine-unicorn.service
[Unit]
Description=Redmine Unicorn Server
After=mysqld.service

[Service]
WorkingDirectory=/opt/redmine
Environment=RAILS_ENV=production
SyslogIdentifier=redmine-unicorn
PIDFile=/opt/redmine/tmp/pids/unicorn.pid

ExecStart=/opt/rbenv/shims/bundle exec "unicorn_rails -c config/unicorn.rb -E production"
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

Unicorn設定

$ sudo vim /opt/redmine/config/unicorn.rb
/opt/redmine/config/unicorn.rb
worker_processes 2

app_path = "/opt/redmine"

listen  File.expand_path('tmp/unicorn_redmine.sock', app_path)
pid File.expand_path('tmp/unicorn.pid', app_path)
stderr_path File.expand_path('log/unicorn.stderr.log', app_path)
stdout_path File.expand_path('log/unicorn.stdout.log', app_path)

preload_app true

timeout 30

if GC.respond_to?(:copy_on_write_friendly=)
  GC.copy_on_write_friendly = true
end

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
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

redmine-unicorn起動

$ sudo systemctl start redmine-unicorn.service

redmine-unicornのプロセス確認

### active になっているのを確認
$ sudo systemctl status redmine-unicorn.service
● redmine-unicorn.service - Redmine Unicorn Server
   Loaded: loaded (/usr/lib/systemd/system/redmine-unicorn.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2016-09-22 22:31:34 JST; 19s ago
 Main PID: 35806 (ruby)
   CGroup: /system.slice/redmine-unicorn.service
           ├─35806 unicorn_rails master -c config/unicorn.rb -E production
           ├─35836 unicorn_rails worker[0] -c config/unicorn.rb -E production
           └─35838 unicorn_rails worker[1] -c config/unicorn.rb -E production

 9月 22 22:31:34 redmine.ghfdjk.me systemd[1]: Started Redmine Unicorn Server.
 9月 22 22:31:34 redmine.ghfdjk.me systemd[1]: Starting Redmine Unicorn Server...

redmine-unicornの自動起動設定

$ sudo systemctl enable redmine-unicorn.service

Nginxインストール

Nginxのリポジトリ追加

$ sudo vi /etc/yum.repos.d/nginx.repo
/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Nginxのパッケージ追加

$ sudo yum install nginx

Nginx自動起動設定

$ sudo systemctl enable nginx.service

Redmineの設定ファイルを作成

$ cd /etc/nginx/conf.d

元の設定ファイルをバックアップ

$ sudo mv default.conf default.conf.orig
$ sudo vi /etc/nginx/conf.d/redmine.conf
upstream unicorn-redmine {
    server unix:/opt/redmine/tmp/unicorn_redmine.sock;
}

server {
    listen 80;
    server_name {ドメイン名};

    root /opt/redmine/public;
    client_max_body_size 1G;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_redirect off;
        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_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 600;
        proxy_pass http://unicorn-redmine;
    }

    error_page 500 502 503 504 /500.html;
}

設定フィアルのsyntax確認

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginx起動

$ sudo systemctl start nginx

[事後確認・作業]

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.