はじめに
僕はフロントエンドエンジニアであり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の設定を編集して鍵認証以外の方法でログインできないようにして、鍵認証で使う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 c
やpadrino 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の初期設定はここが良い感じぽいです。
まとめ
ぐぐりまくりながらやってみたら随分時間かかってしまいましたができました。
そこまで長時間はまるところもなくできたので良かったです。世の中には素晴らしい記事がすでにたくさん存在してました。感謝ですね。
サーバーへの苦手意識が克服できたかどうかはわかりませんが一応やる前よりは知識がついたので良しとします。おわり