WordPress は広く知られているコンテンツ管理システムであり、Docker はアプリケーションと依存パッケージを軽量でポータブルなコンテナにパッケージ化し、人気のある Linux マシンに展開できるため、両者の組み合わせにより、ウェブサイトの構築が簡単な数ステップの設定で可能になります。
インスタンスの購入(サーバー)#
Aliyun、Tencent Cloud、Huawei Cloud、Amazon Cloud、Google Cloud などでクラウドサーバーを購入できます。その中で、Google と Amazon は 1 年間の試用プランを提供しており、Aliyun、Tencent、Huawei の新規ユーザーやキャンパスユーザーには多くの割引がありますので、皆さんは自分に合ったプランを選んで購入できます。
Docker と Docker Compose のインストール#
ここでは、サーバーを購入する際に Docker を含むイメージを選択できます。もしない場合は、コンソールでオペレーティングシステムを変更(またはイメージを変更)して Docker を含むイメージに変更できます。それでもない場合は、以下の方法でインストールできます:
# Dockerのインストール
sudo curl -sSL https://get.daocloud.io/docker | sh
# Docker Composeのインストール
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
永続ディレクトリの作成#
Docker コンテナが破棄されると、コンテナ内のデータは失われるため、このような事態を避けるために、一般的にはボリュームをマウントする方法でこれらのデータを永続化します:
# インストールディレクトリに移動
cd ~
# マウントに必要なディレクトリを作成
## MySQL設定ディレクトリの作成
mkdir db
## MySQLデータディレクトリの作成
mkdir db_data
## WordPressファイルディレクトリの作成
mkdir wordpress_data
## Nginxファイルディレクトリの作成
mkdir nginx
# 必要な設定ファイルを作成
## MySQL設定ファイルの作成
cat > ./db/mysql.cnf << EOF
[mysqld]
explicit_defaults_for_timestamp=true
wait_timeout=86400
interactive_timeout=7200
EOF
## Nginx設定ファイルの作成
### まずNginxのイメージを起動
sudo docker run -it -d --name nginx nginx:latest
### コンテナ内の/etc/nginxディレクトリをローカルにコピー
sudo docker cp nginx:/etc/nginx ./nginx/conf
### コンテナ内の/usr/share/nginx/htmlディレクトリをローカルにコピー
sudo docker cp nginx:/usr/share/nginx/html ./nginx/html
### Nginxのログディレクトリを作成
mkdir ./nginx/log
### ファイルコピーが完了したらNginxイメージを削除
sudo docker stop nginx
sudo docker rm nginx
docker-compose.yml の設定#
vi docker-compose.yml
ファイル内容は以下の通りです
version: '3'
services:
nginx:
image: nginx:latest
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf:/etc/nginx:ro
- ./nginx/html:/usr/share/nginx/html:rw
- ./nginx/log:/var/log/nginx:rw
- ./nginx/ssl:/etc/ssl:ro
wpdatabase:
image: mysql:latest
volumes:
- ./db_data:/var/lib/mysql
- ./db/mysql.cnf:/etc/my.cnf
restart: always
environment:
MYSQL_ROOT_PASSWORD: root # データベース管理者パスワード、強力なパスワードに変更することを推奨
MYSQL_DATABASE: wordpress # WordPressデータベース
MYSQL_USER: wordpress # WordPressユーザー
MYSQL_PASSWORD: wordpress # WordPressユーザーのパスワード、強力なパスワードに変更することを推奨
wordpress:
depends_on:
- wpdatabase
image: wordpress:latest
volumes:
- ./wordpress_data:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: wpdatabase:3306
WORDPRESS_DB_USER: wordpress # 上記で設定したMySQLユーザー
WORDPRESS_DB_PASSWORD: wordpress # 上記で設定したMySQLユーザーのパスワード
コンテナの起動#
sudo docker-compose up -d
Nginx 設定ファイルの変更#
上記の設定を経て、sudo docker ps
を使用してコンテナが起動していることが確認できますが、Nginx はまだプロキシ設定が完了していないため、WordPress のページに直接アクセスすることはできません。設定ファイルを作成するだけで済みます:
# Nginx設定ファイルの作成
vi ./nginx/conf/conf.d/wordpress.conf
i
キーを押して編集モードに入り、以下の内容を変更して貼り付けます:
server {
listen 80;
server_name x.x.x.x; # ここをあなたのホストIPに変更
location / {
proxy_pass http://wordpress;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ホスト情報を転送
proxy_set_header Host $host;
}
}
:
を押した後にwq!
を入力してファイルを保存します。
Nginx コンテナを再起動してウェブサイトにアクセス#
sudo docker-compose restart nginx
この時、サーバーの IP アドレスに直接アクセスすることで WordPress にアクセスできます。エラーが発生した場合は、tail -f ./nginx/log/error.log
を使用してエラーログを確認できます。
高度な設定#
ウェブサイト構築のワンストップサービス#
上記の方法では、サーバー上に WordPress アプリケーションを簡単にデプロイすることができますが、他の人がパブリック IP を使用してあなたのページにアクセスすることはできますが、これは適切ではなく安全ではありません。完全なウェブサイト構築プロセスには、ドメイン登録、ウェブサイトの登録、公安の登録、DNS 解析、SSL 証明書の発行などが含まれます。これらのステップはすべてクラウドサービスプロバイダーからワンストップサービスとして取得できますが、ドメイン登録は有料で、他のプロセスには無料プランがあります。ウェブサイトの登録には約 20 日間の承認時間が必要です。
SSL 証明書の設定#
クラウドサービスプロバイダーから無料の SSL 証明書を取得した後、サーバーにアップロードし、.crt および.key ファイルを./nginx/conf ディレクトリにコピーし、Mozilla の pem ファイルを生成します:
# SSL証明書ファイルのコピー
cp /path/to/xxx.crt ./nginx/conf
cp /path/to/xxx.key ./nginx/conf
# Mozillaのpemファイルを生成
curl https://ssl-config.mozilla.org/ffdhe2048.txt > ./nginx/conf/dhparam.pem
マークされたコメントに従って./nginx/conf/conf.d/wordpress.conf ファイルを変更します:
# generated 2022-03-24, Mozilla Guideline v5.6, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.6
server {
listen 80;
listen [::]:80;
server_name _;
server_name yangziwen.cn www.yangziwen.cn; # ここを自分のドメインに変更
location / {
return 301 https://yangziwen.cn$request_uri; # ここを自分のドメインに変更
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yangziwen.cn www.yangziwen.cn; # ここを自分のドメインに変更
location / {
proxy_pass http://wordpress;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
ssl_certificate xxx.crt; # ここを自分のSSL証明書に変更
ssl_certificate_key xxx.key; # ここを自分のSSL証明書の秘密鍵に変更
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # 約40000セッション
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam dhparam.pem;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000秒)
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
# OCSPスタンピング
ssl_stapling on;
ssl_stapling_verify on;
# OCSP応答の信頼チェーンをルートCAおよび中間証明書を使用して検証
ssl_trusted_certificate xxx.crt; # ここを自分のSSL証明書に変更
# リゾルバのIPアドレスに置き換え
resolver 8.8.8.8;
location ~* /xmlrpc.php {
deny all;
}
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
if ($request_method !~ ^(GET|PUT|HEAD|POST|OPTIONS)$ ) {
return 444;
}
}
上記の設定テンプレートはhttps://ssl-config.mozilla.org/によって生成され、いくつかの簡単なセキュリティ強化が行われています。次に Nginx を再起動すれば、直接 HTTPS で自分のサイトにアクセスできるようになります。
sudo docker-compose restart nginx
この時、https://myssl.com/で自分のサイトの HTTPS 評価を行うことができ、上記の設定のスコアは A + です。もしそうでない場合は、以前のホームページで HTTP 経由で画像などのリソースを参照していた可能性があり、HTTPS で参照するように変更すれば解決できます。
Nginx のセキュリティ強化#
SSL 設定の中で、Nginx に対して一部の強化を行いましたが、さらにいくつかの設定が./nginx/conf/nginx.conf で必要です。ファイルを以下のように変更し、主に HTTP と IP アドレスの直接アクセスを禁止します。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Nginxのバージョン番号を隠し、安全性を高めます。
server_tokens off;
# PHPバージョンを隠す
fastcgi_hide_header X-Powered-By;
proxy_hide_header X-Powered-By;
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;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default;
server_name _;
return 444; # IP経由でのウェブサイトアクセスを防止
location ~* \.(rar|zip|gz|tar|tgz|tar.gz|7z|z|bz2|tar.bz2|sql|log|rar|ini|bak|conf|DS_Store|idea|swp|svn|entries|git|config)$ {
deny all;
}
autoindex off;
include vhost/*.conf;
}
}
Nginx を再起動します:
sudo docker-compose restart nginx
WordPress のセキュリティ強化#
サイトを構築した後は、すぐに Wordfence プラグインをインストールし、二要素認証(Two-Factor Authentication)を有効にすることを強くお勧めします。私はサイトを構築して登録を待っている間に、Wordfence プラグインを通じて多くの管理者アカウントへのログイン試行や敏感なインターフェースへのアクセスをブロックしました。
サーバーのセキュリティ強化#
一般的に、クラウドサーバーを購入すると、ベンダーから最も基本的なセキュリティスキャンが提供されます。新しいインスタンスは、スキャン結果に従って、いくつかの敏感なソフトウェア(例:OpenSSH)を最新バージョンに更新する必要があります。そうしないと、脆弱性が残る可能性があります。
SSH はサーバーにログインする最も一般的な方法であり、ハッカーが最も好む入口の一つです。新しいインスタンスを作成した後、以下の 2 つの設定をできるだけ早く行うべきです:
- 新しいキーを作成し、サーバーインスタンスとキーを関連付けます。具体的な方法はクラウドサービスプロバイダーの説明を参照してください。新しいキーを作成した後、インスタンスにログインする際にパスワードを入力する必要はなく、SSH クライアントに自分の秘密鍵を設定するだけでインスタンスに接続できます。唯一注意が必要なのは、秘密鍵の漏洩を避けることです。秘密鍵が漏洩または紛失した場合は、すぐにクラウドサービスのユーザー管理センターで元のキーを削除し、新しいキーを作成する必要があります。
- サーバーファイアウォールを変更します。クラウドサーバーの管理ページに入り、ファイアウォールを変更し、80、443、ICMP ポートのアクセスを保持するだけにします。22 ポートについては、面倒でなければ、SSH ログインが必要なソース IP アドレスのみを残すのが最善です。ただし、電信や移動のブロードバンドを使用しているユーザーの場合、IP は一定の時間が経過するか、ルーターを再起動すると変わります。この場合、SSH 接続ができないのは、IP アドレスの更新が原因である可能性が高いです。固定のネットワークセグメントにいるユーザーは、サブネットマスクを使用して IP 範囲を定義できます。つまり、IP の後ろにある / 24、/16、/8 などです。
SEO 設定#
自分の好きなウェブサイトを構築した後、同じ志を持つ仲間に早く見てもらいたいと思うのは当然です。この時、SEO(検索エンジン最適化)が大いに役立ちます。WordPress では、いくつかのプラグインを使用して簡単に SEO を設定できます。私は Yoast SEO というプラグインを使用しており、インストール後にプラグインの指示に従って簡単な設定を行うことができます。
サイトマップは SEO にとって非常に重要な部分です。Yoast のサイトマップは有料機能ですが、WP Sitemap Page プラグインをインストールすることで簡単なサイトマップを生成できます。ドメイン名/sitemap_index.xml
でアクセスできるのは、インデックスファイルであり、さまざまなタイプのインデックスが含まれています。各インデックスには対応する URL リンクがあり、これらのリンクは基本的に私たちのウェブサイトが外部に表示するすべての内容をカバーしています。これらの XML インデックスを百度、Google、Bing のウェブマスターツールに送信することで、検索エンジンが私たちのサイトを迅速にインデックスすることができます。以下はこれらのウェブマスターツールのアドレスです。
- Google:https://www.google.com/intl/zh-CN/webmasters/
- 百度:https://ziyuan.baidu.com/site/index
- Bing:https://www.bing.com/webmasters/about?setlang=zh-cn
設定方法も非常に簡単です。まずはサイトの関連付けを行います。さまざまな関連付け方法があり、説明に従って 1 つを選んで設定すれば大丈夫です。次に、各ウェブマスターツールにはサイトマップのアップロード機能があります。Google と Bing はメニューに表示され、百度は通常のインデックスにサイトマップのアップロードがあります。sitemap_index.xml 内のすべての XML リンクを提出するだけで済みます。
サイトマップを提出した後は、各検索エンジンがサイトマップ内の URL をクロールするのを待つだけです。ここで Google の速度を称賛せざるを得ません。提出の翌日には PC で自分のウェブサイトの内容を検索できるようになりましたが、百度は本当に少し焦らせます。
robots.txt はクローラーのプロトコルであり、検索エンジンのクローラーにどれをクロールできるか、どれをクロールできないかを伝えます。良好な robots.txt は、クローラーが表示したいページを迅速に見つけるのに役立ちます。WordPress にはデフォルトで robots.txt があり、wp-admin の簡単なブロック戦略が設定されています。私たちはその中にサイトマップのアドレスを追加し、クローラーがサイトマップをより早く見つけられるようにします。まず、./wordpress_data
に入り、robots.txt
ファイルを作成し、Sitemap: https://ドメイン名/サイトマップ名.xml
を追加します。次に、https://ドメイン名/robots.txt
にアクセスして有効にします。