在CentOS 7上实现LAMP的一键安装

最近,CentOS 更新至 7.0.1406 版本,为了适应这一变化,LAMP 一键安装脚本进行了大量的更新与测试,并记录了许多遇到的问题。由于 CentOS 7 将服务管理重定向为 systemctl,许多开机自启动脚本需要重写,这一过程耗费了不少时间。同时,一些在 CentOS 6 中存在的依赖包在 CentOS 7 中已不复存在,例如 libc-client-devel,这对于安装 php-imap 扩展是必需的。缺少这个依赖将导致编译 PHP 的 imap 扩展时出错,因此只能手动编译安装 imap-2007f,并指定 imap 扩展的路径。此外,去掉了一些在新旧 CentOS 中都不存在的依赖包,如 libmcrypt-devel,并全部编译安装了最新版。
以下是一些主要更新的概述:
1、获取公网 IP 的方式变更
在 CentOS 7 中,默认未安装 ifconfig 及其依赖包 net-tools,因此将原本通过 ifconfig 获取 IP 的方法改为使用 curl 外链获取 IP。因此,运行本脚本时,确保设备已连接互联网。
2、手动安装一些依赖包
需要手动安装的依赖包包括 pcre、libiconv、libmcrypt、mcrypt、re2c、libedit 和 imap。在 CentOS 5 中,pcre 版本过低可能导致 Apache 编译失败;MySQL 需要使用 readline 功能,因此需编译安装 libedit;PHP 的 imap 扩展依赖 libc-client 共享库,需编译安装 imap-2007f 等等。某些错误信息在网上查找时也不够明确,尤其是中文网站上。因此,列出一些常见错误。
编译 PHP 时可能遇到的错误:
configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information。
这通常是由于 imap 扩展缺少依赖包导致的。编译安装 imap-2007f 的步骤如下:
wget ftp://ftp.cac.washington.edu/imap/imap-2007f.tar.gz tar -zxf imap-2007f.tar.gz cd imap-2007f make lr5 PASSWDTYPE=std SSLTYPE=unix.nopwd EXTRACFLAGS=-fPIC IP=4 rm -rf /usr/local/imap-2007f/ mkdir /usr/local/imap-2007f/ mkdir /usr/local/imap-2007f/include/ mkdir /usr/local/imap-2007f/lib/ cp c-client/*.h /usr/local/imap-2007f/include/ cp c-client/*.c /usr/local/imap-2007f/lib/ cp c-client/c-client.a /usr/local/imap-2007f/lib/libc-client.a
备注:在 64 位系统中编译时,make 参数需包含 EXTRACFLAGS=-fPIC,而在 32 位系统中则无需该参数。同时,在 CentOS 7 下编译 PHP 的 imap 扩展时,需添加以下参数:
--with-imap=/usr/local/imap-2007f --with-imap-ssl
而在 CentOS 6 下,因为已安装 libc-client-devel 依赖包,编译时参数如下:
--with-imap --with-imap-ssl --with-kerberos
3、新增判断函数
增加了一些判断函数,例如判断系统是否为 64 位,是否为 CentOS 7 等。
4、更新启动脚本
Apache 启动脚本 /etc/init.d/httpd 被更新,拷贝至 /usr/local/apache/bin/apachectl 文件中。同时,为了使 /etc/init.d/httpd status 能够正常使用,新增了配置文件 /usr/local/apache/conf/extra/httpd-info.conf。
5、CentOS 7 可能遇到的问题
在完成 LAMP 安装后,可能无法通过 IP 访问网站。查看进程时发现 httpd 和 mysqld 已启动,防火墙似乎也已关闭,ping 命令也正常,但还是无法访问。经过排查,发现问题出在 CentOS 7 最新的 firewalld。因此,需要使用经典的 iptables-services 来替代 firewalld。
yum -y install iptables-services systemctl mask firewalld systemctl enable iptables systemctl stop firewalld systemctl start iptables
6、PHP组件支持
目前为止,我见过的 LAMP、LNMP、LANMP 等一键安装脚本对 PHP 组件的支持并不全面,缺失了许多组件,最典型的就是 imap 和 ldap。为了支持这些组件,我进行了大量改进和测试。这里附上一张 PHP 探针的截图,显示支持所有组件及四种第三方组件。

尽管 LAMP 一键安装脚本经过了大量测试,但仍可能存在一些不足之处。如果在使用过程中遇到问题,请反馈至相关渠道,或将安装日志 lamp.log 发送至指定邮箱。
