CentOS 7 编译安装 apache/httpd 和 php7

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
posted @ 2020-12-14 23:29  赵江江  阅读(1562)  评论(0编辑  收藏  举报