GeekFactory

int128.hatenablog.com

EL6 で Apache httpd 2.4 と PHP 5.4 を使う

RHEL6系のディストリビューションCentOS, Scientific Linux等)で Apache httpd 2.4.x, PHP 5.4.x を使う場合のメモです。

前提条件

  • Apache httpd は自前でビルドする。
  • epel を有効化する。
  • remi を有効化する。ただし、PHP, MySQL のみに使う。
  • mod_php は使わない。PHP-FPM を使う。

remi の有効範囲を限定する

/etc/yum.repos.d/remi.repo に includepkgs, exclude を追加します。

[remi]
name=Les RPM de remi pour Enterprise Linux 6 - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/6/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
includepkgs=php-*,mysql,mysql-*,compat-mysql51
exclude=php

Apache httpdをインストールする

Jenkinsを用いた継続的RPMビルド - GeekFactory を参照ください。例として Apache httpd のビルドについて書いています。

httpd-2.4.x をインストールした状態で remi の php をインストールしようとすると、下記のエラーが出ます。これはhttpd とモジュールのバージョンを合わせるチェックが働いているためです。

Error: Package: php-5.4.17-2.el6.remi.x86_64 (remi)
           Requires: httpd-mmn = 20051115
           Installed: httpd-2.4.6-1.x86_64 (@my)
               httpd-mmn = 20120211
           Available: httpd-2.2.15-26.sl6.x86_64 (sl)
               httpd-mmn = 20051115
           Available: httpd-2.2.15-28.sl6.x86_64 (sl-security)
               httpd-mmn = 20051115
           Available: httpd-2.4.3-1.x86_64 (my)
               httpd-mmn = 20120211

一方で、php パッケージに含まれているのは mod_php と設定ファイルだけで、内容的にはなくても問題ないことが分かります。

Provides

Files

  • /etc/httpd/conf.d/php.conf
  • /usr/lib64/httpd/modules/libphp5-zts.so
  • /usr/lib64/httpd/modules/libphp5.so
  • /var/lib/php/session
  • /var/www/icons/php.gif
http://www.rpmfind.net//linux/RPM/remi/enterprise/6/x86_64/php-5.4.17-1.el6.remi.x86_64.html

ここで、下記を満たす解決策を考えみましょう。

  • php の依存関係を提供してほしい。
  • mod_php はいらない。
  • httpd-mmn のチェックに引っかからないようにしてほしい。

phpのダミーパッケージをインストールする

一つの解決策として、ダミーパッケージをインストールする方法があります。これは空のRPMを入れて、あたかもインストール済みのように見せかけるものです。乱用するとパッケージ管理システムの運用に支障を来しますが、簡単なので昔からよく使われている手法です。

必要なファイルは GitHubint128/dummy-rpms · GitHub に置いています。

Name:		php
Version:	5.4
Release:	1%{?dist}.dummy
Summary:	A dummy package providing PHP without mod_php
Group:		Development/Languages
License:	Nothing

%description
Providing PHP dependencies for CGI/CLI only environment.

%files
rpmbuild -bb php.spec
sudo yum install php-5.4-1.el6.dummy.rpm

PHP, MySQL をインストールする

PHP, MySQL に依存するパッケージを指定して、依存関係が正常に解決されることを確認してください。

$ sudo yum install php-mysql
(中略)
Resolving Dependencies
--> Running transaction check
---> Package php-mysql.x86_64 0:5.4.17-2.el6.remi will be installed
--> Processing Dependency: php-pdo(x86-64) = 5.4.17-2.el6.remi for package: php-mysql-5.4.17-2.el6.remi.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_18)(64bit) for package: php-mysql-5.4.17-2.el6.remi.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_16)(64bit) for package: php-mysql-5.4.17-2.el6.remi.x86_64
--> Processing Dependency: libmysqlclient.so.18()(64bit) for package: php-mysql-5.4.17-2.el6.remi.x86_64
--> Running transaction check
---> Package mysql-libs.x86_64 0:5.1.69-1.el6_4 will be updated
--> Processing Dependency: libmysqlclient.so.16()(64bit) for package: 2:postfix-2.6.6-2.2.el6_1.x86_64
--> Processing Dependency: libmysqlclient.so.16(libmysqlclient_16)(64bit) for package: 2:postfix-2.6.6-2.2.el6_1.x86_64
---> Package mysql-libs.x86_64 0:5.5.32-1.el6.remi will be an update
---> Package php-pdo.x86_64 0:5.4.17-2.el6.remi will be installed
--> Processing Dependency: php-common(x86-64) = 5.4.17-2.el6.remi for package: php-pdo-5.4.17-2.el6.remi.x86_64
--> Running transaction check
---> Package compat-mysql51.x86_64 0:5.1.54-1.el6.remi will be installed
---> Package php-common.x86_64 0:5.4.17-2.el6.remi will be installed
--> Finished Dependency Resolution

おわりに

httpd-2.4 を使いたいなら FedoraGentoo にしろと聞こえてきそうですね。

この方法ではパッケージ管理システムの構成がやや複雑になるため、必ずドキュメントに残しておきましょう。あまり内容のないエントリになってしまいましたが、参考になれば幸いです。