2020年版 GoogleCloudにWordpressをインストールする手順

# 1.概要
GoogleCloudのCentOS 8にWordpressをインストールし、インターネットに公開するための手順。

## 作業日時
-2020年2月18日 

## 環境
| ソフトウェア       |      バージョン | 
|:-----------------|------------------:|
| Cent OS          |                 8 |
| Wordpress        |               5.3 | 
|  nginx           | 1.16.1            |
| PHP              |              7.4 |
| MySQL            |              Ver 8.0.17 |


# 2.ドメインの取得・設定
## 流れ
1. お名前ドットコムなどでドメインを取得する。
2. Google CloudのDNSを設定する。
3. お名前ドットコムドメインにCloud DNSのDNSを設定する。 

## Google CloudのDNS設定
### 1.外部IPアドレスを設定

外部IPアドレスを静的で取得する。

### 2.Cloud DNSで設定する。

Cloud DNSに設定を行う。
お名前.com など、ドメインサービス側の各設定画面で発行したNS レコードの情報を設定する。
ついでに、Search Consoleの設定も合わせて行う。
＊Search Consoleのアカウントは事前に作成しておく。

-ゾーン名:yoursite
-DNS:yoursite.com.


| DNS 名 | タイプ | TTL（秒） | データ | 
|:--|:--|--:|--:|:--|
| yoursite.com. | NS | 21600 |ns-cloud-e1.googledomains.com.    ns-cloud-e2.googledomains.com.  ns-cloud-e3.googledomains.com. ns-cloud-e4.googledomains.com. |
|yoursite.com. | SOA | 21600 |ns-cloud-e1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300 |
| yoursite.com. | TXT | 300 |  google-site-verification=hogehoge |
| www.yoursite.com. | A | 300 |  104.xxx.xxx.xxx |

# 3.OS設定

CentOSで標準に備わっているSELinux と iptables(firewall) を無効化する。

```shell-session
$ sudo systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
```

selinuxの設定ファイルも編集する。

```shell-session:/etc/selinux/config 
$ sudo vim /etc/selinux/config 
$ sudo setenforce 0
```

ファイアウォールの停止と、タイムゾーン・ロケールの修正を行う。

```shell-session
$ sudo systemctl is-enabled firewalld
$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo localectl set-locale LANG=ja_JP.UTF-8
```

# 4.Gitのインストール

以降のソフトウェアインストールで必要なため、gitをインストールする。

```shell-session
$ sudo dnf -y install git
$ git --version
git version 2.18.1
```

# 5.Webサーバのインストール
## nginxインストール

nginxは最初からインストールされている。

```shell
$ sudo rpm -ivh http://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.16.1-1.el8.ngx.x
86_64.rpm
$ sudo dnf -y install nginx
$ nginx -V
nginx version: nginx/1.16.1
built by gcc 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC) 
built with OpenSSL 1.1.1 FIPS  11 Sep 2018
```

/var/www/html/以下のディレクトリやファイルを、Nginxを起動するユーザーの所有にしておく必要がある。

```shell-session
$ sudo mkdir  /var/www
$ sudo chown -R nginx:nginx /var/www
$ sudo mkdir  /var/cache/nginx
$ sudo chown nginx:nginx /var/cache/nginx
```

## Nginxの設定
以下の設定ファイルを修正する。

```shell
$ sudo vim /etc/nginx/nginx.conf
$ sudo vim /etc/nginx/conf.d/default.conf
```

以下は設定ファイルの内容。

```/etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # Cache
    # キャッシング時のキーの設定
    fastcgi_cache_key "$scheme://$host$request_uri";

    # /var/cache/nginx キャッシュを保存するパス
    # keys_zone=ゾーン名とゾーンサイズ
    # levels=キャッシュディレクトリ配下の文字数(1階層目は1文字、2階層目は2文字という意味)
    # inactive=1日後にキャッシュが破棄される
    # max_size=キャッシュの最大サイズを設定。これを超えると使用頻度が低いデータから削除される
    fastcgi_cache_path /var/cache/nginx keys_zone=czone:10m levels=1:2 inactive=1d max_size=1000m;

    include /etc/nginx/conf.d/*.conf;

}
```

もう一つの設定ファイルも修正する。

```/etc/nginx/conf.d/default.conf

charset UTF-8;

server {
    listen 80;
    server_name www.yoursite.com;
    if ($http_x_forwarded_proto != https) {
      return 301 https://$host$request_uri;
    }
}

server {
    listen       443 ssl http2;
    ssl_certificate       /etc/httpd/ssl/www.yoursite.com/fullchain.pem;
    ssl_certificate_key  /etc/httpd/ssl/www.yoursite.com/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
 
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    root   /var/www/html;

    location / {
        root   /var/www/html;
        index  index.html index.htm index.php;
        try_files $uri $uri/ /wp/$uri?$args /wp/index.php?q=$uri&$args;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # */wp-admin へのリクエスト末尾にスラッシュを追加します。
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    location ~* ^.+.(svg|jpg|jpeg|gif|css|png|js|ico|gz|otf|ttf|eot|woff)$ {
      root   /var/www/html;
      access_log        off;
      expires           30d; # cache
    }


    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

#    try_files $uri $uri/ /wp/index.php?q=$uri&$args;
    location /wp {
       root /var/www/html/wp;
       
       # パーマリンク設定
       try_files $uri $uri/ /wp/index.php?q=$uri&$args;

       index index.php;
   
     }

    set $do_not_cache 0;
    if ($request_method !~ ^(GET)$) {
        set $do_not_cache 1;
    }
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
        set $do_not_cache 1;
    }
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $do_not_cache 1;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root   /var/www/html;
        try_files $uri = 404;
 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        include fastcgi_params;
        fastcgi_read_timeout 180;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;

        # cgi chache
        fastcgi_cache_bypass $do_not_cache;
        fastcgi_no_cache $do_not_cache;
        fastcgi_cache czone;
        fastcgi_cache_valid 200 302 7d;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}

    gzip on;
    gzip_http_version 1.0;
    gzip_disable "msie6";
    gzip_proxied any;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/font-woff application/font-tff  application/vnd.ms-fontobject application/x-font-ttf font/opentype image/gif  image/png image/jpeg image/svg+xml image/x-icon application/octet-stream;

}

```

nginxを起動し、自動起動も設定する。

```shell_session
$ sudo systemctl start nginx 
$ sudo systemctl enable nginx
```

# 6.Let's Encriptの設定

https通信ができるようにするためLet's Encriptを設定する。

```shell-session
$ curl https://dl.eff.org/certbot-auto > certbot-auto 
$ sudo mv  certbot-auto /usr/local/bin/certbot-auto
$ sudo chown root /usr/local/bin/certbot-auto
$ sudo chmod 0755 /usr/local/bin/certbot-auto

$ certbot-auto certonly --webroot -w /var/www/html/ -d www.yoursite.com  --email yourmail@gmail.com
```

定期的にSSL証明書のリニューアルをする設定をする。

```shell
# sudo certbot renew
```

# 7.DBの設定

今回はWebサーバと同じインスタンスにDBをインストールします。
CentOS 8 に MySQL 公式の yum リポジトリを追加します。

```shell_session
$ sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el8-1.n
oarch.rpm
$ sudo dnf install mysql-server
$ mysqld --version
/usr/libexec/mysqld  Ver 8.0.17 for Linux on x86_64 (Source distribution)
```

MySQL起動して、自動起動も設定しておく

```shell_session
$ sudo systemctl start mysqld.service
$ sudo systemctl enable mysqld.service
```

初回起動時のパスワードを確認する。

```shell_session
$ sudo cat /var/log/mysql/mysqld.log | grep 'password'
2019-11-14T09:51:24.149199Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching of
f the --initialize-insecure option.
```

MySQL のセキュリティ設定を行う。

```shell_session
$ mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT 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 component?
Press y|Y for Yes, any other key for No: y

```

この時点で、データベースは以下の通り。

```shell_session
$  mysql -u root -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.03 sec)
```

default_password_lifetime の値を 0 に変更して、この有効期限の設定を無効にする。
また、デフォルトの文字コードも UTF-8 に変更します。
mysql8から認証方式が変更となったが、wordpressは対応していないため、mysql_native_passwordを指定する。

```shell_session
$ sudo vim /etc/my.cnf.d/mysql-server.cnf 
[mysqld]
.
.
.
default-authentication-plugin=mysql_native_password

character-set-server = utf8
default_password_lifetime = 0

$ sudo systemctl restart mysqld.service
```

# 8.phpのインストール
## PHPおよび関連ソフトをインストールします

remi リポジトリを CentOS 8 にインストールします。

```shell-session
$ sudo dnf install http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
```

必要なPHPをインストールする。

```shell-session
$ sudo dnf -y install --enablerepo=remi php74 php74-php php74-php-mbstring php74-php-gd php74-php-mysql
$ sudo dnf -y install --enablerepo=remi php74-php-intl
$ sudo dnf -y install --enablerepo=remi php74-php-mysqlnd
$ sudo dnf -y install --enablerepo=remi php74-php-xml
$ sudo dnf install php74-php-fpm
$ php74 -v
HP 7.4.1 (cli) (built: Dec 17 2019 16:35:58) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.1, Copyright (c), by Zend Technologies
```

php-fpmの設定を行う。

```shell-session
$ sudo vim /etc/opt/remi/php74/php-fpm.d/www.conf
```

設定ファイルの内容は以下の通り。

```/etc/opt/remi/php74/php-fpm.d/www.conf
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0666

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock
```

ディレクトリを作成し、nginxの権限を付与する。

```
$ sudo mkdir -p /var/run/php-fpm/
$ sudo chown -R nginx:nginx php-fpm
```

## 起動

自動起動有効化設定も同時に行う。

```shell-session
$ sudo systemctl start php74-php-fpm
$ sudo systemctl enable  php74-php-fpm
```

nginxを再起動する。

```shell-session
$ sudo systemctl restart nginx
```

## OS再起動時に/var/run/php-fpm を作成
- `/etc/tmpfiles.d/php-fpm.conf` を作成

```
d /var/run/php-fpm 0755 nginx nginx
```

# 9.Wordpressのインストール
## DBのセットアップ

データベースを準備します

```shell
$ mysql -u root -p
mysql> create database wpdb;
mysql> create user 'wordpress'@'localhost' identified by 'hogehoge';
mysql> grant all on wpdb.* to 'wordpress'@'localhost';
mysql> alter user 'wordpress'@'localhost' identified with mysql_native_password by 'hogehoge';
mysql> flush privileges;
mysql> exit
```

## Wordpressのインストール

wordpress最新日本語版をダウンロード。ファイルを展開する。

```shell
$ curl -LO http://ja.wordpress.org/latest-ja.tar.gz
$ tar zxf latest-ja.tar.gz
$ sudo rm latest-ja.tar.gz 
```

htmlフォルダに移して、nginxの権限を付与する。

```shell
$ sudo mv wordpress /var/www/html/wp
$ sudo chown -R nginx:nginx /var/www/
$ sudo chown -R nginx:nginx /var/www/html/wp
```

config.phpをサンプルから本番に変更する。

```shell
$ sudo mv /var/www/html/wp/wp-config-sample.php /var/www/html/wp/wp-config.php
```

wpの中にあるindex.phpをルート/var/www/html/にコピーする。
ルートディレクトリの index.php ファイルを編集する。

```shell-session
$ sudo cp wp/index.php ./
$ sudo vi index.php
$ sudo chown -R nginx:nginx index.php 
```

以下が修正内容。

```php:修正前
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
```


```php:修正後
require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
```

設定ファイルを修正する。

```console
# cd /var/www/html/wp/
# sudo vim wp-config.php
```

以下が修正内容。

```wp-config.php
/** WordPress のためのデータベース名 */
define('DB_NAME', 'wpdb');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'wordpress');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'hogehoge');

/** MySQL のホスト名 */
define( 'DB_HOST', 'localhost' );
/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8' );
/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );

/* htts接続が可能となってから設定する */
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
  && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
  $_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
```

設定終了したら、編集不可に設定

```console
$ sudo chmod 400 wp-config.php
```

# 10.動作確認

サイトにアクセスして、Wordpressの管理画面が表示されることを確認する。

```console
http://xxx.xxx.xxx.xxx/wp/wp-admin/install.php
```

# 11. 最後

以上で終わりです。
お疲れさまでした。