相信广大从事运维工作的小伙伴对编译安装都不陌生,这里我简要演示一下编译安装的基本步奏。

在生产环境中,我们往往需要从网上或其他源码包提供点下载所需要的源码包,而这些源码包我们是无法直接安装的,这时我们就需要先把源代码编译成二进制程序包,然后再执行安装。

源码编译安装程序,首先需要依赖环境的支持,既编译开发工具、以及各个被依赖到的程序包的开发组件,另外还需要通过定制的编译参数来进行编译安装。

常见的编译开发工具(包组)有:

Development tools

Server Platform Development

Desktop Platform Development

Debug Tools

被依赖的程序包的开发组件:

  1. 编译安装被依赖的程序

  2. 安装相关程序的名称中包含devel的子包

源代码程序中会将程序分隔保存在多个文件中,文件间或许存在依赖关系,因此,编译时可能需要按特定次序进行编译;此时,一般会使用项目管理工具(通常也称为构建工具GNU make)对其进行管理;构建工具会调用合适的编译器,并根据配置文件(makefile)中定义的次序对源代码文件进行编译。

需要注意的是:

  1. 每个项目的程序员开发完成某版本之后,会使用autoconf为程序代码生成一个脚本文件:configure;其功用为:此脚本会收集当前系统上的开发环境中所依赖各组件的版本、特性等,并检查所依赖的环境是否能满足,最后根据Makefile.in文件生成一个makefile文件。

  2. 每个项目的程序员开发完成某版本之后,会使用autoconf为程序代码生成一个makefile模板文件,既Makefile.in。


编译人员的编译安装过程如下:

  1. 运行configure脚本:

configure脚本的应用;

    --help:查看帮助信息

    --prefix:指定默认安装路径,如--prefix=/usr/local/nginx

    --sysconfdir:指定配置文件安装路径

    --with-CAPABILITY:依赖的程序包

    --without-CAPABILETY:

    --enable-FEATURE:启用某个特性

    --disable-FEATURE:禁用某个特性


2.运行make命令,完成项目构建;

3.运行make install命令,完成安装;


注意:前两步只需要普通用户权限,建议使用普通用户身份进行;最后一步根据安装路径的指定,可能会用到管理员权限。



以上是编译安装的大概过程,接下来给大家讲一下程序的运行环境

程序安装之后想要被运行起来,就必须为其中的二进制文件指定环境变量,否则只能通过绝对路径进行执行,每次这样都要输入很长的一部分路径,当然也可以通过命令别名来操作,但比较两者起来,环境变量还是比较简洁实用的。在系统之上我们通过$PATH环境变量来指定系统中的二进制程序的路径信息,自己编译的程序文件安装路径可能不在这些路径下,因此就需要编译PATH环境变量,加入这些程序文件所在目录;即将export PATH=export_path:$PATH保存于/etc/profile.d/*.sh文件中。


除了这些二进制文件之外,还有一些库文件信息,因为大多数应用程序都依赖于标准库某些共享文件,甚至于某些应用提供的特定的文件库;Linux系统会在特定的路径下为应用查找所依赖的库文件:/lib64,/lib,/usr/lib64,/usr/lib,自己编译安装的程序提供的库文件有可能不在系统搜索路径中,解决办法:

  1. 编辑/etc/ld.so.conf.d/*.conf文件,添加新库文件搜索路径至此文件中,每行一个;

  2. 执行ldconfig命令,重新生成库映射缓存ld.so.conf


ldconifg 命令:用于生成/etc/ld.so.cache

常见选项有:

    -p:打印当前系统ld.so.cache中已经缓存的所有库文件目录及库文件映射列表;

    -v:显示命令执行过程的详细信息;


除了二进制文件、库文件外还有一些头文件信息,头文件信息的解决方案有两种方法,如下:

  1. 复制所有新生成的头文件至/usr/include目录中

  2. 创建链接(以Apache为例)

    ln -sv /usr/local/apache/include /usr/include/http

    ln -sv /usr/local/apache/include/* /usr/include/


最后还有一些man手册文件,我们可以通过修改man的配置文件/etc/man.config,使用MANPATH指令指向的路径,来让其识别新的帮助信息


说了这么多,下面我们以httpd-2.2.29为例,执行编译安装

首先我们需要将下载到的http-2.2.29.tar.bz2压缩文件解压缩,得到http-2.2.29文件

进入http-2.2.29目录中,首先查看INSTALL文件,这里会给我们提供快速安装指南

运维工程师必备技能——编译安装_源代码

运维工程师必备技能——编译安装_源代码_02

然后我们需要查看README文件,这里给我们提供了程序的介绍

运维工程师必备技能——编译安装_配置文件_03

然后在执行configure之前,我们先使用./configure --help 命令来查看帮助

运维工程师必备技能——编译安装_源代码_04

而后执行./configuer --prefix=/usr/local/http2 --sysconfdir-/etc/http2

运维工程师必备技能——编译安装_配置文件_05

运维工程师必备技能——编译安装_源代码_06

执行完后查看执行make

运维工程师必备技能——编译安装_编译安装_07

运维工程师必备技能——编译安装_配置文件_08

然后执行make install命令

运维工程师必备技能——编译安装_源代码_09

运维工程师必备技能——编译安装_源代码_10

安装完成后cd 到之前我们指定的安装目录下/usr/local,查看是否有Apachectl文件


运维工程师必备技能——编译安装_编译安装_11

接下来我们使用netstat -atn命令查看启动的网络

运维工程师必备技能——编译安装_配置文件_12

发现没有HTTP的80端口号,接下来我们执行./apachectl start命令,启用服务,然后再次使用netstat -tan命令,发现服务已经启动

运维工程师必备技能——编译安装_源代码_13

接下来我们就可以使用浏览器访问了,首先我们使用yum install links安装links浏览器

运维工程师必备技能——编译安装_编译安装_14

运维工程师必备技能——编译安装_编译安装_15

运维工程师必备技能——编译安装_配置文件_16

顺便提醒一下,如果本机的防火墙开启时是无法访问的,我们可以使用iptables -vnL查看防火墙相关信息,然后使用iptables -F临时清空防火墙数据,这样就能实现访问了。

运维工程师必备技能——编译安装_配置文件_17

运维工程师必备技能——编译安装_编译安装_18


为了以后使用的方便,送佛送到西,我们需要定义程序的运行环境

运维工程师必备技能——编译安装_编译安装_19

运维工程师必备技能——编译安装_源代码_20

运维工程师必备技能——编译安装_源代码_21

运维工程师必备技能——编译安装_配置文件_22

运维工程师必备技能——编译安装_编译安装_23

运维工程师必备技能——编译安装_源代码_24

运维工程师必备技能——编译安装_源代码_25

运维工程师必备技能——编译安装_编译安装_26

运维工程师必备技能——编译安装_配置文件_27