![[番外]编译安装:apache 篇](/assets/1788926622980-________________________-____________.jpg)
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 服务。