/opt/buildhome/repo/hugo-site/content/posts/post-3/index.md
首页 ›Tech › [番外]编译安装:apache 篇

[番外]编译安装:apache 篇

作者 Worthify 九月 9, 2026 5 分钟阅读# Tech
[番外]编译安装:apache 篇

1. 什么是编译?什么是编译安装?

1.1. 什么是编译?

我们在电脑中输入的代码,无论是 Python,Java,C 等等编程语言,计算机是看不懂的。只有当我们写好程序,点击 IDE 上的运行按钮时,编译器或将我们写的语言转移成计算机能看到的懂的机器吗 0000111…. 之类。这个写完程序,运行程序的过程就相当于完成了一次编译。

我们现在所学习的编程语言,基本上都是为了让我们人类能够读的懂的”高级语言“,”高级语言“直接喂给计算机,计算机根本就看不懂。计算机只知道它们的语言,也就”机器码“,或者叫”二进制语言“。就好比我们给一个没有学过中文的老外说中文一样,老外听不懂我们说的是什么,也就不知道该如何做。而编译就好比将我们和老外之间塞了一个翻译,翻译可以将我们说的中文,转换为老外他们个国家的语言,让老外能听得懂我们说话。就是这样,编译其实就是将我们使用的”高级语言“转换为机器能够识别的”机器码“。

1.2. 什么是编译安装?

现代操作系统安装应用非常方便,执行一个 .exe 文件,或则在 linux 系统下输入 apt install xxx ,yum -y xxx 等等指令就可以直接安装。只需要设置一下安装路径。开启或关闭某些功能就信行。

而编译安装就比较麻烦了,从名字上来看,我们得先编译,然后在安装。展开来说 ,就是直接通过编译程序的源代码,将源代码编译成机器看的懂语言后,再安装并执行的步骤。这整个过程我都需要我们人工执行和干预,

编译安装与直接通过软件包安装的来说,有诸多劣势。但是任然有一些科研类或者极其垂类的软件只提供了编译安装方式。

2. 编译安装步骤。

2.1 编译安装流程

这里以 apache 2.4 版本为例,讲解如何一步步的通过源码来安装。

  • 系统版本:Archlinux(linux 6.15.2-arch-1)
  • 软件版本:gcc 15.1.1,apr 1.7.6-1,apr-util 1.6.3-2
  • apache 版本:2.4.63

2.1.1 下载源码包

apache 官网有当前最新版本的软件源码包。可以通过下面的 链接 进入官网下载。官网提供两种格式的源码压缩包,依据自己习惯使用的解压工具下载即可。这里我们下载 .tar.gz 格式的包,下载后的格式大致如下:

httpd-2.4.63.tar.gz

这里推荐直接使用 wget 命令或者 git 命令下载。在下载源码前,建议现在系统中创建一个目录,将下载的源码包放到目录中方便管理。

wget https://dlcdn.apache.org/httpd/httpd-2.4.63.tar.gz -p /home/shibo/apache_source_code/

之后,我们将下载到的源码包进行解压。

gzip -d httpd-2.4.63.tar.gz		# 使用 gzip 解压 gz 格式压缩包。
tar -zvf httpd-2.4.63.tar		# 使用 tar 解压 tar 格式的压缩包。注意:直接使用 tar 解压带 .gz 格式的按照包会提示无法解压该格式。
cd  httpd-2.4.63		# 进入解压后的源码目录中。

进入 cd 目录后,您因该可以看大致如下内容:

总计 2500
drwxr-xr-x 1 shibo shibo    1050  6月29日 10:07 .
drwxr-xr-x 1 shibo shibo      56  6月26日 22:39 ..
-rw-r--r-- 1 shibo shibo   13496  1月 7日 23:00 ABOUT_APACHE
-rw-r--r-- 1 shibo shibo   26049 2021年12月14日 acinclude.m4
-rw-r--r-- 1 shibo shibo   66792 2019年 3月26日 Apache-apr2.dsw
-rw-r--r-- 1 shibo shibo   81919 2019年 3月26日 Apache.dsw
-rw-r--r-- 1 shibo shibo    9907 2009年12月18日 apache_probes.d
-rw-r--r-- 1 shibo shibo    2512 2008年12月22日 ap.d
drwxr-xr-x 1 shibo shibo    1120  6月28日 16:25 build
-rw-r--r-- 1 shibo shibo    2644 2007年 8月24日 BuildAll.dsp
-rw-r--r-- 1 shibo shibo    2784 2018年 1月14日 BuildBin.dsp
-rwxr-xr-x 1 shibo shibo   10679 2017年 9月 8日 buildconf
-rw-r--r-- 1 shibo shibo  374240  1月21日 03:01 CHANGES
drwxr-xr-x 1 shibo shibo       0  1月21日 03:35 changes-entries
-rw-r--r-- 1 shibo shibo   48901 2024年 8月 4日 CMakeLists.txt
-rw-r--r-- 1 shibo shibo   14180 2020年 2月21日 config.layout
-rw-r--r-- 1 shibo shibo   91102  6月28日 16:14 config.log
-rwxr-xr-x 1 shibo shibo     103  6月28日 16:14 config.nice
-rwxr-xr-x 1 shibo shibo   45428  6月28日 16:14 config.status
-rwxr-xr-x 1 shibo shibo 1266128  1月21日 03:35 configure
-rw-r--r-- 1 shibo shibo   32507 2024年 6月21日 configure.in
-rw-r--r-- 1 shibo shibo       0  6月28日 16:14 .deps
drwxr-xr-x 1 shibo shibo     134  1月21日 03:35 docs
-rw-r--r-- 1 shibo shibo     403 2004年11月22日 emacs-style
-rw-r--r-- 1 shibo shibo   16492 2021年 4月19日 .gdbinit
drwxr-xr-x 1 shibo shibo      18  1月21日 03:35 .github
-rw-r--r-- 1 shibo shibo    5238 2023年 1月 9日 .gitignore
-rw-r--r-- 1 shibo shibo    2218 2016年 3月23日 httpd.dep
-rw-r--r-- 1 shibo shibo    4124 2008年 6月12日 httpd.dsp
-rw-r--r-- 1 shibo shibo    8994 2016年 3月23日 httpd.mak
-rw-r--r-- 1 shibo shibo   17313  1月21日 03:35 httpd.spec
drwxr-xr-x 1 shibo shibo    1174  6月28日 16:14 include
-rw-r--r-- 1 shibo shibo    3782 2016年 5月18日 INSTALL
-rw-r--r-- 1 shibo shibo    2909 2011年11月15日 InstallBin.dsp
-rw-r--r-- 1 shibo shibo    4097 2013年11月16日 LAYOUT
-rw-r--r-- 1 shibo shibo   79070 2016年 3月23日 libhttpd.dep
-rw-r--r-- 1 shibo shibo   21656 2021年 5月12日 libhttpd.dsp
-rw-r--r-- 1 shibo shibo   39216 2021年 5月14日 libhttpd.mak
-rw-r--r-- 1 shibo shibo   25479 2020年 1月15日 LICENSE
-rw-r--r-- 1 shibo shibo   11975 2022年11月29日 Makefile.in
-rw-r--r-- 1 shibo shibo   53749 2019年 3月26日 Makefile.win
drwxr-xr-x 1 shibo shibo     406  6月28日 15:52 modules
-rw-r--r-- 1 shibo shibo    1233  6月28日 16:14 modules.c
-rw-r--r-- 1 shibo shibo     721  1月21日 03:03 NOTICE
-rw-r--r-- 1 shibo shibo   13884 2016年 3月20日 NWGNUmakefile
drwxr-xr-x 1 shibo shibo     138  6月28日 15:52 os
-rw-r--r-- 1 shibo shibo    4650 2023年 2月17日 README
-rw-r--r-- 1 shibo shibo    1036 2023年 7月18日 README.CHANGES
-rw-r--r-- 1 shibo shibo   13318 2023年 7月18日 README.cmake
-rw-r--r-- 1 shibo shibo    4418 2014年 8月28日 README.platforms
-rw-r--r-- 1 shibo shibo   10184 2020年 2月21日 ROADMAP
drwxr-xr-x 1 shibo shibo    1258  6月29日 10:07 server
drwxr-xr-x 1 shibo shibo      48  6月28日 15:52 srclib
drwxr-xr-x 1 shibo shibo    1818  6月29日 10:07 support
drwxr-xr-x 1 shibo shibo     662  6月28日 15:52 test
-rw-r--r-- 1 shibo shibo    8186 2020年 2月21日 VERSIONING

看到这一堆文件是不是就已经比较懵了?不要和害怕,这么多文件,我们真正需要看到,其实就几个。我们先来看最重要的文件——RADME。或者直接去 apache 官网 查看安装前的准备工作。

2.1.2. 配置 configura

编译安装第一步查看 RADME 和 INSTALL 文件后,我们就可以开始进行按照操作了。依据官网的安装页面的要求,编译安装 apache 至少需要一下几个基础的软件:

gcc(用于编译源码),apr(apache 运行环境),apr-util(apache 运行环境)。这三个软件我们直接通过包管理器进行安装。

Ubuntu;

sudo apt-get install -y gcc apr apr-util

rockylinux/RHEL

sudo yum install -y gcc apr apr-util

archlinux

sudo pacman -S gcc apr apr-util
或
yay -S gcc apr apr-util

安装玩上述的软件后,我们就可以开始对源码进行编译了,而在编译之前,我们需要先对这个源码进行一些配置,以生成一个适用于我们系统的 makefile 文件。INSTALL 文件中其实也给出了一些例子参考,比如下面这个:

./configure --prefix=/usr/local/bin/apache2			# 即将软件的安装目录制定到 /usr/local/apache2 文件中。
或则更加复杂,精细的操作
CC="pgcc" CFLAGS="-O2" \			# cc 表示编译器,即指定编译器为 PGCC,标志为 02。
     ./configure --prefix=/sw/pkg/apache \			# --prefix 指定安装路径。即将软件安装到 /sw/pkg/apache 中。
     --enable-rewrite=shared \		# 动态加载 rewrite 模块。shared 表示动态加载,相反 static 为静态加载。
     --enable-speling=shared 		# 动态加载 speling 模块。

./configura 文件中各个选项和参数可以查看官网的 configure 参考手册 里面包含了 .configure 中每个选项和参数的具体作用。可以依据自己的需求添加或者删除某些功能。比如我的编译配置如下:

./configure --enble-so --enable-mods-shared=all 
说明:
--enable-so:开启 apache 动态模块加载机制,可以让 apache 动态的加载或卸载模块。
--enable-mods-shared=all:动态加载所有模块。

补充:动态加载和静态加载:

上面的动态加载和静态加载是 apache 服务器的一个特性,apache 是模块化设计的。我们可以按照需求增加或者删除功能。而动态加载和静态加载就是我们对其进行的操作。

  • 动态加载: 可以在 apache 运行时直接加载或者卸载模块,用于实现某些功能,例如,我们想要让 apache 服务器增加对 php 语言的支持。我们只需要在 apache 的配置文件中,增加一个 loadmods mods_php_support 之类的模块即可实现。但是,也正是因为多了这么一个“加载”的动作,在调用那些需要“加载”的模块时,会出现一些性能损失
  • 静态加载: 即所有功能在 apache 服务器安装时就已经写入到配置文件中,后期如何想要增加或则删除某些功能,就不能像动态加载一样可以随时加载。而是要直接重新编译整个 apache 服务器,在编译时写上需要的功能重新安装后才能实现。虽然这种凡是看起来很死板,但是因为所有模块在 apache 启动时也一起被启动了。所有数据都存在内存中,性能方面要比动态加载的高一些。

2.1.3. 编译 make。

如果一切顺利,在执行上面的 configure 后。configure 会依据我们的配置生产一份可以编译的 makefile。makefile 文件中记录了软件在安装是需要那些内容,因该执行什么操作等等。我们可以直接 make 命令来开始编译软件的源码。

make

这一步是编译安装里面最折磨,最麻烦的一步,因为 make 的过程中,很有可能出现各种报错,找不到运行库,找不到某些指令或者选项。当我们看到 make 因为报错而停止时,我们就需要对其进行一些操作,以便可以让 make 顺利的运行下去。例如,我在编译 apache 时,就出现了如下的报错:

/usr/bin/ld: cannot find -ldb-6.2: No such file or directory

从上面的信息中来看, 我们可以得知如下信息:

  • /usr/bin/ld: 这是链接器(Linker),负责在编译的最后阶段将所有编译好的代码片段和所需的库文件“链接”成一个可执行文件。
  • cannot find -ldb-6.2: 链接器找不到一个名为 libdb-6.2.so 的库文件。-l 是链接器的标志,表示后面跟着的是库名。db-6.2 对应到实际的文件名就是 libdb-6.2.so。
  • No such file or directory: 系统中不存在这个文件,或者它所在的目录没有被链接器搜索。

简单来说,你正在编译的 Apache(或者更可能是它依赖的 apr-util 模块)需要一个特定版本(6.2)的 Berkeley DB 数据库库,但系统中没有安装它。

了解报错的原因后接下来的操作就非常简单了,找到 db-6.2 这个数据库,然后安装它。我们先使用下面的命令在软件仓库中找下有没有对应版本的包。

shiboarch% sudo pacman -Q db 
db 6.2.32-1

有对应的版本,那么,我们就可以直接通过命令将他安装上去。

shiboarch% sudo pacman -S db

安装完成后,我先别急着 make,先把之前 make 到一半的残局清理掉,然后在进行 make 操作。

make clean		# 清理之前的编译后生产的数据。
make 			# 重新进行编译。

一切顺利的话,等 make 停止且没有报错后,就可以进行下一个环节了。编译安装。

2.1.4. 安装——make install

轻舟已过万重山,现在只剩下最后一步了,将刚刚编译出来的预处理文件,变成真正可以被计算机执行的可执行文件。注意哦,在执行这一步时需要更高的权限来创建和写入程序。所以,这一步最好在前面加上 sudo 或者直接用户 root 用户运行吧。

sudo make install

如果一切顺利,那么在 /usr/local/apache2 目录中,就已经生产了对应的文件。我们的安装步骤就此结束!!。

我们可以进入该目录查看一下:

shiboarch% ls -al /usr/local/apache2 
总计 0
drwxr-xr-x 1 root root  124  6月28日 16:25 .
drwxr-xr-x 1 root root   86  6月28日 16:25 ..
drwxr-xr-x 1 root root  256  6月28日 16:25 bin
drwxr-xr-x 1 root root  178  6月28日 16:25 build
drwxr-xr-x 1 root root   80  6月28日 16:25 cgi-bin
drwxr-xr-x 1 root root   76  6月28日 22:40 conf
drwxr-xr-x 1 root root 1064  6月28日 16:25 error
drwxr-xr-x 1 root root   20  1月21日 03:35 htdocs
drwxr-xr-x 1 root root 3488  6月28日 16:25 icons
drwxr-xr-x 1 root root 1520  6月28日 16:25 include
drwxr-xr-x 1 root root   56  6月28日 17:41 logs
drwxr-xr-x 1 root root   16  6月28日 16:25 man
drwxr-xr-x 1 root root 7392  1月21日 03:35 manual
drwxr-xr-x 1 root root 3530  6月28日 16:25 modules

上面的目录中, bin 目录中就是 apache 的可执行文件,而 conf 目录中,则是 apache 的主配置文件。

2.1.5. 测试

因为 linux 的权限管理限制,只有 root 用户才能够启用或监听 1024 及其以下的端口。因此我们需要更改一下 apache 的配置文件。让它监听其他的端口。

vim /usr/local/apache2/conf/httpd.conf
# 更改 listen 行为 8080 
listen 8080 

现在,启动 apache 查看是否配置成功:

shiboarch% /usr/local/apache2/bin/apachectl -k start 

没有报错的话,我们使用浏览器 访问 http:\\localhost:8080 ,如果看到如下内容,那么就说明你的配置已经生效,可以后雪其他操作了。

it work 

恭喜,您已经成功通过 编译安装的方式安装了 apache 服务。