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

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

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

  1. 次の場合は/[workspace_dir]/pt-view.phpでダイナミック生成を行う
    • CMSにログインしている…Cookieにpt-userを名前とする情報がある場合(ライブプレビューを行う場合等ですね)
    • 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).* {
            return 404;
        }
        location ~ \.php$ {
            include /etc/nginx/phpfpm_settings;

            # Debug
            add_header x-powered-by PHP/7.2.x;
        }
    }

    location / {
        set $use_ptview 0;

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

        if ($use_ptview) {
            rewrite ^ $ptview_path last;
        }

        index index.html;
        try_files $uri $uri/ @powercmsx;
    }

    location @powercmsx {
        rewrite ^((.*)\/)?.*$ $1/pt-view.php last;
    }

    include /etc/nginx/gzip_settings;
}

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

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

補足

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