読者です 読者をやめる 読者になる 読者になる

@半径とことこ60分

人間の認知範囲なんてそんなもんさと、鳥が囀った

Plamo-5.2/ウェブサーバapache+phpを立ち上げる(prefork)

さて、無線LANにもつながりましたので、Windows から作業を出来るようにします。hosts.allow で、同一セグメント内の通信を許可しないとつながりません。

# cat /etc/hosts.allow
#
ALL : LOCAL
ALL : 192.168.1.
# End of hosts.allow.

プロセスを見ますと、Webサーバが立ち上がっているようですのでバージョンを見てみます。ついでに php も。

# httpd -v
Server version: Apache/2.4.7 (Unix)
Server built:   Dec 17 2013 18:06:14

# php -v
PHP 5.5.7 (cli) (built: Dec 13 2013 18:49:41)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

 ブラウザに http://vaioくんのipアドレスを打ってみます。

It works!

と表示されますので動いていますね。ただ、ドキュメントルートや設定ファイルの場所が、私が記憶しているものと少し変わっているようです。設定ファイル /etc/httpd/http.conf を見てみますと、

DocumentRoot "/srv/httpd/htdocs"

となっていますし、各設定ファイルも /etc/httpd/extra/ ディレクトリに別ファイルとして置いて、インクルードするようになっています。phpも組み込まれていません。いくつか変更しましょう。

まず、phpを組み込んでみます。/etc/httpd/httpd.conf の以下のコメントアウトを外せばいけそうです。

(2014/02/04追記)
その後、phpmysql で苦労する羽目になり、気づいたのですが、この二行は元々の httpd.conf にはないですね。その時は確かにあったんですが、自分で書き足したのかも知れません。

# php5 conf
Include /etc/httpd/extra/php5.conf

で、apache をリスタートしてみると、

# apachectl restart
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed

と、叱られてしまいました。

Apacheは、マルチスレッドで動いているけど、あんたのphpはスレッドセーフでコンパイルされていない。phpコンパイルし直せ。

ということですね。いろいろ調べてみますと、これを解決するには、

  1. ApacheのMPMをマルチスレッドのworkerからpreforkに変更する
  2. phpcgiで動かす
  3. phpをスレッドセーフでコンパイルし直す

の3つの方法があるようです。正直、あまり詳しいことは分からないのですが、いろいろやってみましょう。

まずは、apacheをpreforkに変更

/usr/lib/httpd/module/ を見てみますと、
mod_mpm_prefork.so
mod_mpm_worker.so
2つのモジュールがありますので、httpd.conf を書き換えればいけるのかも知れません。

 #LoadModule mpm_worker_module lib/httpd/modules/mod_mpm_worker.so
LoadModule mpm_prefork_module lib/httpd/modules/mod_mpm_prefork.so

 として、apacheをリスタートすると、無事立ち上がったようです。

# apachectl -V | grep 'Server MPM'
Server MPM:     prefork

おお、preforkで走ってますね。ドキュメントルートに

# cat /srv/httpd/htdocs/phpinfo.php
<?php
phpinfo();
?>

を作って、phpの動作確認をしてみます。

f:id:ausnichts:20140130110039p:plain

問題ないようです。確かに、Server API Apache 2.0 Handlerとモジュールで動いていますし、ThreadSafety disabled となっています。

公開するサーバではありませんので、これで問題はないと思いますが、せっかくですので、workerとpreforkの違いとか安全性を調べてみることにします。