Google Cloud Platform で CentOS7のインスタンスを立ち上げた際にやったこと

# tyamahori.com という個人のブログサイトを作りました
[tyamahori.com](https://tyamahori.com) では Google Cloud Platform を利用しています。理由はAWSが全盛の世の中にて、逆張り戦略をしたかったからです。ただ結局は世の中の波には逆らえず、AWSもどこかで勉強していくかなと思います。

Google Compute Enginge(AWSでいう EC2)にてCentOS7系を使用してインスタンスを立ち上げました。セキュリティの最低限の設定はGCE側でよしなに設定してくれます。今回はCentOS7を使用してインスタンスを立ち上げたあとに導入したモノを紹介します。

# CentOS7 に導入したもの
tyamahori.comでは以下のモノをコマンドラインにて導入しました。

リストはこちら

- Git
- Docker
- Nginx
- PHP7
- Composer
- MySQL
- Node

## SElinuxの無効化
これがONだと予期しない挙動になるみたいなので無効化します。

```
# SElinux
$ sudo vim /etc/selinux/config

# 以下のように変更する
---
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
---

# SElinuxの設定変更後は再起動する
$ sudo reboot
```

## Git
今どきこれを導入しない・使わないのはいろいろとあれなので、まずは導入します。yum で導入したいとは思いますが、それですとバージョンが低いためいろいろと問題があります。ですので、ソースコードからインストールします。

```
# まずは既存のgitをいったん削除します。
$ sudo yum -y remove git

# 関連するパッケージをインストールします。
$ sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker autoconf wget make

# ソースをダウンロードします 2018/12/24時点では 2.19.2が最新だと思います
$ cd /usr/local/src/
$ sudo wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz

# 解凍・インストールします
$ sudo tar vfx git-2.19.2.tar.gz
$ cd git-2.19.2
$ sudo yum -y install gcc
$ sudo make configure
$ sudo ./configure --prefix=/usr/local 
$ sudo make install
 
$ git --version
git version 2.19.2

# 以下は必要な無いが、もし必要ならば叩いてください。
$ ln -s /usr/local/bin/git /bin/git
```
というわけで、これをシェルスクリプトにまとめれば楽ができるかと思います。どこかでシェルスクリプトにまとめてGitHubにあげよう。。

## Docker/Docker Compose
実はSSL対応にあたってライブラリを利用しているのですが、こちらをDockerで利用しているため、導入します。

```
# 古いものを削除
$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

# 必要なpackageをインストール
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# stable リポジトリをインストール
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# dockerインストール
$ sudo yum -y install docker-ce

# docker起動
$ sudo systemctl enable docker
$ sudo systemctl start docker

# docker-compose インストール versionは確認してください
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose

# dockerグループがなければ作る
$ sudo groupadd docker

# sudoなしでもdockerを動かせるようにする
# 現行ユーザをdockerグループに所属させる
$ sudo gpasswd -a $USER docker

# dockerデーモンを再起動する (CentOS7の場合)
$ sudo systemctl restart docker

# exitして再ログインすると反映される。
exit

# versionを確認する
docker -v
docker-compose --version
```

## Nginx
```
# リポジトリ設定を行う
$ sudo vim /etc/yum.repos.d/nginx.repo

# 以下を記述する
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

# インストールする
$ sudo yum -y install nginx

# nginx のパッケージ確認(お好みで)
$ rpm -qi nginx

# nginx ファイル確認(お好みで)
$ rpm -ql nginx

# 起動関連コマンド
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
```

## PHP
```
# リポジトリインストール
$ sudo yum -y install epel-release
$ sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# PHP7.2系インストール
$ sudo yum --enablerepo=remi-php72,epel install -y php-fpm php-exif php-gd php-gmp php-mbstring php-pecl-mcrypt php-opcache php-pdo php-pear-MDB2-Driver-mysqli php-pecl-memcached php-pecl-msgpack php-xml zip unzip

# Timezone設定
$ sudo vim /etc/php.ini
date.timezone = "Asia/Tokyo"

# PHP-FPMの設定
# user/groupは必要に応じて設定してください。ここでは適当にしています
$ sudo vim /etc/php-fpm.d/www.conf
user = hogename
group = hogegroup

# セッション関連のディレクトリの権限設定です。(ここはバッドノウハウ疑惑です)
$ sudo chmod 777 -R /var/lib/php

# PHP-FPMの起動コマンド
$ sudo systemctl start php-fpm
$ sudo systemctl enable php-fpm
```

## Composer
PHPをインストールしてからComposerをインストールします

```
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ sudo mv composer.phar /usr/local/bin/composer
```

## MySQL

```
# MariaDBの確認
$ rpm -qa | grep maria

# MariaDBを削除
$ sudo yum -y remove mariadb-libs

# MySQL5.7をインストール
$ sudo yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
$ sudo yum -y install mysql mysql-devel mysql-server mysql-utilities

# DBを初期化
$ sudo mysqld --user=mysql --initialize

# 自動起動設定
$ sudo systemctl enable mysqld.service
$ sudo systemctl start mysqld.service

# 初期パスワード確認
$ grep password /var/log/mysqld.log

root@localhost: 初期パスワード

# 以下のコマンドを叩いて設定を進める
$ 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: 新しいパスワードを再度入力する

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: yを押す

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2を押す

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) : nを押す

Remove anonymous users? (Press y|Y for Yes, any other key for No) : yをおす

Normally, root should only be allowed to connect from'localhost'. 
This ensures that someone cannot guess atthe root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : yを押す

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : yを押す

Reloading the privilege tables will ensure that all changesmade so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y を押す

$ mysql -u root -p新しいルートパスワード

# データベース作成
mysql > CREATE DATABASE 新しいデータベース;

# 新しくユーザーを作成する
mysql > CREATE USER '新しいユーザー'@'localhost' IDENTIFIED BY '新しいパスワード';

# 権限を付与する
mysql > GRANT ALL PRIVILEGES ON 新しいデータベース.* TO '新しいユーザー'@'localhost';

# 設定反映しmysqlから抜ける
mysql > FLUSH PRIVILEGES;

# 文字コードの設定
$ sudo vim /etc/my.cnf
character_set_server=utf8
skip-character-set-client-handshake

# 再起動
$ sudo systemctl restart mysqld.service


```

## Node.js
npmとか使うために入れます。

```
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
$ source ~/.nvm/nvm.sh
$ nvm install node

$ vi ~/.bash_profile
# 末尾に以下を追加
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi

$ source ~/.bash_profile

$ npm update -g npm
```

# 終わりに
サーバー構築時にメモに残しておいた内容が役に立ちました。本当はここから細かな設定などを行う必要がありますが、それはまた別の機会にできればと思います。この記事は個人ブログからの転載です。 

[https://tyamahori.com/4](https://tyamahori.com/4)