Vagrant で CentOS + Rails + MySQL + Apache + SSL（オレオレ）の環境構築

# はじめに
本番環境に近い開発環境を構築してみたいと思い、環境構築した記録の備忘録です。

今回作成した開発環境の各々のversion
CentOS 7.2
Git 2.13.0
ruby 2.4.1
rails 5.1.1
apache 2.4.6
mysql 5.7

# Vagrantの立ち上げ

vagrantとvirtualboxはインストール済みとして進めて行きますので、まだの方はインストールをお願いします。
ということで、vagrantのboxの追加から行なっていきます。

```bash
# boxの追加
$ vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box


# 作業ディレクトリの作成
$ mkdir ~/vagrant/sample
$ cd ~/vagrant/sample


# vagrantの初期設定
$ vagrant init centos72


# Vagrantfileの編集
$ vi Vagrantfile

26   config.vm.network "forwarded_port", guest: 80, host: 3000
27   config.vm.network "forwarded_port", guest: 443, host: 443

36   config.vm.network "private_network", ip: "192.168.33.10"
47   config.vm.synced_folder "./rails_app", "/home/vagrant/rails_app"

53   config.vm.provider "virtualbox" do |vb|
54   #   # Display the VirtualBox GUI when booting the machine
55   #   vb.gui = true
56   #
57   #   # Customize the amount of memory on the VM:
58     vb.memory = "1024"
59   end


# vagrantの起動
$ vagrant up

# vagrantにssh接続
$ vagrant ssh
```

# vagrantに各種パッケージのインストール

```bash
# とりあえずのアップデート
$ sudo yum -y update

# Gitのためのパッケージ
$ sudo yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel curl-devel

# rbenvのためのパッケージ
$ sudo yum install -y gcc bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel

# apacheのためのパッケージ
$ sudo yum install -y httpd-devel
```

# Gitのインストール

最新版をインストールして行きます。
[Karnel.org](https://www.kernel.org/pub/software/scm/git/)または[Github](https://github.com/git/git/releases)で最新バージョンを**「リンクのアドレスをコピー」**してください。

```bash
# 古いversionのGitがあればアンインストール
$ sudo yum remove git

# 最新versionのGitをインストール
$ wget https://github.com/git/git/archive/v2.13.0.tar.gz
$ tar zxvf v2.13.0.tar.gz
$ cd git-2.13.0/
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

# シェルの再起動
$ exec $SHELL -l

# Gitの確認
$ git --version

# 不要なファイルの削除
$ rm -rf v2.13.0.tar.gz
$ rm -rf git-2.13.0/
```

# rubyのインストール

rubyに関しては、rbenvで管理していきます。
なので、rbenvのインストールから

```bash
# rbenvのインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# ruby-buildのインストール（rbenv installに必要なため）
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# rbenvの設定を~/.bash_profileに記載
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ~/.bash_profileの再読み込み
$ source ~/.bash_profile

$ rbenv --version
rbenv 1.1.0-2-g4f8925a
```

rubyのインストール

```bash
# インストールできるrubyのversionのリストの表示
$ rbenv install -l

# version 2.4.1 をインストール（かなり時間がかかるので注意）
$ rbenv install 2.4.1
$ rbenv global 2.4.1
$ rbenv rehash

# rbenvの確認
$ rbenv versions
* 2.4.1 (set by /home/vagrant/.rbenv/version)
```

railsのインストール

```bash
$ gem update --system
$ gem install bundler --no-ri --no-rdoc
$ gem install rails --no-ri --no-rdoc

# railsの確認
$ rails -v
Rails 5.1.1

# railsプロジェクトの作成
$ cd ~/rails_app
$ rails new . -d mysql
$ sudo yum install -y mysql-devel

# Gemfileの編集
$ vi Gemfile

# 20行目のコメントアウトを外す
gem 'therubyracer', platforms: :ruby

$ bundle install
```

# MySQLのインストール

mariaDBと競合するため、mariaDBを削除

```bash
# mariaDBの確認
$ rpm -qa | grep -i mariadb
mariadb-libs-5.5.44-2.el7.centos.x86_64

# mariaDBの削除
$ sudo yum -y remove mariadb-libs
$ rm -rf /var/lib/mysql/
```

MySQLのインストール



```bash
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

# mysql5.7以外をインストールしたい場合、この時点で
# /etc/yum.repos.d/mysql-community.repoのenabledを変更（使用したいバージョンの[enabled]を1に）

$ sudo yum -y install mysql-community-server

# MySQLの確認
$ mysqld --version
mysqld  Ver 5.7.18 for Linux on x86_64 (MySQL Community Server (GPL))
```

MySQLの設定

パスワードは「８文字以上、大文字の英字、小文字の英字、数字、記号」を全て入れないとダメなので注意!!!

```bash
# MySQLの起動
$ sudo systemctl start mysqld.service

# MySQLのrootのパスワードの確認
$ cat /var/log/mysqld.log | grep password
2017-05-13T07:37:14.286725Z 1 [Note] A temporary password is generated for root@localhost: ************

# MySQLの設定
$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: ************

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: ********

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

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.

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.


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ユーザーのパスワード変更
- 匿名（anonymous)ユーザーの削除
- リモートホストからrootログイン禁止
- テスト用データベース削除
- ユーザー権限が保存されているテーブルをリロード


```bash
# 下記の設定を記載
$ sudo vi /etc/my.cnf

character-set-server = utf8
default_password_lifetime = 0

# MySQLの再起動
$ sudo systemctl restart mysqld.service
```

MySQL 5.7.11以降であれば default_password_lifetime は default で 0 らしいので必要ないかもしれません。

# Apacheのインストール

今回のBoxには初めからインストールされてました。

```bash
# 一応インストールコマンドはこちら
$ sudo yum -y install httpd

# Apacheの確認
$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 12 2017 21:03:28
```

Passengerのインストール

```bash
$ gem install passenger --no-ri --no-rdoc
$ rbenv rehash
$ passenger-install-apache2-module
```

```shell-session:実行結果の一部
--------------------------------------------
Almost there!

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.4/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.4
     PassengerDefaultRuby /home/vagrant/.rbenv/versions/2.4.1/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!

Press ENTER when you are done editing.


--------------------------------------------
```

上記の文章を/etc/httpd/conf.d/passenger.confに設定
注：環境によって異なりますので各自出てきた文章をコピペしてください。

```apache:/etc/httpd/conf.d/passenger.conf
   LoadModule passenger_module /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.4/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.4
     PassengerDefaultRuby /home/vagrant/.rbenv/versions/2.4.1/bin/ruby
   </IfModule>
```

apacheの設定

```apache:/etc/httpd/conf.d/rails.conf
<VirtualHost *:80>

  ServerName localhost:80
  DocumentRoot /home/vagrant/rails_app/public
  RailsEnv development
  PassengerEnabled on
  ErrorLog /var/log/httpd/error_log
  CustomLog /var/log/httpd/access_log combined
  AddDefaultCharset UTF-8

  <Directory /home/vagrant/rails_app/public>
     AllowOverride all
     Require all granted
     Options -MultiViews
  </Directory>

</VirtualHost>
```

```text:/etc/httpd/conf/httpd.conf
ServerName localhost:80
```

```bash
# httpd.confの文法チェック
$ apachectl configtest
Syntax OK

# Apacheの起動
$ sudo systemctl start httpd.service
```

このままだとPermission deniedのエラーが出るため

```bash
$ sudo chmod 755 /home/vagrant
```

一応これでHOST側からlocalhost:3000で接続すればrailsアプリケーションを見ることが可能です。

# SSLの設定

```bash
$ sudo yum -y install mod_ssl openssl
$ cd /etc/pki/tls/certs

# 秘密鍵の作成
$ sudo make server.key

# 秘密鍵からパスフレーズを削除
$ sudo openssl rsa -in server.key -out server.key

# 証明書の作成
$ sudo make server.csr
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Sample

Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:127.0.0.1

Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# 有効期限が10年の自己署名証明書を作成
$ sudo openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
```
apacheの設定

```bash
$ sudo vi /etc/httpd/conf.d/rails.conf

#下記を追記

<VirtualHost *:443>
  ServerName localhost:443
  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/server.crt
  SSLCertificateKeyFile /etc/pki/tls/certs/server.key
  DocumentRoot /home/vagrant/rails_app/public
  RailsEnv development
  PassengerEnabled on
  ErrorLog /var/log/httpd/ssl_error_log
  CustomLog /var/log/httpd/ssl_access_log combined
  AddDefaultCharset UTF-8

  <Directory /home/vagrant/rails_app/public>
  AllowOverride all
  Require all granted
  Options -MultiViews
  </Directory>
</VirtualHost>

# apacheの再起動
$ sudo service httpd restart
```

あとはHOST側から[https://192.168.33.10](https://192.168.33.10)でいけるはず。

# 最後に

ufwを用いてファイアーウォールの管理もしたいのですが、開発環境には必要ないのかも。
ufwに関しては今後勉強します。

あと、apache関連については知識不足ですので、よく理解しておりません。
勉強しておきます。

誰かのために役立てていただければ幸いです。

# 追記

## 2018/04/25
`curl-devel`のインストールが必要になっていたため、追記しました。