ファーストサーバVPS環境でPHPのセーフモードを回避する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

ファーストサーバ のVPS環境では、デフォルトでPHPがセーフモード で動いており、セーフモード環境下で幾つかの関数が制限を受ける ことになります。

その制限を回避・解除する方法を紹介します。



セーフモードを回避する


もっともシンプルな方法は、PHPのセーフモードの制限に従って環境を変えてしまうことです。

例えば、ディレクトリを作成するmkdir関数はセーフモード環境では「処理を行うディレクトリが実行するスクリプトと同じ UID を有しているかどうかを確認します」という制限を受けます。


スクリプトと同じUIDというのは、実行スクリプトの所有者ではなく、Apacheの実行ユーザーになるため、Apacheの設定ファイルからなんというユーザー名で実行されているのかを調べ、そのスクリプトが操作をする範囲のディレクトリを全てApacheの実行ユーザーとすることで回避できます。


セーフモードの制限に引っかかった場合は、下記のようなエラーが出力されます。


Warning: mkdir() [function.mkdir]: SAFE MODE Restriction in effect. The script whose uid is 10001 is not allowed to access /var/www/contents owned by uid 48 

上記エラーのUIDが10001がスクリプトの所有者、最後に出てくる48はApacheの実行ユーザーのUIDです。

なので、スクリプトやmkdirを実行する対象ディレクトリのUIDをApacheの実行ユーザーに変更しておきます。

Apacheの実行ユーザーは、http.conf内に記載されているので、そこから確認すればよいでしょう。


User apache
Group apache

所有者がわかれば、後は変更してスクリプトを再実行してみます。


# chown -R apache:apache ./site_create/


セーフモードを解除する


注意) これは非推奨のやり方で、設定することによって適切なサポートを受けられなくなる可能性があります。設定する際には、自己責任でバックアップなどを取った上で実施してください。


VPS環境下では、PHPやApacheの設定の幾つかが仮想ソフトウェアによりコントロールされています。

セーフモードも同様に、PHPの設定ファイル(/etc/php.ini)を変更しても有効になりません。

というか、デフォルトでセーフモードはOFFになっているのに、phpinfo関数で見てみるとセーフモードがONで動いていることがわかります。


で、このVPS環境で強制したい設定の幾つかをまとめた設定ファイルが存在します。

設定ファイルのパスは、環境(運用しているドメインなど)で異なりますが、


/var/www/vhosts/localhost.localdomain/conf/httpd.include

あたりにあると思います。

この中で、


<IfModule sapi_apache2.c>
    php_admin_flag engine on
    php_admin_flag safe_mode on
    php_admin_value open_basedir "/var/www/vhosts/localhost.localdomain/httpdocs:/tmp"
</ifmodule>
<IfModule mod_php5.c>
    php_admin_flag engine on
    php_admin_flag safe_mode on
    php_admin_value open_basedir "/var/www/vhosts/localhost.localdomain/httpdocs:/tmp"
</ifmodule>


という箇所があるので、「php_admin_flag safe_mode on」という設定をoffに変更します。

設定を変更した後は、Apacheプロセスを再起動すればセーフモードが解除されます。