PowerCMS Xを動作させるためのnginx設定例

公開
更新

先日開催された「PowerCMS X 製品発表会」に登壇した際に操作デモでご覧頂きましたサーバーでは「nginx + php-fpm」を利用しています。そこでPowerCMS Xをnginx + php-fpm環境で動作させるための設定をご紹介します。設定の検討にあたり、書籍『nginx実践入門』を購入して検討を重ねました。

設定内容は以下の通りです。なお、PowerCMS Xのファイルは/appに設置、静的ファイルはサイトルートに出力するものとします。

  1. 次の場合は/[workspace_dir]/pt-view.phpでダイナミック生成を行う
    • Cookieにpt-live-previewを名前とする情報がある場合(ライブプレビューを行う場合等ですね)
    • HTTPリクエストメソッドがGET以外の場合
    • クエリストリングがある場合
  2. /app内に次のように閲覧させたくないファイルがある
    • db-config.php
    • config.json
    • log
  3. 上記に該当しない場合は次のように処理をする
    • 静的ファイルが存在する場合はnginxで配信処理をする
    • 静的ファイルが存在しない場合は/[workspace_dir]/pt-view.phpでダイナミック生成を行う

設定例

  • /etc/nginx/phpfpm_settingsにリバースプロキシの設定を記述しています。(fastcgi_passfastcgi_param
  • 静的ファイルが配信されているのか、ダイナミック生成が行われているのかを確認するため、add_header x-powered-by PHP/7.2.x;を追記しています。(通常のサイト運用においては不要です)
server {
    listen 443 ssl http2;
    server_name [ホスト名];

    ssl_certificate /etc/letsencrypt/live/[ホスト名]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[ホスト名]/privkey.pem;
    include /etc/nginx/ssl_common;
    root /var/www/vhosts/anothersky.pw/[省略]/public_html;

    location ^~ /app/ {
        location ~ ^/app/(?!site|assets|plugins|theme|index\.php|pt-check\.php).* {
            return 404;
        }
        location ~ \.php$ {
            include /etc/nginx/phpfpm_settings;
            fastcgi_buffering off;  # PowerCMS Xがシステム出力バッファをフラッシュための重要な設定です
        }
    }

    location / {
        set $use_ptview 0;

        if ($cookie_pt-live-preview-time) {
            set $use_ptview 1;
        }
        if ($request_method !~ "GET") {
            set $use_ptview 1;
        }
        if ($query_string ~ "=") {
            set $use_ptview 1;
        }

        if ($use_ptview) {
            rewrite ^ /pt-view.php last;
        }

        index index.html;
        try_files $uri $uri/ /pt-view.php;
    }
    
    # ワークスペースがある場合は追加していく(以下は例です)
    location /blog/ {
        set $use_ptview 0;

        if ($http_cookie ~ "pt-live-preview-time") {
            set $use_ptview 1;
        }
        if ($request_method !~ "GET") {
            set $use_ptview 1;
        }
        if ($query_string ~ "=") {
            set $use_ptview 1;
        }

        if ($use_ptview) {
            rewrite ^ /blog/pt-view.php last;
        }

        index index.html;
        try_files $uri $uri/ /blog/pt-view.php;
    }

    location ~ \.php$ {
        include /etc/nginx/phpfpm_settings;
    }
}

設定内容1は変数$use_ptviewを使用して処理しています。設定内容3はtry_filesを使用して処理しています。

If Is Evil | NGINX」というドキュメントもあるのですが、今回の場合は他に書きようがないのでは、と考えています。ダイナミック生成をする条件が.htaccessよりも書きやすいような印象を持ちました。

補足

  • CMSにログイン済みの場合、PowerCMS Xで管理していない静的ファイルにアクセスしてもリクエストが/site/pt-view.phpで処理され、「ページが見つかりません。」の表示(HTTP 404 Not Found)となります。