Apache Httpd2.4 和php7.x不兼容问题

前言

2018/10 在公司服务器上尝试安装了zabbix4.0。
安装清单如下:

  • CentOS:CentOS release 6.6 (Final)
  • Zabbix:4.0
  • Postgresql:10.5
  • Php:7.2
  • Apache Httpd2.4

由于Apache Httpd2.4和php7.x的不兼容问题,导致按照过程比较曲折。
在这记录一下,供同样有问题的同学参考。
※zabbix安装的步骤另起一篇文章,此篇只说标题内容。

现象

使用yum安装Apache Httpd2.4和php7.2后,由于libphp7.so包的问题,导致httpd2.4不能正常启动。

对策

  • 方案1:使用httpd2.2 ,或者nginx等其他容器。
    →httpd2.2在2017年底不支持了。如果在公司内网使用的话,推荐这个方案 。
  • 方案2:强用httpd2.4

方案1较为简单,yum 安装httpd2.2就能解决。
可是我偏偏选择了方案2(调查清楚原因后才知道自己走的最弯曲和陡峭的路)。

下面说说自己遇到的坑。

方案2的坑1

由于安装的是php7.2,所以httpd的conf.d文件夹下的zabbix.conf配置文件中就得使用libphp7.so(zabbix官方默认的是libphp5.so)。
启动htppd2.4报错

/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf: Cannot load /opt/rh/httpd24/root/usr/lib64/httpd/modules/libphp7.so into server: /opt/rh/httpd24/root/usr/lib64/httpd/modules/libphp7.so: cannot open shared object file: No such file or directory

原因和解决办法

因为使用了错误的repo库,php7.2 在使用yum安装的时候,不会生成libphp7.so
简单来说

remi-php54.repo
remi-php70.repo
remi-php71.repo
remi-php72.repo
remi.repo
  • 如果从remi.repo yum 安装的话,安装的包名是php72-XXX,此时不会自动生成libphp7.so。
  • 如果从指定版本的remi-php72.repo安装的话,包名是php-XXX。
    这个时候会生成libphp7.so。
  • 正确命令如下
# yum install --enablerepo=remi,remi-php72 php php-devel php-common  php-mbstring php-openssl php-pdo php-pecl-apcu php-xml php-pear php-gd php-mcrypt php-pgsql php-bcmath php-xmlrpc php-ldap php-openssl 

方案2的坑2

将生成的libphp7.so拷贝到httpd2.4的modules下后,新的error出现。

# service httpd24-httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Syntax error on line 57 of /opt/rh/httpd24/root/etc/httpd/conf/httpd.conf: Cannot load /opt/rh/httpd24/root/usr/lib64/httpd/modules/libphp7.so into server: /opt/rh/httpd24/root/usr/lib64/httpd/modules/libphp7.so: undefined symbol: unixd_config
                                                           [FAILED]

google后得知原因,httpd2.4中更改了API接口,导致php的unixd_config方法不可用。

解决办法是下载同样版本php7.2代码版本,自己编译出适应httpd2.4的so文件。
我使用编译命令如下:

# PHP7.2编译用关联包安装
yum -y install \
  bison \
  libxml2-devel

# .configure失败回避
ln -s /opt/rh/httpd24/root/usr/lib64/pkgconfig/apr-1.pc /usr/lib64/pkgconfig/apr-1.pc

# 下载源码,XX部分请换成自己对应版本。
wget https://github.com/php/php-src/archive/php-7.2.XX.tar.gz
tar xvf php-7.2.XX.tar.gz
cd php-src-php-7.2.XX
./buildconf --force
./configure \
    --with-config-file-path=/etc/ \
    --with-config-file-scan-dir=/etc/php.d \
    --with-apxs2=/opt/rh/httpd24/root/usr/bin/apxs
    --
make
# 不需要make install。因为已经yum install过了。
# so文件拷贝到对应的httpd路径下。
cp /home/vagrant/php-src-php-7.2.XX/libs/libphp7.so /opt/rh/httpd24/root/usr/lib64/httpd/modules/libphp7.so

方案2的坑3

编译php的时候,找不到【opt/rh/httpd24/root/usr/bin/apxs】这个路径。
原因:yum 安装 httpd2.4的时候选择的模块不全。
解决办法:使用以下命令重新安装httpd2.4

yum install --enablerepo=epel-httpd24 httpd24-httpd httpd24-httpd-devel httpd24-mod_proxy_html httpd24-mod_session httpd24-mod_ssl

到此为止 httpd2.4就可以正常启动,且支持php了。

后记

其实按照上面的安装清单来安装的话,各种坑很多。此处只是记录了稍微大的3个。

你可能感兴趣的:(Apache Httpd2.4 和php7.x不兼容问题)