WordPress + Nginx
ネタがないので、NginxでWordPressを動作させる時の雛形を用意してみる。
/etc/nginx/conf.d/sitename.conf
server {
# サーバがHTTPSでリッスンし、HTTP/2プロトコルを有効化
# http2 を listenに書くのは Nginx 1.9.5 以前の書き方です。
# listen 443 ssl http2 default_server;
listen 443 ssl default_server;
# http2 on ディレクティブは Nginx 1.9.5 以降で利用可能です。HTTP/2を有効化するために使用されます。
http2 on;
server_name www.foofoomywebsite.jp;
# クライアントから送信可能なリクエストサイズを設定
client_max_body_size 10m;
# ファイルのETagを無効化し、ディレクトリリスト表示を無効化
etag off;
autoindex off;
# ドキュメントルートおよびインデックスファイルの設定
root /var/www/www.foofoomywebsite.jp/document_root;
index index.php index.html index.htm;
# アクセスログとエラーログの設定
# アクセスログを詳細に記録する combined
access_log /var/log/nginx/www.foofoomywebsite.jp_access.log combined;
# エラーログを警告以上のレベルで記録する
error_log /var/log/nginx/www.foofoomywebsite.jp_error.log warn;
# SSL設定
# サーバ証明書ファイルの指定(Let's Encrypt で取得した証明書)
ssl_certificate "/etc/letsencrypt/live/www.foofoomywebsite.jp/fullchain.pem";
# サーバ証明書キーの指定
ssl_certificate_key "/etc/letsencrypt/live/www.foofoomywebsite.jp/privkey.pem";
# SSLセッションのタイムアウトを1日間に設定
ssl_session_timeout 1d;
# SSLセッションキャッシュの設定(10MBを共有キャッシュとして使用)
ssl_session_cache shared:MozSSL:10m;
# セッションチケットを無効化(セキュリティ向上のため)
ssl_session_tickets off;
# Diffie-Hellmanパラメータファイルの指定(強力な鍵交換を提供)
ssl_dhparam /etc/nginx/dhparam;
# SSLプロトコルと暗号化方式の設定
# - TLSv1.2とTLSv1.3のみに対応させ、古いプロトコルを無効化
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;
# SSLステープリングを有効化(パフォーマンス向上とセキュリティ強化)
ssl_stapling on;
# SSLステープリングの応答を検証する設定
ssl_stapling_verify on;
# 信頼された証明書チェーンファイルの指定(OCSPレスポンダー用)
ssl_trusted_certificate /etc/letsencrypt/live/www.foofoomywebsite.jp/fullchain.pem;
# セキュリティ関連ヘッダーの追加
add_header Strict-Transport-Security 'max-age=31536000;' always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
# xmlrpc.phpへのアクセスを拒否
location /xmlrpc.php {
deny all;
}
# 隠しファイルやGit関連ファイルへのアクセスを拒否
location ~* ^/\.(ht|git) {
deny all;
}
# 特定のファイルタイプ(設定ファイルやバックアップファイル)へのアクセスを拒否
location ~* ^/(wp-config\.php|.*\.(sql|bak|orig|dist)) {
deny all;
}
# メインのWordPress設定
location / {
# 不必要なクエリ文字列「author=」を検出しリダイレクト
if ($query_string ~* "author=") {
return 301 /;
}
# リクエストされたファイルが存在しない場合、index.phpにフォールバック
try_files $uri $uri/ /index.php?$args;
}
# PHPファイルの処理設定
location ~ \.php$ {
try_files $uri /index.php?$args;
include /etc/nginx/conf.d/php-fpm.conf;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
}
# wp-login.phpやwp-adminへのアクセス制限
location ~* /wp-login\.php|/wp-admin/((?!(admin-ajax\.php|css/|js/)).)*$ {
# 特定のIPアドレスにアクセスを許可
allow 192.168.10.1;
allow 127.0.0.1;
# 上記以外のアクセスにはBASIC認証を適用
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# 管理画面へのアップロードサイズを設定
client_max_body_size 1g;
include /etc/nginx/conf.d/php-fpm.conf;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
}
}
/etc/nginx/conf.d/php-fpm.con
fastcgi_index index.php;
fastcgi_read_timeout 300;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass は Unix socketを利用