Posted at

さくらVPSでサーバー借りてCentOS 6をインストールして初期設定からRedmineを導入するまでメモ

More than 3 years have passed since last update.


はじめに

僕はフロントエンドエンジニアでありJavaScript大好きReact大好きSPAゴリゴリだぜって感じの人間で、サーバー側に関しては個人でwebアプリケーションを作るときにさくらのVPS借りてぐぐりつつ簡単な設定をしてnginxでリバースプロキシやってNode.jsのAPIサーバーつなぐくらいしかしたことのないサーバー素人です。

そろそろ毎回ぐぐってなんとか解決みたいなことはやめたいなと思っていてそんなタイミングでサーバーにredmineを導入するというタスクがやってきたので、タスクをこなしつつちゃんと理解をしてサーバー側への苦手意識克服とかの意味もこめてメモに落とし込んでいこうと思います。

参考記事:

CentOS 6.3 にRedmine をインストールしてみた

RedmineをCentOS 6上で動かすーUnicornとNginx編


環境


  • CentOS 6 x86_64

  • Ruby 2.3.0

  • MariaDB 5.5

  • Nginx 1.0.15

  • Unicorn

  • Redmine 3.2

自社で事前に借りてあったさくらVPSのメモリ1Gのものが放置されていたので、一度CentOSを再インストールして初期設定からやります。

OSインストール欄から「標準OSインストール」を選択します。標準OSを選択すると「CentOS 6 x86_64」がインストールされます。

そもそもCentOS 6の「x86_64」が何を意味しているのかがわからなくてバージョンが6であることしかわかっていない。

ぐぐってみたところ、「AMD64」のことを意味しているようで、 x86命令を64ビット幅のデータやメモリアドレスに対応できるよう拡張した命令セット ということらしい。結局よくわからないけれどintelの命令セットのアーキテクチャで、こういう種類があるよってくらいに覚えておこう。他に「i386」ってのがあるらしい。

CentOSのインストールは終わっていることを前提に以下の手順で進めていきます。

あとはドメイン側で事前にDNSの設定をしておく必要があります。


手順


サーバーの初期設定をする


SSHでサーバーに接続

何はともあれサーバーに入らないとはじまらないので接続してみます。

これ以降コマンドが出てきますが、エラーが出てきたらとりあえずコマンドの頭にsudoをつけた状態でもう一度挑戦しましょう。sudoはroot権限で実行するよっていう意味です。超強いって意味です。

ssh root@<接続先IPアドレス>

<接続先IPアドレス>のところはコントロールパネルであるとかさくらVPS契約時のメールで確認できるはず。

ここでパスワードが聞かれるのでこれもメールとかで見つけ出しましょう。


とりあえずyumをアップデートする

yumというのはパッケージを管理するツールなのですが、初期状態だとバージョンが古い可能性があるのでとりあえずupdateをしておきます。

yum update


作業用ユーザーを作る

rootで作業するのではなくとりあえず作業用のユーザーをつくるってのが慣例のようなので作ります。

useradd [ユーザー名]

passwd [ユーザー名]
usermod -G wheel [ユーザー名]

まずはユーザーを追加して、そのユーザーにパスワードを付与します。2回パスワードを聞かれるので同じものを入れましょう。

そして作成したユーザーでsudoが使えるように、ユーザーをwheelグループに入れます。

この状態だとまだsudoは使えないので、wheelグループがsudoを使えるようにvisudoを変更します。

visudo

このコメントを叩くとvimが立ち上がるので、/で「wheel」を検索しましょう。

そうすると以下の2行が見つかるので、下の行のコメントアウトをはずします。

## Allows people in group wheel to run all commands

# %wheel ALL=(ALL) ALL

これでwheelグループがsudoを使えるようになりました。

ここで一度サーバーから抜けて、新しく作成したユーザーでSSH接続できるか試してみましょう。

exit // サーバーから抜ける

ssh [作成したユーザー名]@<接続先IPアドレス>

これでまたパスワードがきかれるので設定したパスワードを入れましょう。

無事に接続できたらおっけーです。


セキュリティのあれこれをする


鍵認証方式にする

パスワード認証方式のログインだとセキュリティ的に弱いので鍵認証方式にします。

自分のPCの公開鍵をサーバーに渡して自分のPCの秘密鍵とのペアで認証をする方式です。

すでに公開鍵と秘密鍵が自分のPC上に存在する前提で進めます。

公開鍵・秘密鍵の生成ができていない場合は以下を見たら良いと思います。

Git サーバー - SSH 公開鍵の作成

まずはサーバー側に公開鍵の保存場所を作って、パーミッションを変更しておきます。

作業用ユーザーでログインしている状態で以下のコマンドを叩きます。

mkdir ~/.ssh

chmod 755 ~/.ssh

次は自分のPCからサーバーに公開鍵を転送します。

ターミナルをもう一つ開いて以下のコマンドを叩きます。

scp ~/.ssh/id_rsa.pub [作成したユーザー名]@<接続先IPアドレス>:~/.ssh/authorized_keys

ここまでで鍵認証の設定は完了です。一度サーバーから抜けてもう一度作ったユーザーでログインしてみてください。

パスワードを聞かれてしまった場合は、authorized_keysが機能していないのですが、こういうときは大体パーミッションが問題のときです。

詳しくはログを見ればよくわかります。以下を叩くと接続のログを見ることができます。

sudo cat /var/log/secure

Authentication refused: bad ownership or modes for directoryって感じの文章があったらそれはパーミッションエラーなので、/home/[ユーザー名]/home/[ユーザー名]/.ssh/home/[ユーザー名]/.ssh/authorized_keysのパーミッションを変更する必要があります。

詳しくは以下を参照で。

SSHが鍵認証されないとき、パーミッションを疑え。

パスワードを聞かれずにログインできたらおっけーです。


SSHの設定を変更する

ここからSSHの設定を編集して鍵認証以外の方法でログインできないようにして、鍵認証で使うPortをデフォルトの22から変更します。

ついでにrootでのログインも禁止にします。どれもセキュリティ向上のために必須だと思われます。

まずは以下のコマンドを叩いてファイルを編集します。

sudo vi /etc/ssh/sshd_config

以下の該当箇所を検索して編集して保存してください。

#Port 22 // コメントアウトを外して22を好きな番号(1024〜65535)に変更(デフォルトのポートから変える)

#PermitRootLogin yes // コメントアウトを外してyesをnoに変更(rootでのログイン禁止)
#RSAAuthentication yes // コメントアウトを外す(鍵認証を有効化)
#PubkeyAuthentication yes //コメントアウトを外す(公開鍵での認証を有効化)
#AuthorizedKeysFile .ssh/authorized_keys // コメントアウトを外す(公開鍵のパスを設定)
PasswordAuthentication yes // yesをnoに変更(パスワード認証の禁止)

編集して保存したらSSHの設定を反映させます。

sudo /etc/init.d/sshd restart

エラーが出なかったらおっけーです。

再びexitでサーバーを抜けて再度ログインしますが、今回からはポートを指定する必要があります。

ssh [作成したユーザー名]@<接続先IPアドレス> -p [指定したポート番号]

これでログインできたらSSHの設定の変更は終了です。


ファイアーウォールの設定をする

最後にファイアーウォールの設定をしてセキュリティを高めます。

以下のコマンドを叩いてファイルを作成します。

sudo vi /etc/sysconfig/iptables

そして以下の内容を記述してください。

*filter

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:SERVICES - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport [指定したPort番号] -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT

[指定したPort番号]のところは書き換えてください。

これはドットインストールさんの設定をそのまんま使わせてもらってますが、基本的に通信を遮断するけれど指定したいくつかのポートは開けとくっていう設定のようです。

保存したら設定を反映させます。

sudo service iptables start

okと出てきたらおっけーな感じです。セキュリティはここまで。


redmineを入れるのに必要なものを揃える

redmineを動かすために必要なものを入れていきます。


Rubyのインストール

Rubyのバージョン管理ツールであるrbenvを使ってRubyを入れます。

gitが入ってなかったらインストール

sudo yum -y install git

rbenvのインストール

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

ruby-buildのインストール

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

そしてopensslをインストールしていないとrubyインストール時にエラーになってしまうそうなので入れます。

sudo yum -y install openssl-devel

さらにreadlineがないとrails cpadrino cでエラーになるそうなのでこれもまた入れます。

sudo yum -y install readline-devel

パスを通さないといけないです。

# PATH に追加

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
exec $SHELL -l

Rubyのインストール

rbenv install -v 2.3.0

再読み込みしてインストールされているRubyのバージョン一覧を表示

rbenv rehash

rbenv versions

2.3.0

さっきインストールした最新版に設定して確認

rbenv global 2.3.0

ruby -v

ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

Rubyのインストールはこれでおっけーです。


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

sudo yum groupinstall "Development Tools"

sudo yum install zlib-devel curl-devel libyaml-devel
sudo yum install ImageMagick ImageMagick-devel

これで必要なものがそろったっぽい。

一応それぞれのパッケージの用途を調べてみた。



  • zlib-devel データの圧縮および伸張を行う


  • curl-debel HTTPアクセスをしてコンテンツを取得できる


  • libyaml-devel C言語でYAMLファイルを簡単に扱うようにする


  • ImageMagick 画像を操作したり表示したりする


  • ImageMagick-devel ImageMagickとセット


データベースの準備


MariaDBをインストールする

まずは以下のURLにいきます。

https://downloads.mariadb.org/mariadb/repositories/

ここで使っている環境を選択していくとコピペ用の文字列を生成してくれます。

今回は「1. Choose a Distro」で「CentOS」を選んで「2. Choose a Release」で「CentOS 6 (64bit)」を選んで「3. Choose a Version」で「5.5」を選びます。そうすると以下の内容が生成されます。

# MariaDB 5.5 CentOS repository list - created 2014-06-26 11:57 UTC

# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

ファイルを新たに作成してこの内容を記述して保存します。

sudo vi /etc/yum.repos.d/MariaDB.repo

それができたら、yumでMariaDBをインストールします。

sudo yum install MariaDB-server MariaDB-devel

インストールができたらちょこっと設定をします。

テーブルの言語がlatin1にならないようにutf8設定を追加します。

sudo vi /etc/my.cnf.d/server.cnf

コマンド叩いてファイルを開いたら以下を追加します。

[mysqld]

character-set-server = utf8

こちらも同じように。

sudo vi /etc/my.cnf.d/mysql-clients.cnf

コマンド叩いてファイルを開いたら以下を追加します。

[mysql]

default-character-set = utf8
show-warnings

ここまでできたらMariaDBを起動してみます。

MariaDBですがmysqlという名前になってます。

sudo service mysql start

Starting MySQL.. SUCCESS!

とりあえず接続してみます。

最初はrootユーザーでいけるかと思います。パスワードは設定されていない。

mysql -uroot

MariaDB [(none)]>

rootユーザーにパスワードを付与します。

MariaDB [(none)]> SET PASSWORD FOR root@localhost=PASSWORD('[パスワード]');

Query OK, 0 rows affected (0.01 sec)

パスワードが設定されたかどうかは以下のコマンドで確認することができます。

MariaDB [(none)]> SELECT user,host,password FROM mysql.user;

表示されるパスワードは暗号化されたあとなので入力したものとは違いますが、パスワードが設定されたことがわかるかと思います。

表示されたものを見るとrootユーザーが4つあることに気づくと思いますがとりあえずそれら全部にパスワードを付与したほうが良いっぽいです。

ここらへんあまり詳しくわかっていない状態…。

MariaDB [(none)]> UPDATE mysql.user SET password = PASSWORD('[パスワード]') WHERE user = 'root';

Query OK, 3 rows affected (0.00 sec)
Rows matched: 4 Changed: 3 Warnings: 0

MariaDB [(none)]> FLUSH PRIVILEGES;

FLUSH PRIVILEGESは権限を反映させるために必要なようです。

ここまでやったらMariaDBの設定はおっけーです。


nginxの準備


nginxのインストール

以下のコマンドを叩いてnginxをインストールします。

sudo yum install nginx

インストールができたらnginxを起動します。

sudo service nginx start

sudo chkconfig nginx on


プロキシの設定をする

以下のコマンドを叩いてnginx.confを編集します。

sudo vi /etc/nginx/nginx.conf

以下の内容をhttp {の直下に記述します。

upstream redmine {

server 127.0.0.1:5001;
}

のちのちredmineを5001番ポートで動かすのでそこに繋ぐための設定です。


バーチャルホストの設定をする

以下のコマンドを叩いてvirtual.conf を編集します。

sudo vi /etc/nginx/conf.d/virtual.conf

以下の内容を記述します。server_nameを自分のドメインに変更してください。

server {

listen 80;
server_name redmine.[自分のドメイン];

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 "/var/www/redmine/.htpasswd";

location / {

root /var/www/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;
}
}

Basic認証用のファイルを作成します。

printf "[ユーザー名]:$(openssl passwd -1 [パスワード])\n" >> .htpasswd

設定が終わったので再起動をします。

service nginx restart


遂に本体を入れる


redmineをダウンロードする

ファイルを置きたい場所に移動してからgitでダウンロードします。

cd /var/www

sudo git clone https://github.com/redmine/redmine.git
cd redmine
sudo git checkout 3.2-stable

redmineリポジトリが入りました。バージョンは現在の安定版の最新にしました。


redmineのデータベース設定をする

設定ファイルを作成します。

sudo vi /var/www/redmine/config/database.yml

以下の内容を記述して保存します。

ユーザー名はredmineで、パスワードは好きにやっちゃってください。あとでDB側でユーザーとパスワードの設定をします。

production:

adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "[パスワード]"
encoding: utf8

データベースを作成します。

MariaDBに接続して作成します。

mysql -uroot -p

MariaDB [(none)]> CREATE DATABASE redmine;

ユーザーとパスワードを設定します。

MariaDB [(none)]> GRANT ALL ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY '[パスワード]' WITH GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit;


メール設定をする

以下のコマンドでファイルを作成します。

sudo vi /var/www/redmine/config/configuration.yml

以下の内容を記述して保存します。

# Simple SMTP server at localhost

production:
email_delivery:
delivery_method: :smtp
smtp_settings:
address: "localhost"
port: 25


Rubyモジュール群のインストール

以下のコマンドでbundlerをインストールします。

sudo gem install bundler --no-rdoc --no-ri

これでbundlerを使用できるようになったので、Redmineで必要になるRubyパッケージ群をインストールします。

パッケージはredmineディレクトリの中に入れます。

sudo bundle install --path vendor/bundler --without development test


Redmineの初期化

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

sudo bundle exec rake generate_secret_token

Redmineが使用するデータベースにスキーマを構築します。

sudo bundle exec rake db:migrate RAILS_ENV=production

sudo bundle exec rake redmine:load_default_data RAILS_ENV=production

これでDBにテーブルが作られました。


Unicornを動かす


Unicornのインストール

以下のコマンドを叩きます。

echo 'gem "unicorn"' > Gemfile.local

bundle install


Unicornの設定

ここらへんの内容に関して以下のページのものをそのまま使わせていただいております。

ありがとうございます。

さくらVPSで nginx + MySQL + Unicorn + Redmine の運用

以下のコマンドでファイルを作成します。

sudo vi /var/www/redmine/config/unicorn.rb

記述する内容は以下になります。詳しい説明は先ほどのリンク先でお願いします。

worker_processes 2

#working_directory /var/www/redmine

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

ここまでできたら、以下のコマンドを叩いてRedmineを起動します。

bundle exec unicorn_rails -c config/unicorn.rb -E production -D -p 5001


接続してみる

あとはredmine.[自分のドメイン]にアクセスしたらbasic認証の画面になるので、そこを通ってredmineが表示されたら完了です。

ここで500エラーが出てくる場合は多分パーミッションの問題だと思われます。

以上で完成です。

redmineの初期設定はここが良い感じぽいです。

Redmineを使い始めるための初期設定


まとめ

ぐぐりまくりながらやってみたら随分時間かかってしまいましたができました。

そこまで長時間はまるところもなくできたので良かったです。世の中には素晴らしい記事がすでにたくさん存在してました。感謝ですね。

サーバーへの苦手意識が克服できたかどうかはわかりませんが一応やる前よりは知識がついたので良しとします。おわり