CentOS 7.6 编译安装 apache/httpd 和 php7
基础环境
-
阿里云-轻量应用服务器 CentOS 7.6
-
目标 PHP 版本:7.4.13
-
目标 apache/httpd 版本:2.4.46
下载源码包
php 镜像:http://php.p2hp.com
apache 官网:http://httpd.apache.org/download.cgi,官网下载页会提示可用下载镜像
cd /data/Downloads/
wget https://mirrors.sohu.com/php/php-7.4.13.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.46.tar.gz
tar -zxvf php-7.4.13.tar.gz
tar -zxvf httpd-2.4.46.tar.gz
准备安装
编译安装 php
cd /data/Downloads/php-7.4.13
查看配置参数
./configure --help
编译配置
- 指定安装目录:
./configure --prefix=/usr/local/php74
- 指定配置文件路径
php.ini
(安装完毕后查看配置文件信息:php --ini
)
--with-config-file-path=/etc/php74
- 指定配置文件目录
*/etc
--sysconfdir=/etc/php74
- 启用
php-fpm
,暂时未使用,但是在后续的操作中顺路查询了后续开启的方法,得到的结果是不可编译添加,只能初始编译开启
--enable-fpm
- (废弃)执行
make
,报错:未找到sqlite3
,因基本使用不到sqlite
,故使用./configure --help | grep sqlite
查看相关编译参数后,添加参数:
--without-sqlite3 --without-pdo-sqlite
- 其他
--with-apxs2=/usr/local/apache24/bin/apxs
- 编译安装,根据报错依次安装:
yum install libxml2-devel sqlite-devel
make
make install
安装后配置
# 配置可直接执行的 php 命令,这里是 php74
ln -s /usr/local/php7.4/bin/php /usr/local/bin/php74
# 配置可直接执行的 php-fpm 命令,这里是 php74-fpm
ln -s /usr/local/php7.4/sbin/php-fpm /usr/local/bin/php74-fpm
# 暂未使用
cp /usr/local/php7.4/etc/php-fpm.conf.default /usr/local/php7.4/etc/php-fpm.conf
# 暂未使用
cp /usr/local/php7.4/etc/php-fpm.d/www.conf.default /usr/local/php7.4/etc/php-fpm.d/www.conf
# 复制配置文件,该处可能会有问题
cp /data/Downloads/php-7.4.13/php.ini-development | php.ini-production /usr/local/php7.4/etc/php.ini
安装 Composer
composer 不在正常的 php 编译流程之中,只是测试使用时引出了后续的操作
# 下载,可使用 wget / curl 等
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# 创建安装目录,composer 安装工具无法自动创建
mkdir /usr/local/composer
# 安装,指定安装目录,指定安装文件名
php composer-setup.php --install-dir=/usr/local/composer --filename=composer
# 创建可执行文件软链接
ln -s /usr/local/composer/composer.phar /usr/local/bin/composer
# 与第一个操作对应,暂时不明
php -r "unlink('composer-setup.php');"
报错 Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?
,结合百度(参考链接)和 ./configure --help | grep openssl
解决方法一:可以在配置阶段重新添加以下参数进行配置后,重新配置、编译、安装:
--with-openssl
解决方法二:编译模块的方法添加(参考链接)
查看之前的编译参数
cat -n /data/Downloads/php-7.4.13/config.nice
php74 -i | grep configure
php74 -r "phpinfo();" | grep configure
已编译安装的 php 添加模块
openssl 为例
切换到解压的源目录下的 /data/php-7.4.13/ext/openssl
,执行
/usr/local/php7.4/bin/phpize
报错 Cannot find config.m4. Make sure that you run '/usr/local/php7.4/bin/phpize' in the top level source directory of the module
ls
查看,没有 config.m4
,但是有 config0.m4
,将该文件复制或移动并重命名(参考链接)为 config.m4
重新执行 phpize
报错 Cannot find autoconf
安装
yum install autoconf
再次执行 phpize
当前目录下生成 configure
等文件,执行
./configure
报错 configure: error: Cannot find php-config. Please use --with-php-config=PATH
执行
./configure --with-php-config=/usr/local/php7.4/bin/php-config
报错
no package 'openssl' found
执行 openssl version
发现是有 openssl
的,查看 ./configure --help | grep openssl
,添加参数后执行
./configure --with-php-config=/usr/local/php7.4/bin/php-config --with-openssl
再次报错 no package 'openssl' found
,安装 yum install openssl-devel
(参考链接) 后执行
./configure --with-php-config=/usr/local/php7.4/bin/php-config
编译安装,make,输出
Libraries have been installed in:
/data/php-7.4.13/ext/openssl/modules
make install,输出
Installing shared extensions: /usr/local/php7.4/lib/php/extensions/no-debug-non-zts-20190902/
查看 php 启用的模块
php74 -m
php74-fpm -m
此时若修改 php.ini 中开启 openssl 以及 extension_dir 无果,原因可能是配置文件的问题,详情
php 编译默认配置文件路径是 /usr/local/php7.4/lib,而不是 etc,查看 php 配置文件信息(参考链接)
php74 --ini
Configuration File (php.ini) Path: /usr/local/php7.4/lib
Loaded Configuration File: (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
解决方法一:直接使用 lib 作为配置文件目录,搞一份 php.ini 文件过去,以后修改这个
解决方法一:ln -s /usr/local/php7.4/etc/php.ini /usr/local/php7.4/lib/php.ini
解决方法三:重新编译 php,加上参数(参考链接)
--with-config-file-path=/usr/local/php7.4/etc
编译安装 apache/httpd
cd /data/Downloads/httpd-2.4.46
查看编译参数
./configure --help
编译配置
指定安装目录、启用 SSL、启用动态模块加载
./configure
--prefix=/usr/local/apache2.4
--sysconfdir=/etc/httpd
--enable-ssl
--enable-so
--enable-module=shared
根据报错依次安装
yum install -y apr-devel apr-util-devel pcre-devel openssl-devel
编译安装
make && make install
安装后配置
ln -s /usr/local/apache2.4/bin/apachectl /usr/local/bin/apachectl
ln -s /usr/local/apache2.4/bin/httpd /usr/local/bin/httpd
基本服务管理
apachectl start/stop/restart/status
# status 使用有问题,暂未解决
systemctl start 报错 lynx 未找到:yum install lynx
start
报错 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using {ip}. Set the 'ServerName' directive globally to suppress this message
,配置文件中配置域名即可
/usr/local/apache2.4/conf/httpd.conf
ServerName domain.com:80
访问网站页面输出:It works!
- 站点配置文件
mkdir /etc/httpd/conf.d
/etc/httpd/httpd.conf
IncludeOptional conf.d/*.conf
配置服务管理
cp /usr/local/apache2.4/bin/apachectl /etc/init.d/httpd
/etc/init.d/httpd 中
#!/bin/sh 下添加
# chkconfig: 35 70 30 # 这三项参数暂时不明原理
# description:...
chkfonfig --add httpd
此时可用 systemctl 管理 httpd
httpd 开机启动
chkconfig --add httpd
后貌似已经可以开机自启
已编译安装的 apache 添加模块
该处涉及到 apache 模块的动态加载和静态加载,后续有需要再补充
目前的处理就是直接修改配置文件 /usr/local/apache2.4/conf/httpd.conf
查看 apache 加载的模块
查看编译时编译的模块,静态加载的
apachectl -l
查看所有模块,所有的
apachectl -t -D DUMP_MODULES
关联 apache/httpd 和 php
重新完整编译(成功),或仅添加参数编译(未尝试)
./configure --prefix=/usr/local/php7.4 --without-sqlite3 --without-pdo-sqlite
-enable-fpm --with-apxs2=/usr/local/apache2.4/bin/apxs/
执行 make
报错
collect2: error: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
执行 make clean
后重新 make && make install
(参考链接)
编译后,在 /usr/local/apache2.4/modules/
目录会多出 libphp7.so
,同时 /usr/local/apache2.4/conf/httpd.conf
最后会多出 LoadModule php7_module modules/libphp7.so
,再加上
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
并修改
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
编辑 /usr/local/apache2.4/hotdocs/index.php
<?php phpinfo(); ?>
进行关联测试
yum 安装 httpd
因为涉及 selinux 的相关配置不是很熟悉,又想用 selinux 的安全上下文等来限制 apache,而且在编译安装过程中对部分目录和文件的作用比较熟悉了,最后采用了 yum 安装的方式
yum install httpd -y
systemctl start httpd
systemctl enable httpd
# 禁用默认的测试页面
# 将 /etc/httpd/conf.d/welcome.html 中的内容全部注释,不要移除该文件,该文件中的注释说了 升级的时候会重建该文件
# 修改网站目录后后重新设置 selinux 安全上下文
chcon -u system_u -r object_r -t httpd_sys_content_t -Rv /srv/website/
# 添加配置文件后重新设置 selinux 安全上下文
chcon -u system_u -r object_r -t httpd_config_t -Rv /etc/httpd/conf.d/*.conf
chown -R 修改所属用户和组
chmod -R 修改详细权限
cp -r 递归复制
其他相关问题
libsystemd
php 编译安装 --enable-fpm --with-fpm-systemd 报错 no package 'libsystemd' found
yum install systemd-devel
主域名访问正确,子域名访问错误
IncludeOptional 方式时,配置文件路径,采用全路径试试
子域名访问正确,主域名访问错误
阿里云 DNS 解析除设置 * 泛解析外,还需要增加主域名解析 @
ARP 未找到
yum install arp
找不到包:你确定需要的是 arp 而不是 apr ?
安装 semanage
查找提供该功能的软件包(参考链接)
yum provides semanage
yum install policycoreutils-python
semanage 相关命令
- 查看所有的安全上下文
semanage fcontext -l
getsebool
setsebool -P
mysqli 扩展
如 openssl,但是会出现加载失败的问题,Unable to load dynamic library 'mysqli'
undefined symbol: mysqlnd_global_stats
,编译添加的时候加上 --with-mysqli=/usr/bin/mysql_config
,可以通过 find 命令查找 mysql_config 路径,目前不知道原来有没有,因为在尝试过程中执行了一次 yum install mysql-devel
(参考链接)
其他非相关临时记录
微信小程序测试跳过域名和 HTTPS 校验
在微信开发者工具中,右上角详情设置中,本地设置,勾选:不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书,(参考链接 最下方)
跳过域名校验
在微信开发者工具中,可以临时开启
开发环境不校验请求域名、TLS版本及HTTPS证书
选项,跳过服务器域名的校验。此时,在微信开发者工具中及手机开启调试模式时,不会进行服务器域名的校验。在服务器域名配置成功后,建议开发者关闭此选项进行开发,并在各平台下进行测试,以确认服务器域名配置正确。
如果手机上出现 “打开调试模式可以发出请求,关闭调试模式无法发出请求” 的现象,请确认是否跳过了域名校验,并确认服务器域名和证书配置是否正确。
Wordpress 连接阿里云 RDS 失败
我的问题应该不是数据库和连接的问题,通过查看 apache 站点日志,报错是
[日期时间] [php7:warn] [pid...] [client...] PHP Warning: preg_match(): Allocation of JIT m
emory failed, PCRE JIT will be disabled. This is likely caused by security restrictions. Either grant PHP permission to allocate executa
ble memory, or set pcre.jit=0 in /../wp-includes/load.php on line 43
设置了 pcre.jit=0,无果,后猜到可能是 selinux 的权限问题,所以直接改了 yum 安装的 httpd 为编译安装,这里后来反应过来应该先把 selinux 关掉试试,反正是成了
不行,又改回去了,不信试不成
- 正确原因,查看 selinux 日志
tail /var/log/audit/audit.log | grep httpd
type=AVC msg=audit(...): avc: denied { name_connect } for pid=... comm="httpd" dest=3306 scontext=system_u:system_rhttpd_t:s0 tcontext=system_u:object_r:mysqld_port_t:s0 tclass=tcp_socket permissive=0
根据其中一条大概猜是 selinux + httpd + mysql 的问题,因为未使用本地 mysql,检索词:selinux 允许 httpd 连接远程数据库,解决方案(参考链接):
setsebool -P httpd_can_network_connect=on