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