2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WordPressAdvent Calendar 2017

Day 13

ConoHaへWordPressをOPCache&APCu&SSLで移行と新規セットアップ

Last updated at Posted at 2017-12-12

ゴール

  • Nginx + php + php-fpmの環境にする
  • phpは7.2を使用する
  • OpCacheとAPCuも有効化する。
  • Let's Encryptで常時SSL化
  • AWSからConoHaへ移行する
  • データベースサーバをMySQLからMariaDBへ移行
  • WebサーバをApacheからNginxへ変更

最初にすること

旧サーバのWordPressを最新版にアップデートしておくこと

作業

ConoHaコントロールパネル

サーバを1台用意します。稼働中のサーバでも問題ないと思いますが、今回は、1Gプランを契約しました。

SSHログイン

rootユーザーを無効化しサービスの設定を適用

/etc/ssh/sshd_config
PermitRootLogin no
systemctl reload sshd.service

ユーザー作成

useradd hogehoge
passwd hogehoge
usermod -aG wheel hogehoge
  • ユーザー作成後、別ターミナルで、rootログインができないことを確認
  • 作成したユーザーでログインしてsudosできることを確認 (システムパッケージのアップデートあたりを実行すると良いかも)
  • 以降は、一般ユーザーで作業を想定

システムパッケージのアップデート

sudo yum -y update

Firewallの設定

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

各種リポジトリの追加

sudo yum install epel-release
sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

リポジトリが初期のyumとかぶるのは避けたいので、enableを0に設定する。

/etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$b$
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$$
failovermethod=priority
enable=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

MariaDBのリポジトリを追加

/etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enable=0

パッケージインストール

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

httpdもインストールされますが今回は不使用です。

sudo yum install -y --enablerepo=epel,remi,remi-php72,mariadb nginx php-fpm mariadb mariadb-server mariadb-client php php-mbstring php-mysql php-gd php-opcache php-pecl-apcu

バージョンの確認

この項目はスキップしても問題ありません
2017/12/12現在

nginx -v

nginx version: nginx/1.12.2

rpm -qa | grep -i mariadb

MariaDB-compat-10.2.11-1.el7.centos.x86_64
MariaDB-common-10.2.11-1.el7.centos.x86_64
MariaDB-server-10.2.11-1.el7.centos.x86_64
MariaDB-client-10.2.11-1.el7.centos.x86_64

php -v

PHP 7.2.0 (cli) (built: Nov 28 2017 20:22:21) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.2.0, Copyright (c) 1999-2017, by Zend Technologies

ここでのポイントはwith Zend OPcache v7.1.12が入っていること

php-fpm -v

PHP 7.2.0 (fpm-fcgi) (built: Nov 28 2017 20:24:40)
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.2.0, Copyright (c) 1999-2017, by Zend Technologies

ここでのポイントはwith Zend OPcache v7.1.12が入っていること

OPCacheの設定

だいたい以下のようなら設定にしておきましょう
コメントは残したほうが無難(なぜか有効化されない場合がある?)

/etc/php.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

PHPの設定

独自テーマのインストールも考えて、php.iniのファイルアップロードサイズを変更しておきます。
Nginxは、このあと100MBで設定しますが、余裕を持って今回は、200MBで設定しておきます。

/etc/php.ini
upload_max_filesize = 200M

php-fpmの設定

初期状態では、実行ユーザーがapacheになるため、nginxに変更

/etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

WordPressの設置

今回は、/user/share/nginx/www.example.comに設置することを想定しています。
WordPressはこちらからダウンロードURLを取得してください。
2017/12/12現在は、4.9.1が最新版でした。
まずはSSL化の前にhttpで設定します

cd /usr/share/nginx/
sudo wget https://ja.wordpress.org/wordpress-4.9.1-ja.zip
sudo unzip wordpress-4.9.1-ja.zip
sudo mv wordpress www.example.com
sudo rm wordpress-4.9.1-ja.zip
/etc/nginx/conf.d/www.example.com.conf
server {
  listen 80;
  server_name www.example.com;

  root /usr/share/nginx/www.example.com;

  client_max_body_size 100m;

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

  location ~* /wp-config.php {
    deny all;
  }

  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    include fastcgi_params;
  }
}

NginxのConfigテスト

sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

wp-contentフォルダの移行

旧サーバからwp-contentフォルダをSFTPか何かで、新サーバへ移動させます。
wp-contentを上書き。

WordPressのオーナーとパーミッションの変更

自動更新できるようにパーミッションを設定します。

sudo chown -R nginx:nginx /usr/share/nginx/www.example.com/
sudo find /usr/share/nginx/www.example.com -type d -exec chmod 705 {} \;
sudo find /usr/share/nginx/www.example.com -type f -exec chmod 604 {} \;

FS_METHODを設定

WordPressの更新やプラグインのインストールをFTPやSFTP経由でなく直接更新できるようにします。
詳細は、WordPress FTPなしでプラグインダウンロードできる設定の記事を参考にしてください。
今回は、移行のため、前回の設定ファイルをそのまま流用するため、設定は省きます

wp-config.phpのパーミッションを変更しておきます。

sudo chmod 600 /usr/share/nginx/www.example.com/wp-config.php

各種デーモンの起動

sudo systemctl enable nginx.service
sudo systemctl enable php-fpm.service
sudo systemctl enable mariadb.service
sudo systemctl start nginx.service
sudo systemctl start php-fpm.service
sudo systemctl start mariadb.service

MariaDBの初期設定

ウィザードに従って入力していきます。

sudo mysql_secure_installation
表示 説明
Enter current password for root (enter for none): MariaDBの現在のrootユーザパスワード入力(初期設定時は何も設定されていない)
Set root password? [Y/n] rootユーザのパスワードを設定するかどうか
Remove anonymous users? [Y/n] 初期設定で作成されている「anonymous」ユーザを削除するか
Disallow root login remotely? [Y/n] MariaDBの「root」ユーザのリモートログインを禁止するか
Remove test database and access to it? [Y/n] 初期設定で作成されている「test」データベースを削除するか
Reload privilege tables now? [Y/n] 今設定したユーザ設定をすぐに反映させるか

WordPressで使用するユーザーの作成

mysql -u root -p
sql
create database データベース名 character set utf8;
create user 'ユーザー名'@'localhost' identified by 'パスワード';
grant all privileges on データベース名.* to 'ユーザー名'@'localhost';
exit;

移行の作業

旧MySQLからsqldump

データを取り出し、取り出したデータをSFTPか何かで、新サーバへ移動させます。

mysqldump -u root -p 移行前のデータベース名 > ダンプファイル名

新MariaDBへデータの復元

mysql -u ユーザ名 -p 移行先のデータベース名 < ダンプファイル名

SSL化

Certbotのインストール

sudo yum -y install --enablerepo=epel certbot

Diffie-Hellman パラメータを生成

sudo mkdir /etc/ssl/private/
sudo openssl dhparam -out /etc/ssl/private/dhparam.pem 2048

SSL証明書取得

sudo certbot certonly --webroot -w /usr/share/nginx/www.example.com -d www.example.com

SSL証明書の自動更新

sudo crontab -e
crontab
0 0 * * * /bin/certbot renew && /bin/systemctl reload nginx.service

NginxのSSL設定

/etc/nginx/conf.d/www.example.com.conf
server {
    listen 80;
    server_name www.example.com;
    return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  server_name www.example.com;

  root /usr/share/nginx/www.example.com;

  client_max_body_size 100m;

  ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;

  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets on;

  ssl_dhparam /etc/ssl/private/dhparam.pem;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK";
  ssl_prefer_server_ciphers on;

  add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';

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

  location ~* /wp-config.php {
    deny all;
  }

  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    include fastcgi_params;
  }
}

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?