Category Archives: WebServer

nginxでZend Framework(rewrite)を利用する

0
Filed under nginx, php, WebServer, Zend Framework, 未分類

nginx + php-fpm + pecl-apcで構築されたサーバでZend Frameworkを利用する際に、
.htaccessが使えないことで以下のような記述ができませんでした。

## リライトエンジンを有効に。
RewriteEngine On

## リライトの対象パスを指定
RewriteBase /

## リライトルールを宣言(画像、CSS、Javascript)以外をindex.phpに転送する。
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

通常の Apache の場合などには、.htaccessで上記のように表現できますが、
nginxでは、現状各ユーザ毎のフォルダに設置して対応する方法がないようです。

具体的にいうと、nginx.confでincludeをサポートしているので、
各ユーザ領域に設定ファイルの断片をおいて、includeさせることまではできると思われますが、
そこを修正しても、読み込み直さないと反映されないので、意味がないという事になります。

よって、対策としては、容易に設定修正できないという難点は致し方ないとして、
/etc/nginx/nginx.conf(ファイルパスは環境により異なります。)、
または、includeしている /etc/nginx/conf.d/***.confの中の該当のドメイン設定部分に
以下のように追記します。

server {
listen 80;
server_name test.example.com ;
location / {
root /home/Web;
index index.php index.cgi index.html index.htm;
rewrite ([^(js|ico|gif|jpg|png|css)])$ index.php;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/Webdir/hattara.info/main/web/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}

これでとりあえず動くようになります。
現状だと、逆にいえばこれしかできないような気もする。。

.htaccessみたいに外部で設定できるようにできたり、rewriteの設定がもう少しわかりやすいといいなぁと思うけど、
これが速度とのトレードオフなのかもしれないですね。

ということで、rewriteとかの設定で、超はまりまくったけど、今日はこの辺で。

Nginx Http Server

新品価格
¥3,964から
(2010/12/20 19:36時点)

nginx(VirtualDocumentRootもどき)でfastcgi(php-fpm)が動かない

0
Filed under Cent, fastcgi, Linux, nginx, php, WebServer

現在以下のような方法で、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 Http Server

新品価格
¥3,964から
(2010/12/20 19:36時点)

Nginx(virtualhost)+php-fpmでPHPが動作しない(凡ミス編)

0
Filed under Cent, fastcgi, Linux, nginx, php, WebServer

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 Http Server

新品価格
¥3,964から
(2010/12/20 19:36時点)

nginxをyumで簡単構築(インストール,VirtualHostの設定)

0
Filed under nginx, WebServer, 未分類

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)” “-”

yumでインストールしたApache2にmod_sslを足してhttpsを実現する

0
Filed under Apache

ちょっと単純にhttpsを使いたいというより、別の目的のためにhttpsが必要になったので、
mod_sslを利用して、httpsを実現しようと思います。

前提として、yumでhttpdが入っていて、正常に動作すること。とします。

まずは、mod_sslをyumでインストールします。
※opensslがないようなら、別途インストールしてください。

    yum install mod_ssl

次にApacheで利用する証明書を生成します。
(お金があるなら信頼性が高い第3者機関の正式な証明書をVerisignやGlobalSignなどから購入すると良い)

まずは、秘密鍵を生成します。

mkdir /etc/httpd/key
cd /etc/httpd/key
openssl genrsa -des3 -out server.key 1024

すると、パスフレーズを聞かれる画面がでます。
Enter pass phrase for server.key:  aaaaa (※自分だけわかる適当なパスフレーズを打ち込んでください)
Verifying – Enter pass phrase for server.key: aaaaa (※確認画面にも同様のパスフレーズを打ち込む)

次にCSRファイルを作成します。本来はこれを第3者機関に提出し、信頼できる証明書を発行してもらいます。

openssl req -new -key server.key -out server.csr

するとまた質問が出るので、1個ずつ回答します。

(※先ほど作成したパスフレーズを打ち込みます)
Enter pass phrase for server.key: aaaaa

(※国を聞かれています。私は日本なのでJPです)
Country Name (2 letter code) [GB]: JP

(※州・県を聞かれています。福岡なのでFukuokaです)
State or Province Name (full name) [Berkshire]:Fukuoka

(※市を聞かれています。福岡近郊なのでFukuokaにしちゃいます)
Locality Name (eg, city) [Newbury]:Fukuoka 

(※会社名を聞かれてます。法人じゃないけど、Hattaraといれちゃう)
Organization Name (eg, company) [My Company Ltd]: Hattara

(※部署名を聞かれてますが、部署はないので、部署ある人だけ入力ください)
Organizational Unit Name (eg, section) []:

(※証明書のドメイン名を入力します。)
Common Name (eg, your name or your server’s hostname) []:hattara.info

(※メールアドレスを書かれます。いれたければ、入力してください。)
Email Address []: 

(※パスワードの入力を求められますが、特に指定する必要なさそうなので、スルーです。)
A challenge password []:  

(パスワードの確認画面もスルーです。)
An optional company name []: 

そして、本題の証明書を作成するわけですが、
上記でも書いてある通り、貧乏な私は、第3者機関の信頼できる証明書を生成するお金がないので、
自己証明(オレオレ詐欺ならぬ、オレオレ証明書)を生成します。
とりあえず100年くらい持つ証明書を生成しておきます。

openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 36500

するとまた、見慣れた表示がでます。
Enter pass phrase for server.key: aaaaa (※先ほど入力したパスフレーズを入力してください)

これでとりあえず自己証明書が生成完了したことになるわけですが、
このままだとApacheの再起動のたびにパスフレーズを入力するはめになるので、
秘密鍵からパスフレーズを削除します。

mv -i server.key server.key_backup
openssl rsa -in server.key_backup -out server.key

すると、いつもどおりパスフレーズを聞かれるので、入力する
Enter pass phrase for server.key_backup: aaaaa (※先ほど入力したパスフレーズを入力)

これで本当にSSL証明書の生成フェーズは完了。
こっからは、Apache側でhttps起動してくれるように設定します。

cd /etc/httpd/conf.d/
cp -p ssl.conf ssl.conf_backup  (※一応バックアップとっておきましょう。たしなみですね。)
vi ssl.conf

まずは、秘密鍵の設定を修正します。
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

SSLCertificateKeyFile /etc/httpd/key/server.key

次に証明書ファイルの設定を修正。
SSLCertificateFile /etc/pki/tls/certs/localhost.crt

SSLCertificateFile /etc/httpd/key/server.crt

※一応Apacheの設定に問題がないかを確認する。
/etc/rc.d/init.d/httpd configtest

  結果が、「Syntax OK」なら問題なし。

最後にApache自体を再起動させてあげれば完了。
/etc/rc.d/init.d/httpd restart

XMLを表示できない。

0
Filed under .htaccess, php, Zend Framework
Tagged as , , ,

ZendFrameworkの勉強と称して、PHPからXMLを表示しようとしてたわけですが、
XML表示ができずに、以下のようなエラーが出てました。

XML パースエラー: タグの対応が間違っています。終了タグが必要です:

URL: http://zend.hattara.info/Response/
行番号: 11, 列番号: 3:

–^

色々周りの方に確認してもらったりしたら、間違いがボロボロと。。。

  • ZendFrameworkでは、Controller部分には、phpの閉じかっこ「 ?> 」は記載しないらしい
  • XMLを表示する際には、タグの中はシングルクォートではなく、ダブルクォートを利用するらしい
  • 」は「」と競合するので、short_open_tagはOffにする必要があるらしい
  • charsetをUTF-8にしてるのに、ソースをEUCで記載してたので出たらしい

というあたりがありました。
なので、.htaccessで以下を追加したり各内容を修正したりしました。

php_value short_open_tag “Off”

この辺を全部対応して、どうにか動くようになりました。

ZendFrameworkで404エラー

0
Filed under .htaccess, Apache, php, Zend Framework
Tagged as ,

.htaccessでmod_rewriteを使って転送してるつもりが、
404エラーになってしまう。

Apacheのエラーログ(error_log)では、「File does not exist:」が
でてる状態なわけです。

こんな現象とちょっと戯れたので、メモしとく。

.htaccessの内容は以下。

## リライトエンジンを有効に。

RewriteEngine On

## リライトの対象パスを指定

RewriteBase /

## リライトルールを宣言(条件・アクセス先)

RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

まあ、これで普通はmod_rewriteによって、該当領域にきたアクセスで
RewriteRuleで指定されている画像など以外のものは、
すべてindex.phpにアクセスされるようになるはずなんですね。

ここで大きな落とし穴がありました。
.htaccessの書き方が問題なくても、
そもそも.htaccessを有効にしてない場合があるわけです。

Apacheのhttpd.confに「AllowOverride」って項目があるわけです。
これが「None」とかになってると、.htaccessが利用できないです。

これは、サーバ管理者にお願いする形になっちゃうんでしょうけど、
修正するしかないですね。

ZendFrameworkのおすすめ書籍


.htaccessで基本だけど忘れる事

3
Filed under .htaccess, Apache
Tagged as , , ,

よく.htaccessを使うわけだけども、その都度書き方をググるわけです。
面倒なんで、メモで残しておきます。

まず、特定ホストからのみアクセスを許可するなら、

order deny,allow
deny from all
allow from 192.168.0.100
allow from 192.168.0.200

みたいな感じにすれば、OKですね。

次に、mod_rewriteで転送する場合ですが、アクセスホスト名毎に
内容を分岐する(VirtualHostとか使ってない場合?)とか、
コンテンツ内容によって変更する場合には、以下のような書き方でいけますね。

## シンボリックリンクを有効に(場合によって不要かも)

Options FollowSymLinks

## リライトのエンジンを有効に。

RewriteEngine on

## サイト名A宛でtest.phpでもtest/フォルダでもなければmainフォルダに転送

RewriteCond %{HTTP_HOST} a.com
RewriteCond %{REQUEST_URI} !(^/test\.php)
RewriteCond %{REQUEST_URI} !(^/test/)
RewriteRule ^(.*)$ /main/ [R]

## サイトB宛で/aaa/abc.php宛のものを defフォルダに転送

RewriteCond %{HTTP_HOST} b.com
RewriteCond %{REQUEST_URI} (^/aaa/abc.php)
RewriteRule ^(.*)$ /def/ [R]

というような感じでできますね。
あとは、これをもとの修正をいれてあげればいい感じ。

条件とか不要な場合には、Redirectを使えばいいですね。

Cent4&PHP5&Trac&Pythonの甘い罠

0
Filed under Apache, Cent, Linux, php, python, Trac
Tagged as , , , , ,

Cent4(CentOS4)系でTrac(Python&Sqlite)を使う場合に、
PHP5を利用していると、(pdo_sqlite)がconflict?するようで、
TracかPhpかどちらかしか動作しなくなる。

具体的には、yum版のApache2とかだと、
/etc/httpd/conf.d/php.conf とかで以下の記述がある場合、
Tracが動かなくなる。

LoadModule php5_module modules/libphp5.so

具体的には、ブラウザ上では、500エラーになり、
エラーログでは、以下のような出力がたくさんでる。

PythonHandler trac.web.modpython_frontend: DatabaseError: unsupported file format

で、上記のLoadModuleをコメントアウトすると、Phpは動かなくなるが、
Tracは動くようになる。

ということで、PhpでSqliteを使う予定がなければ、
以下のようにpdo_sqlite.iniを適当な名前にリネームしてあげればよし。

mv -i /etc/php.d/pdo_sqlite.ini /etc/php.d/pdo_sqlite.ini_org

その後、Apacheの再起動をお忘れなく。
yum版(rpm)のApacheの場合には、

/usr/sbin/apachectl restart

とかでいいですね。

で、以下のサイトを参考にさせてもらいました。

Ryuzee.com >> CentOS4でPHP4から5にするとTracが動かなくなる

VirtualDocumentRootの続き

0
Filed under Apache

以前VirtualDocumentRootのことについて書きましたが、
そもそも何をしたかったかというと、

test.com等の特定のドメインの場合には、VirtualHostを有効に。
aaa.test.com のように普通のサブドメインの場合は、
毎回VirtualHostを設定しなくていいようにVirtualDocumentRootを。
というような入り組んだ仕組みにしたかったわけです。

一部特殊な設定をしているサブドメインなどがあるので、
全部をVirtualDocumentRootにできなかったので、探してました。

で、いろいろなサイトを参考にして、結論としては、以下のようになってます。

## デフォルトの設定

ServerName local
ServerAdmin hara@dedede.net
VirtualDocumentRoot /home/%2+/%1

## 特殊な設定をする場合

ServerName aaa.test.com
ServerAdmin hara@dedede.net
DocumentRoot /home/aaa/test.com

 ・
 ・
 ・
 ・

この場合には、VirtualHostの中のServerNameに
アクセスされているホスト名がなければ、
自動で一番最初のVirtualHostの設定をよみ、
VirtualDocumentRootが実行されるようです。

こんな感じで、VirtualHostとVirtualDocumentRootが共存できました。

いいっすね。
こういう楽ができる技術は最高です。