baserCMSをnginx上で動かす設定
こんにちは、ナカエです。
今日はbaserCMSを軽量Webサーバnginx(エンジンエックス)上で動かす際の設定について書きます。
スマートURLをONにした設定を前提としています。
※Nextatのサイトで現在進行形で実験中です。
※今回の設定は特にリバースプロキシを利用したりしていないのでサイト表示は速くなりません
CakePHPで開発されているbaserCMSのユーザにとって、CakePHPのCookbook は非常にありがたい参考書です。
今回もドンピシャの情報がありましたので、これを参考に設定します。
nginxは.htaccessを解釈しないため、.htaccessのmod_rewriteで行っているURL変換と同じ内容を設定ファイルに書くことになります。
serverディレクティブの例はこうなります。
※httpディレクティブの設定は本筋から外れるので省略します。
今回の場合は下記とほぼ同じ働きをします。
WordPressの高速化設定などnginxの解説したブログ記事で
たまにファイルやディレクトリの存在チェックをifでずらずらと書いているのを見かけます。
try_filesを使うほうがずっとコンパクトで間違える心配も少ないでしょうね。
ほかにも、nginxでよくある悪い設定(=落とし穴)の解説はこちらが参考になります。
http://wiki.nginx.org/Pitfalls
これで完成!!とnginxを起動して意気揚々とアクセスすると、うちの環境ではCSSなど静的ファイルへのパスがおかしくなっていました。
臨時の対策としてApp.baseURLを下記のように書き換えて正常に動いています。
→http://nextat.co.jp/staff/archives/42
原因は、php.iniのcgi.fix_pathinfoの設定で、環境変数PHP_SELFが正しくない状態でした。
cgi.fix_pathinfo=0としておけば正常に動作するようです。
今日はbaserCMSを軽量Webサーバnginx(エンジンエックス)上で動かす際の設定について書きます。
スマートURLをONにした設定を前提としています。
※Nextatのサイトで現在進行形で実験中です。
※今回の設定は特にリバースプロキシを利用したりしていないのでサイト表示は速くなりません
環境
- baserCMS 2.1.1
- PHP 5.4.16 (PHP-FPMで動作)
- nginx 1.2.3
- CentOS 6.4
参考
nginxでのきれいなURL |URLリライティング ― CakePHP Cookbook v2.x documentationCakePHPで開発されているbaserCMSのユーザにとって、CakePHPのCookbook は非常にありがたい参考書です。
今回もドンピシャの情報がありましたので、これを参考に設定します。
設定
1.nginx.confの設定
nginxの設定ファイルを編集します(デフォルトでは/etc/nginx/nginx.conf )。nginxは.htaccessを解釈しないため、.htaccessのmod_rewriteで行っているURL変換と同じ内容を設定ファイルに書くことになります。
serverディレクティブの例はこうなります。
※httpディレクティブの設定は本筋から外れるので省略します。
server {
listen 80;
server_name example.com;
root /path/to/basercms_root/app/webroot/; # ルートを指定
index index.php;
access_log /path/to/log_dir/access.log;
error_log /path/to/log_dir/error.log;
location / {
try_files $uri $uri/ /index.php?$uri&$args; # 下記参照※
}
location ~ \.php$ {
try_files $uri =404; #phpファイルが見つからない場合は404
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
# Unixソケットを利用してFastCGIに渡す場合
# fastcgi_pass unix:/path/to/socket_dir/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # fastcgi_paramsファイルに直接記述してもOK
}
#動かすための最小限の設定はここまで。
#以下は静的ファイルに対する指定
#.htaccess .gitなどへのアクセスを禁止
location ~ /\.(ht|git|svn) {
deny all;
}
#ファビコンとrobots.txtへのアクセスを記録しない
location = /favicon.ico {
acces_log off;
log_not_found off;
}
location = /robots.txt {
acces_log off;
log_not_found off;
}
}
設定の肝であるtry_filesディレクティブは順番にファイルの存在をチェックし、最初に見つかったものを返します。今回の場合は下記とほぼ同じ働きをします。
location / {
if (-f $request_filename) {
break;
}
if (-d $request_filename) {
break;
}
rewrite ^(.+)$ /index.php?q=$1 last;
}
WordPressの高速化設定などnginxの解説したブログ記事で
たまにファイルやディレクトリの存在チェックをifでずらずらと書いているのを見かけます。
try_filesを使うほうがずっとコンパクトで間違える心配も少ないでしょうね。
ほかにも、nginxでよくある悪い設定(=落とし穴)の解説はこちらが参考になります。
http://wiki.nginx.org/Pitfalls
2.baserCMSの設定
baserCMS公式サイトの解説のとおり、install.php(インストール前ならcore.php)の「App.baseUrl」の設定を変更します。
Configure::write('App.baseUrl', '');
これで完成!!とnginxを起動して意気揚々とアクセスすると、うちの環境ではCSSなど静的ファイルへのパスがおかしくなっていました。
臨時の対策としてApp.baseURLを下記のように書き換えて正常に動いています。
Configure::write('App.baseUrl', '/');
今のところ特に問題はないですが、時間があるときに見直しが必要ですね。追記 2013/8/20
App.baseUrlの設定を変えなければ動作しない問題を解決しました。→http://nextat.co.jp/staff/archives/42
原因は、php.iniのcgi.fix_pathinfoの設定で、環境変数PHP_SELFが正しくない状態でした。
cgi.fix_pathinfo=0としておけば正常に動作するようです。