本章节目标
源码包的基本概述
源码包的好处
源码包的获取
源码包分类
源码包的安装
源码包基本概述
在linux环境下面安装源码包是比较常见的, 早期运维管理工作中,大部分软件都是通过源码安装的。那么安装一个源码包,是需要我们自己把源代码编译成二进制的可执行文件。
源码包的编译用到了linux系统里的编译器,通常源码包都是用C语言开发的,这也是因为C语言为linux上最标准的程序语言。Linux上的C语言编译器叫做gcc,利用它就可以把C语言变成可执行的二进制文件。所以如果你的机器上没有安装gcc就没有办法去编译源码。可以使用yum -y install gcc来完成安装。
源码包的好处
- 自定义修改源代码
- 定制需要的相关功能
- 新版软件优先更新源码
源码包的获取
官方网站, 可以获得最新的软件包
源码包分类
- 源码格式(需要编译安装)
- 二进制格式(解压后可以直接使用)
源码包的安装
编译需要编译环境,开发环境,开发库,开发工具。
常用的编译环境有c、c++、perl、java、python5种
c环境的编译器:gcc(GNU C Complier)
c++环境的编译器:g++
make:c、c++的统一项目管理工具,编译时有可能调用gcc也有可能调用g++。使用makefile文件定义make按何种次序去编译源程序文件中的源程序
源码安装三部曲(常见):
第一步:./configure (定制组件)
1. 指定安装路径,例如--prefix=/opt/nginx-1.12
2.启用或禁用某项功能, 例如 --enable-ssl
3.和其它软件关联,例如--with-pcre
4.检查安装环境,例如是否有编译器 gcc,是否满足软件的依赖需求
5.检测通过后生成Makefile文件
第二步:make
1.执行make命令进行编译, 可以使用-j指定CPU核心数进行编译
2.按Makefile文件进行编译, 编译成可执行二进制文件
3.生成各类模块和主程序
第三步:make install
1.按Makefile定义好的路径拷贝至安装目录中
上面介绍的源码三部曲不能百分百通用于所有源码包, 也就是说源码包的安装并非存在标准安装步骤,但是大部分源码安装都是类似的步骤
configure脚本功能
- 让用户选定编译特性
- 检查编译环境是否符合程序编译的基本需要
编译安装注意事项
-
如果安装时不是使用的默认路径,则必须要修改PATH环境变量,以能够识别此程序的二进制文件路径;
- 修改/etc/profile文件或在/etc/profile.d/目录建立一个以.sh为后缀的文件,在里面定义export PATH=$PATH:/path/to/somewhere
-
默认情况下,系统搜索库文件的路径只有/lib,/usr/lib
- 增添额外库文件搜索路径方法:
- 在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中。此时库文件增添的搜索路径重启后有效,若要使用增添的路径立即生效则要使用ldconfig命令
- ldconfig:通知系统重新搜索库文件
/etc/ld.so.conf和/etc/ls.so.conf.d/*.conf //配置文件
/etc/ld.so.cache //缓存文件
-v //显示重新搜索库的过程
-p //打印出系统启动时自动加载并缓存到内存中的可用库文件名及文件路径映射关系 - 增添额外库文件搜索路径方法:
-
头文件:输出给系统
- 默认:系统在/usr/include中找头文件,若要增添头文件搜索路径,使用链接进行
-
man文件路径:安装在–prefix指定的目录下的man目录
默认:系统在/usr/share/man中找man文件。此时因为编译安装的时候不是安装到默认路径下,如果要查找man文件则可以使用以下两种方法:- man -M /path/to/man_dir command
- 在/etc/man_db.conf文件中添加一条MANPATH
源码包编译实例
下面通过编译安装nginx来深入理解源码包安装
压缩nginx包
[root@localhost ~]# ls
nginx-1.14.2.tar.gz
[root@localhost ~]# tar xf nginx-1.14.2.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src
[root@localhost src]# ls
debug kernels nginx-1.14.2
[root@localhost src]# cd nginx-1.14.2/
[root@localhost nginx-1.14.2]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
编译安装nginx,并排除错误
没有C语言编译器错误
[root@localhost nginx-1.14.2]# ./configure --prefix=/opt/nginx
checking for OS
+ Linux 3.10.0-693.el7.x86_64 x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not foun
安装C语言编译器
[root@localhost nginx-1.14.2]# yum -y install gcc gcc-c++
没有安装prce-devel
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
安装prce-devel
[root@localhost nginx-1.14.2]# yum -y install pcre-devel
没有安装zlib-devel
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.
安装zlib-devel
[root@localhost nginx-1.14.2]# yum -y install zlib-devel
安装完成
[root@localhost nginx-1.14.2]# ./configure --prefix=/opt/nginx
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/opt/nginx"
nginx binary file: "/opt/nginx/sbin/nginx"
nginx modules path: "/opt/nginx/modules"
nginx configuration prefix: "/opt/nginx/conf"
nginx configuration file: "/opt/nginx/conf/nginx.conf"
nginx pid file: "/opt/nginx/logs/nginx.pid"
nginx error log file: "/opt/nginx/logs/error.log"
nginx http access log file: "/opt/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
编译安装make&make install
[root@localhost nginx-1.14.2]# make && make install
[root@localhost nginx-1.14.2]# echo $?
0
关闭防火墙
[root@localhost nginx-1.14.2]# systemctl stop firewalld.service
开启nginx
[root@localhost ~]# /opt/nginx/sbin/nginx
查看端口
[root@localhost ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
查看网页