Monthly Archives: 12月 2010
nginx(VirtualDocumentRootもどき)でfastcgi(php-fpm)が動かない
現在以下のような方法で、VirtualDocumentRootもどきを実装していますが、
PHPのSCRIPT_FILENAMEが正常に取得できないようなので、調査しました。
【変更前】
server {
listen 80;
server_name ~^(.*)\.hoge.com$;
if (!-d /home/hoge.com/$1/web) {
rewrite . http://hoge.com/ redirect;
}location / {
index index.php;
root /home/hoge.com/$1/web;
}location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/hoge.com/$1/web/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
上記だと、正常に動きませんでした。
原因としては、以下の部分の「$1」の部分に正しい値が入らないためのようでした。
fastcgi_param SCRIPT_FILENAME /home/hoge.com/$1/web/$fastcgi_script_name;
色々試した結果、$1を別の変数として定義してあげれば動くことを確認しました。
結果、以下のような内容になりました。
【変更後】
server {
listen 80;
server_name ~^(.*)\.hoge.com$;
set $subdomain $1;if (!-d /home/hoge.com/$subdomain/web) {
rewrite . http://hoge.com/ redirect;
}location / {
index index.php;
root /home/hoge.com/$subdomain/web;
}location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/hoge.com/$subdomain/web/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
とりあえず上記の記述方法で正常動作しました。よかったよかった。
新品価格 |
Nginx(virtualhost)+php-fpmでPHPが動作しない(凡ミス編)
Nginxでvirtualhostを切ってる状態でphp-fpmを動かそうと頑張っていたんですが、
何故か動かない。
あちこちのサイトで説明されてる内容をそのままやって動かない。
一番下にある洋書のNginxの書籍に書いてある例をやっても動かない。
なんでか悩んでいたんですが、平凡なミスであることがわかりました。
元々の手順としては、nginxが導入されている環境に、
1.PHPとPHP-FPMをyumで簡易インストールする。
yum –enablerepo=remi install php php-fpm
2.一応nginxのメインの設定にphpの設定を書いておく
vi /etc/nginx/nginx.conf
# Add
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
3.自分が作成したVirtualHost用の設定ファイル(/etc/nginx/conf.d/aaa.conf)にも追加する
vi /etc/nginx/conf.d/aaa.conf
server {
listen 80;
server_name test.hoge.com;location / {
root /home/test.hoge.com/web;
index index.php;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
4.php-fpmの起動ユーザーをnginxユーザにしてみる (※必要に応じて変更するかも)
vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
5.サーバ起動時に自動起動するように起動ファイルのリンク作成
ln -s /etc/rc.d/init.d/php-fpm /etc/rc.d/rc3.d/S87php-fpm
6.サーバ起動させてみる。
/etc/rc.d/init.d/php-fpm start
という手順をしたんですが、htmlファイルは問題なく動作するのですが、phpファイルがうごかない。
真っ白になったり、ダウンロードになったり・・意味がわからない。
結論からいうと、ドキュメントルートの設定がおかしくて、表示したいファイルに到達していなかったという事だった。
どこがダメかというと、上記の「3」に問題があったようだ。
具体的には、
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
ここが問題で、document_root変数の下のfastcgi_script_name変数のファイルをkickするわけだが、
$document_root変数の値が、どうも正しく入っていないようだ。
たぶん、メインの/etc/nginx/nginx.confのrootの値を持ってたりするんじゃなかろうかと思うわけだ。
ということで、以下のように変更して、復旧しました。
fastcgi_param SCRIPT_FILENAME /home/test.hoge.com/web/$fastcgi_script_name;
新品価格 |
nginxをyumで簡単構築(インストール,VirtualHostの設定)
nginxのyumパッケージがfadoraのサイトに転がってるようなので、
リポジトリを追加する。(サンプルは64bit版)
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
nginxをyumで簡単インストール。
yum install nginx
とりあえずnginxを起動してみる。apacheでいうところのhttpd start
/etc/rc.d/init.d/nginx start
再起動後もちゃんと起動してくるように起動ファイルを配置する。
ln -s /etc/rc.d/init.d/nginx /etc/rc.d/rc3.d/S88nginx
VirtualHostの設定をする。
Apacheでいうところの
※Apacheだと、完結にはしょって書くとに以下みたいにかくやつです。
ServerName hoge.com
DocumentRoot /home/hoge/web
これをnginx用に書いてみる。
vi /etc/nginx/conf.d/hoge.conf
server {
listen 80;
server_name hoge.com;location / {
root /home/hoge.com/web;
index index.php index.pl index.cgi index.html index.htm;
}
}
これで、一応うごく設定にはなってるはずです。
といっても、特殊な場合以外は、VirtualHostの設定はVirtualDocumentRootで済ましたいので、
以下のようにする。
※Apacheの場合のVirtualDocumentRoot。
ServerName local
VirtualDocumentRoot /home/%2+/sub/%1/web
※これの場合、moge.hoge.comだと、/home/hoge.com/sub/moge/webがDocumentRootになる。
これをnginx用にかきなおす。ファイルは、さっきと同じファイルのまま。
server {
listen 80;
server_name ~^(.*)\.hoge.com$;
if (!-d /home/hoge.com/sub/$1) {
rewrite . http://hoge.com/ redirect;
}# Sets the correct root
root /home/hoge.comf/sub/$1;
}
ついでにアクセスログをvirtualhostに対応したものに変更する。
以下のlog_format形式を追加して、access_logのところで、mainからvhostに切り替える
以下は、変更する個所、追加する個所の抜粋
vi /etc/nginx/nginx.conf
※以下を追加。
log_format vhost ‘$host $remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;※以下のように追記と修正する。
#access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/access.log vhost;
これで、以下のようにaccess_logに変化が出る。
※変更前
192.168.0.100 – - [30/Nov/2010:20:18:02 +0900] “GET / HTTP/1.1″ 200 25 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)” “-”
※変更後
hoge.com 192.168.0.100 – - [30/Nov/2010:20:18:02 +0900] “GET / HTTP/1.1″ 200 25 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)” “-”
test.hoge.com 192.168.0.100 – - [30/Nov/2010:20:18:02 +0900] “GET / HTTP/1.1″ 200 25 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)” “-”