接下来我来介绍以下编译安装的好处
编译安装的优点与缺点
一、优点
高度可定制
可根据实际需求启用或关闭特性(如 Apache 的模块、MySQL 的引擎等)。
灵活控制编译参数、优化性能(如
--enable-xxx
、--with-xxx
)。
更高的性能优化
可使用特定的编译器优化选项(如
-O2
、-march=native
)提高程序运行效率。去除不必要的模块,减小程序体积,提高安全性。
更好的版本控制
可以安装特定版本的源码,不受系统发行版限制。
更容易应用第三方补丁或进行二次开发。
适用于最小化系统或特殊环境
在无包管理器的精简系统中,编译是唯一选择。
二、缺点
耗时长、过程复杂
编译需要较长时间,依赖关系复杂,容易出错。
对于新手不友好,需要一定的Linux和编译基础。
难以维护和升级
无法像包管理器那样自动升级或回滚版本。
升级新版本通常需要重新编译、替换旧版本,步骤繁琐。
依赖管理困难
手动解决依赖包和路径问题(如
lib
,include
目录)。安装多个软件可能会导致版本冲突或路径混乱。
不易统一管理
无法用系统的包管理工具(如
yum
,apt
)统一管理安装状态。不易记录和追踪已安装组件及其版本。
三、与其他安装方式对比
安装方式 | 优点 | 缺点 |
---|---|---|
编译安装 | 可定制、优化性能、版本灵活 | 耗时长、难维护、依赖复杂 |
二进制安装 | 快速部署、直接使用 | 灵活性差、可选组件少、平台依赖性强 |
包管理器安装 | 易于维护、自动处理依赖、统一管理 | 版本受限于仓库、定制性差、更新节奏由发行版决定 |
脚本
下面是Apache编译安装的脚本
#!/bin/bash
# Apache 编译安装 + Systemd 管理 脚本
# 作者:PEI
# 时间:20250610
# 版本配置
APACHE_VERSION=2.4.62
APR_VERSION=1.7.4
APR_UTIL_VERSION=1.6.3
# 安装路径
INSTALL_DIR=/usr/local/apache
SRC_DIR=/usr/local/src
# 停止并禁用防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
# 永久禁用 SELinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 网络检测
echo "检查网络连接..."
ping -c 2 www.baidu.com > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "❌ 无网络连接,退出!"
exit 1
fi
echo "✅ 网络正常"
# 安装依赖
echo "安装依赖包..."
yum -y install gcc make cmake apr-devel apr-util-devel pcre-devel expat-devel openssl-devel wget tar
# 下载源码
mkdir -p $SRC_DIR && cd $SRC_DIR
echo "下载 Apache 与 APR..."
wget -c https://archive.apache.org/dist/httpd/httpd-${APACHE_VERSION}.tar.gz
wget -c https://archive.apache.org/dist/apr/apr-${APR_VERSION}.tar.gz
wget -c https://archive.apache.org/dist/apr/apr-util-${APR_UTIL_VERSION}.tar.gz
# 解压并整合 APR
echo "📦 解压源码..."
tar xf httpd-${APACHE_VERSION}.tar.gz || { echo "❌ 解压 Apache 失败"; exit 1; }
tar xf apr-${APR_VERSION}.tar.gz || { echo "❌ 解压 APR 失败"; exit 1; }
tar xf apr-util-${APR_UTIL_VERSION}.tar.gz || { echo "❌ 解压 APR-Util 失败"; exit 1; }
# 合并 apr 到 httpd 源码
mv apr-${APR_VERSION} httpd-${APACHE_VERSION}/srclib/apr
mv apr-util-${APR_UTIL_VERSION} httpd-${APACHE_VERSION}/srclib/apr-util
# 模块选择
echo "请选择要启用的模块(输入数字):"
echo "1) 启用动态模块 (--enable-so)"
echo "2) 启用 SSL 模块 (--enable-ssl)"
echo "3) 启用 CGI 模块 (--enable-cgi)"
echo "4) 启用重写模块 (--enable-rewrite)"
echo "5) 全部启用"
echo "6) 退出"
read -ep "请选择操作 (1-6): " i
CONFIGURE_OPTIONS=""
case $i in
1) CONFIGURE_OPTIONS="--enable-so" ;;
2) CONFIGURE_OPTIONS="--enable-ssl" ;;
3) CONFIGURE_OPTIONS="--enable-mime --enable-cgi" ;; # CGI 依赖 MIME
4) CONFIGURE_OPTIONS="--enable-rewrite" ;;
5) CONFIGURE_OPTIONS="--enable-so --enable-ssl --enable-mime --enable-cgi --enable-rewrite --enable-charset-lite" ;;
6) echo "退出"; exit 0 ;;
*) echo "无效选择,退出"; exit 1 ;;
esac
# 添加必要模块
CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS --enable-log-config --enable-logio"
# 编译安装 Apache
echo "开始编译 Apache..."
cd $SRC_DIR/httpd-${APACHE_VERSION}
./configure --prefix=$INSTALL_DIR --with-included-apr $CONFIGURE_OPTIONS >> /root/apache_build.log 2>&1
if [ $? -ne 0 ]; then
echo "❌ 配置失败,查看日志: tail -n 20 /root/apache_build.log"
exit 1
fi
make -j$(nproc) >> /root/apache_build.log 2>&1
if [ $? -ne 0 ]; then
echo "❌ 编译失败,查看日志: tail -n 20 /root/apache_build.log"
exit 1
fi
make install >> /root/apache_build.log 2>&1
if [ $? -ne 0 ]; then
echo "❌ 安装失败,查看日志: tail -n 20 /root/apache_build.log"
exit 1
fi
# 校验配置文件是否生成成功
if [ ! -f "$INSTALL_DIR/bin/httpd" ]; then
echo "❌ 编译失败,未生成 httpd 可执行文件"
exit 1
fi
# 检查配置语法
$INSTALL_DIR/bin/httpd -t || { echo "❌ Apache 配置语法错误"; exit 1; }
# 创建 systemd 服务文件
echo "创建 systemd 服务..."
cat > /etc/systemd/system/httpd.service << EOF
[Unit]
Description=The Apache HTTP Server
After=network.target
[Service]
Type=forking
ExecStart=$INSTALL_DIR/bin/apachectl start
ExecReload=$INSTALL_DIR/bin/apachectl graceful
ExecStop=$INSTALL_DIR/bin/apachectl stop
PIDFile=$INSTALL_DIR/logs/httpd.pid
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
# 解决端口冲突
echo "检查端口冲突..."
if netstat -tuln | grep -q ':80\b'; then
echo "⚠️ 80端口被占用,尝试释放..."
pkill -9 httpd
systemctl stop nginx 2>/dev/null
sleep 2
fi
# 重新加载 systemd 并启动
systemctl daemon-reload
systemctl enable httpd
systemctl restart httpd
# 检查服务状态
if systemctl is-active --quiet httpd; then
echo -e "\n✅ Apache 启动成功"
echo "访问地址: http://$(curl -s ifconfig.me)"
else
echo -e "\n❌ Apache 启动失败"
echo "查看错误日志: tail -n 50 $INSTALL_DIR/logs/error_log"
echo "诊断命令: systemctl status httpd"
exit 1
fi
# 显示状态
echo -e "\n✅ Apache 安装完成,服务状态:"
systemctl status httpd --no-pager
安装流程
以下是 Apache 编译安装步骤的基本流程:
1,下载源代码包:在 Apache 官网或镜像站点上下载最新版本的 Apache 源代码包,解压缩到本地目录中。
2,安装编译工具:为了编译安装 Apache,需要确保系统已经安装了必要的编译工具,如 GCC、make、autoconf 等。可以通过运行以下命令来检查是否已经安装:
go
gcc -v
make -v
autoconf -V
3,配置编译选项:在解压缩后的源代码目录中,运行 ./configure 命令配置编译选项。例如:
javascript
./configure \
--prefix=/usr/local/apache2 \
--enable-so \
--enable-ssl \
--with-ssl=/usr/local/openssl
其中,--prefix 指定安装路径,--enable-so 启用动态模块支持,--enable-ssl 启用 SSL/TLS 支持,--with-ssl 指定 OpenSSL 的安装路径。
其他选项含义:
--prefix=/usr/local/httpd:指定安装目录为 /usr/local/httpd,这是 Apache HTTP Server 的默认安装目录。
--enable-so:启用动态共享对象(DSO)支持,使得 Apache HTTP Server 可以加载共享库模块。
--enable-rewrite:启用 mod_rewrite 模块,该模块允许在请求 URL 与本地文件系统路径之间进行重写,从而允许 URL 重定向和其他高级 URL 处理。
--enable-charset-lite:启用 mod_charset_lite 模块,该模块提供了字符集转换和处理支持,它使得 Apache HTTP Server 可以在处理响应内容时根据需要自动转换字符集。
--enable-cgi:启用 CGI 支持,使得 Apache HTTP Server 可以执行 CGI 脚本,这是动态生成网页内容的一种常见方式。
4,编译源代码:运行 make 命令编译源代码。如果编译出现错误,需要根据错误提示调整编译选项或解决依赖问题。
5,安装 Apache:运行 make install 命令安装 Apache。安装过程中会将二进制文件、配置文件、文档等文件复制到指定的安装路径中。
6,配置 Apache:编辑 Apache 的配置文件,例如 httpd.conf,根据需要修改服务器的配置选项。
7,启动 Apache:运行 apachectl start 命令启动 Apache。可以通过访问 http://localhost/ 测试 Apache 是否正常工作。如果一切正常,可以将 Apache 设置为开机自启动,以便系统重启后自动启动。
注意:以上步骤仅作为基本参考,实际安装过程可能因为操作系统、Apache 版本、依赖库等因素而有所不同。在安装之前,请务必仔细阅读 Apache 官方文档和相关教程,并根据实际情况进行相应的调整。