CentOS
Apache
PHP7
letsencrypt

CentOS7 複数ドメイン(バーチャルホスト)でSSL

かなり前に書いた
https://qiita.com/salt_field/items/95c77eb6e7abad135930
の手順をまとめ直したものです。

wordpress導入後、プラグインなどのアップデートにFTPサーバーが必要になる。
構築手順はこちら
https://qiita.com/salt_field/items/66e4e37e85d33402df71

CentOS7にLAMP環境を構築して、1つのサーバーで複数ドメインのWEBサイトを構築することがあったのでその手順の備忘録
まずは環境の構築

前提

今回は1つのサーバーに複数ドメインのWEBサイトを構築し、それぞれでwordpressを稼働させます。
またすべてのドメインでSSL(https)を強制します。
SSL証明書はLet's Encryptを使用します。

ドメインとかユーザーの情報

項目 メインドメイン バーチャルホスト
ドメイン main.test.com sub.test.com
ユーザー User1 User2
パスワード User1Pass User2Pass
DB Main Sub

DNS設定はされているものとし、ドメインでサーバーへアクセスができること。
ドメインはお名前.comなどで取得してもいいし、DDNSでも問題ありません。

共通
rootのパスワード「rootpass」

※この手順でサーバーを構築し問題が発生しても責任は負いません。
※実際に構築する際はユーザー名・パスワードなど適切に変更してください。

環境

conohaのVPS(512MBプラン)

お申込みはこちらから
サーバー運用の支援をお願い致します。
https://www.conoha.jp/referral/?token=EHzpH4qBxC2nEldYUngHXpxv9ja17c0iqAenX5M6pbFMNPgLFFc-B34

CentOS7(7.4.1708)
Apache(2.4.6)
MariaDB(10.2.13)
PHP(7.0.28)

コントロールパネルからインストールが完了した状態からはじめます。

まずはアップデート

#yum -y update

ユーザー追加時に「public_html」が作成されるようにする

#mkdir /etc/skel/public_html
#chmod 701 /etc/skel/public_html

ユーザーの作成とパスワード設定、アクセス権限設定

#useradd User1
#useradd User2

#passwd User1
Changing password for user shiono.
New password: User1Pass(入力値は表示されません。)
Retype new password: User1Pass(入力値は表示されません。)
passwd: all authentication tokens updated successfully.

#passwd User2
Changing password for user shiono.
New password: User2Pass(入力値は表示されません。)
Retype new password: User2Pass(入力値は表示されません。)
passwd: all authentication tokens updated successfully.

#chmod 701 /home/User1
#chmod 701 /home/User2

Apacheのインストール

#yum -y install httpd

次の内容に設定変更

#vi /etc/httpd/conf/httpd.conf

<Directory "/var/www/html">
    Options Includes ExecCGI FollowSymLinks
    AllowOverride All
</Directory>

TraceEnable off ←最終行に追加

autoindex設定ファイルを修正

#vi /etc/httpd/conf.d/autoindex.html

<Directory "/usr/share/httpd/icons">
    Options MultiViews ←iconsディレクトリのファイル一覧を表示しないようにする
    AllowOverride None
    Require all granted
</Directory>

テストページの削除

#rm -f /etc/httpd/conf.d/welcome.conf

SSLデフォルト設定ファイルを編集

#vi /etc/httpd/conf.d/ssl.conf

下記範囲をすべて削除
<VirtualHost *:443>
~
</VirtualHost>

SSL用の設定ファイルを作成

未設定のドメインでアクセスがあった場合にアクセスを拒否

#vi /etc/httpd/conf.d/virtualhost.conf

<VirtualHost _default_:80>
    ServerName any
    <Location />
        Require all denied
    </Location>
</VirtualHost>

main.test.com用のバーチャルドメイン設定ファイルを作成

#vi /etc/httpd/conf.d/main.test.com

<VirtualHost *:80>
    ServerName main.test.com(ドメイン名)
    DocumentRoot "/home/User1/public_html"
    ErrorLog logs/main.test.com-error_log
    CustomLog logs/main.test.com-access_log combined env=!no_log
</VirtualHost>

sub.test.com用のバーチャルドメイン設定ファイルを作成

#vi /etc/httpd/conf.d/main.test.com

<VirtualHost *:80>
    ServerName sub.test.com(ドメイン名)
    DocumentRoot "/home/User2/public_html"
    ErrorLog logs/sub.test.com-error_log
    CustomLog logs/sub.test.com-access_log combined env=!no_log
</VirtualHost>

firewallでポートを開放する

#firewall-cmd --add-service=http --zone=public --permanent
#firewall-cmd --add-service=https --zone=public --permanent
#firewall-cmd --reload

Apacheを起動

#systemctl start httpd
#systemctl enable httpd

Let's encryptで証明書を作成する

クライアントソフトウェアの「Certbot」を使用する。
ダウンロードとセットアップをする。

#yum -y install git
#cd /usr/local/
#git clone https://github.com/certbot/certbot
#cd
#/usr/local/certbot/certbot-auto -n

証明書取得

#/usr/local/certbot/certbot-auto certonly --webroot -w /home/User1/public_html -m XXXXXX@XXXXX.XXXXX -d main.test.com --agree-tos

#/usr/local/certbot/certbot-auto certonly --webroot -w /home/User2/public_html -m XXXXXX@XXXXX.XXXXX -d sub.test.com --agree-tos

正常に取得されていればドメインごとにディレクトリが生成されている。
#ls /etc/letsencrypt/live/
main.test.com
sub.test.com

取得すると下記内容のファイルがある。
各ファイルは実ファイルへのシンボリックリンクとなっている。
証明書を更新するとリンク先が切り替わるので管理が楽

項目 ファイル名
サーバー証明書(公開鍵) cert.pem
中間証明書 chain.pem
サーバー証明書と中間証明書が結合されたファイル fullchain.pem
秘密鍵 privkey.pem

証明書を取得後、Apacheに証明書を設定する

先ほど作成した設定ファイルにSSL設定を追記

main.test.com用のバーチャルドメイン設定

#vi /etc/httpd/conf.d/main.test.com

<VirtualHost *:80>
    ServerName main.test.com(ドメイン名)
    DocumentRoot "/home/User1/public_html"
    ErrorLog logs/main.test.com-error_log
    CustomLog logs/main.test.com-access_log combined env=!no_log
</VirtualHost>

<VirtualHost *:443>
        ServerName main.test.com:443
        DocumentRoot "/home/User1/public_html"
        ErrorLog logs/ssl-main.test.com-error_log
        CustomLog logs/ssl-main.test.com-access_log combined env=!no_log
        SSLCertificateFile /etc/letsencrypt/live/main.test.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/main.test.com/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/main.test.com/chain.pem

        SSLProtocol all -SSLv2 -SSLv3
        SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        SSLHonorCipherOrder on
        Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

sub.test.com用のバーチャルドメイン設定

#vi /etc/httpd/conf.d/sub.test.com

<VirtualHost *:80>
    ServerName sub.test.com(ドメイン名)
    DocumentRoot "/home/User2/public_html"
    ErrorLog logs/sub.test.com-error_log
    CustomLog logs/sub.test.com-access_log combined env=!no_log
</VirtualHost>

<VirtualHost *:443>
        ServerName sub.test.com:443
        DocumentRoot "/home/User2/public_html"
        ErrorLog logs/ssl-sub.test.com-error_log
        CustomLog logs/ssl-sub.test.com-access_log combined env=!no_log
        SSLCertificateFile /etc/letsencrypt/live/sub.test.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/sub.test.com/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/sub.test.com/chain.pem

        SSLProtocol all -SSLv2 -SSLv3
        SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        SSLHonorCipherOrder on
        Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

Apacheを再起動して設定を読み込む

#systemctl restart httpd

各ドキュメントルートに動作確認用のファイルを作る

User1でログインし、次の内容を実行

$echo user1 > /home/User1/public_html/index.html

User2でログインし、次の内容を実行

$echo user2 > /home/User2/public_html/index.html

それぞれのパターンでアクセスできることを確認する。
main.test.comへのアクセスの場合は「User1」
sub.test.comへのアクセスの場合は「User2」
が表示されればOK

http://main.test.com
https://main.test.com
http://sub.test.com
https://sub.test.com

テストファイルを削除

#rm -f /home/User1/public_html/*
#rm -f /home/User2/public_html/*

httpsを強制するやり方

<VirtualHost *:80>~</VirtualHost>の最終行に次の内容を書くとhttpでアクセスされたときにhttpsに強制リダイレクトする。

    RewriteEngine on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

全体を書くとこんな感じ

main.test.com

<VirtualHost *:80>
    ServerName main.test.com
    DocumentRoot "/home/User1/public_html"
    ErrorLog logs/main.test.com-error_log
    CustomLog logs/main.test.com-access_log combined env=!no_log

    RewriteEngine on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>

sub.test.com

<VirtualHost *:80>
    ServerName sub.test.com
    DocumentRoot "/home/User2/public_html"
    ErrorLog logs/sub.test.com-error_log
    CustomLog logs/sub.test.com-access_log combined env=!no_log

    RewriteEngine on
    RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>

MariaDBのセットアップ

次のサイトにアクセスしてMariaDBのリポジトリを取得する。
https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.2

# MariaDB 10.2 CentOS repository list - created 2018-03-28 14:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

リポジトリを登録

#vi /etc/yum.repos.d/MariaDB.repo

# MariaDB 10.2 CentOS repository list - created 2018-03-28 14:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

MariaDBをインストール

#yum -y install MariaDB-server MariaDB-client

DBの文字コードをUTF-8に変更

#vi /etc/my.cnf.d/server.cnf

[mysqld]
character-set-server=utf8

MariaDBを起動し、初期セットアップを行う。

#systemctl enable mariadb
#systemctl start mariadb
#mysql_secure_installation
Enter current password for root (enter for none):[enter]
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n][enter]
New password:[パスワード入力]
Re-enter new password:[パスワード入力]
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB 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? [Y/n][enter]
 ... 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? [Y/n][enter]
 ... Success!

By default, MariaDB 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? [Y/n][enter]
 - 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? [Y/n][enter]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

wordpress用のDBを作成

#mysql -u root -p

main.test.com用

CREATE DATABASE Main;
GRANT ALL PRIVILEGES ON Main.* to User1@localhost IDENTIFIED BY 'User1Pass';

sub.test.com用

CREATE DATABASE Sub;
GRANT ALL PRIVILEGES ON Sub.* to User2@localhost IDENTIFIED BY 'User2Pass';

PHP7.0のインストール

yumリポジトリの追加
EPELとRemiリポジトリの追加

#yum install epel-release
#rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

PHP7.0のインストール

yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-pear php-mcrypt php-mysql php-mysqlnd

PHPの設定変更

#vi /etc/php.ini

date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_charset = none

Apacheを再起動し、phpを読み込む

#systemctl restart httpd

Wordpressをセットアップ

wgetコマンドをインストール

#yum -y install wget

wordpressのページへアクセスし、最新版のダウンロードリンクを確認する。
2018/3/28現在は次のリンクが最新
https://ja.wordpress.org/wordpress-4.9.4-ja.tar.gz

まずはmain.test.comに構築
ここから先はUser1で作業をする。

wordpressをダウンロード

$cd ~
$wget https://ja.wordpress.org/wordpress-4.9.4-ja.tar.gz

ダウンロードファイルを解凍する

$tar -zxvf wordpress-4.9.4-ja.tar.gz

解凍したファイルをpublic_htmlに移動する。

$mv wordpress/* public_html/

wordpressの設定ファイルを修正

$cd public_html
$mv wp-config-sample.php wp-config.php
$vi wp-config.php

define('DB_NAME', 'Main');
define('DB_USER', 'User1');
define('DB_PASSWORD', 'User1Pass');

次の部分はWordpressのオンラインジェネレーターで生成して貼り付ける。
https://api.wordpress.org/secret-key/1.1/salt/

define('AUTH_KEY',         '...');
define('SECURE_AUTH_KEY',  '...');
define('LOGGED_IN_KEY',    '...');
define('NONCE_KEY',        '...');
define('AUTH_SALT',        '...');
define('SECURE_AUTH_SALT', '...');
define('LOGGED_IN_SALT',   '...');
define('NONCE_SALT',       '...');

Webブラウザからwordpressにアクセスしてインストールしたら完了。

sub.test.comは次のようにすればインストール完了。

作業はUser2で行う。

wordpressをダウンロード

$cd ~
$wget https://ja.wordpress.org/wordpress-4.9.4-ja.tar.gz

ダウンロードファイルを解凍する

$tar -zxvf wordpress-4.9.4-ja.tar.gz

解凍したファイルをpublic_htmlに移動する。

$mv wordpress/* public_html/

wordpressの設定ファイルを修正

$cd public_html
$mv wp-config-sample.php wp-config.php
$vi wp-config.php

define('DB_NAME', 'Sub');
define('DB_USER', 'User2');
define('DB_PASSWORD', 'User2Pass');

次の部分はWordpressのオンラインジェネレーターで生成して貼り付ける。
https://api.wordpress.org/secret-key/1.1/salt/

define('AUTH_KEY',         '...');
define('SECURE_AUTH_KEY',  '...');
define('LOGGED_IN_KEY',    '...');
define('NONCE_KEY',        '...');
define('AUTH_SALT',        '...');
define('SECURE_AUTH_SALT', '...');
define('LOGGED_IN_SALT',   '...');
define('NONCE_SALT',       '...');

Webブラウザからwordpressにアクセスしてインストールしたら完了。
違いはDB情報ぐらい

引用

次のページを参照して作業しました。
https://centossrv.com/
https://e-yota.com/webservice/centos7php7mysql5-6_wordpress_11/
https://letsencrypt.jp/usage/#SaveCertificate