以前nginxのインストールを行いましたが、理解が浅かったようで今回すげーはまりました(汗)
ガチンコ塾でもいっていますが、覚え始めの時はコピペでもいいですが(最初から100%の理解は非現実的)、慣れてきたら理論的なことを少しずつ覚えてきたいですね。
Contents
以前のリンク
今回はバーチャルホストではなく、1つのドメインのサブディレクトリでcakePHPを使うケースでした。
example.comというホストの下に
example.com/hoge/
example.com/foo/
example.com/bar/
といったようなサービスが存在しており、1つ1つが別のサービスというケースです。
今回新しいURlとしてexample.com/sample/というURLでcakeを使いたいケースです。
環境
- nginx 1.9.3
- cake 2.7.7
- php 5.4.16
- MariaDB 5.5.44
- ディレクトリを/var/nginx/sampleに設置
ソース
/etc/nginx/conf.d/default.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
server { listen 80; server_name localhost; client_max_body_size 20M; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; location / { #root /usr/share/nginx/html; root /var/nginx; index index.html index.htm; } location ~ /sample/(img|css|js|files)/(.+)$ { root /var/nginx/sample/app/webroot; try_files /$1/$2 =404; } location ~ /sample/(.*)$ { root /var/nginx; index index.php index.html; try_files /sample/$1 /sample/$1/ /sample/index.php?$1&$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /var/nginx; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
実際の流れ
大事な考え方として、こういう場合、いきなりcakeを一気に表示することは目指さないほうがいいでしょう。
いきなりゴールにたどり着こうとすると、エラーが起こってもどこで起きているかがわかりにくいため、最初はなるべく一番単純なパターンではじめ、徐々にゴールに近づけていくのがポイントです。
今回のケースでは下記のようにすすめていくのがいいでしょう。
- まずはnginxのディフォルトのページを出す
- hello,worldだけを表示するような簡単なページを出す
- cakeのindex.phpを表示する
- cakeの任意のページを出力する
- cssやjsなども正常に表示する
一見遠回りに見えますが、こちらのほうが近道です。
なんでこんなことを力説するかというと今回php-fpmのの問題だったのに、cakeの問題だと勘違いして2時間ぐらい無駄にしたからです(汗)
1.まずはnginxのディフォルトのページを出す
まずはhttp://ドメイン名でアクセス正常にnginxが動いているかを確認します。下記ページが表示されればOKです。
2 hello,worldだけを表示するような簡単なページを出す
/var/nginx以下にhoge.phpを置いてブラウザからhttp://domain/hoge.phpが動くかを確認します。
php-fpmが動いていれば正常に出力されますが、そうでないとファイルのダウンロードが始まったり、404になったりします。
ちなみに動いていない場合はソース下記の部分を参考に。
1 2 3 4 5 |
location / { #root /usr/share/nginx/html; #ディフォルトのルートディレクトリ root /var/nginx; index index.html index.htm; } |
1 2 3 4 5 6 7 |
location ~ \.php$ { root /var/nginx; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } |
3 cakeのindex.phpを表示する
通常のphpファイルが正常に表示されたら、cakeのなかのページの表示を行います。
ブラウザからhttp://domain/sample/index.php あるいはhttp://domain/sample/でアクセスしてみましょう。
ちなみにこの部分はソースの下記の部分が動いています。
1 2 3 4 5 6 7 8 9 |
location ~ /sample/(.*)$ { root /var/nginx; index index.php index.html; try_files /sample/$1 /sample/$1/ /sample/index.php?$1&$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } |
4 cakeの任意のページを出力する
cakeは通常 http://domain/アプリ名/コントローラー名/アクション名/といった形式でアクセスを行います。
このようなファイルはありませんが、URLの書き換えを行っていますので、上記のようなURLでアクセスできるわけです。
こちらに相当するのが上記のソースの
1 |
try_files /sample/$1 /sample/$1/ /sample/index.php?$1&$args; |
の部分です。
5 cssやjsなども正常に表示する
上記のままだとcssやjs、画像ファイルが正常に出力されていないと思います。
これらのファイルに関してはwebrootを起点ということを知らせたいので下記のように記述します。
1 2 3 4 |
location ~ /sample/(img|css|js|files)/(.+)$ { root /var/nginx/sample/webroot; try_files /$1/$2 =404; } |
参考リンク
nginx上でサブディレクトリのCakePHPアプリを動作させる
ちなみにapacheでは下記のリンクを。
[…] 以前nginxでの使用法については下記に書きました。 nginxインストール(サブディレクトリでcakePHPを使いたいとき) […]