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を利用

ななし: