前言

编译Nginx遇到的问题记录


一、如何编译源码包?

安装源码包通常需要以下 3 个步骤。
(1) ./configure。这一步可以定制功能,加上相应的选项即可,具体有什么选项可以通过命 令./configure --help 来查看。这一步会自动检测你的 Linux 系统与相关的套件是否有编译该源码包时所 需要的库,因为一旦缺少某个库,就不能完成编译。只有检测通过后,才会生成 Makefile 文件。
(2) make。使用这个命令,会根据 Makefile文件中预设的参数进行编译,这一步其实就是 gcc在工作 了。
(3) make install。这一步是安装步骤,用于创建相关软件的存放目录和配置文件。
对于以上这 3 个步骤,并不是所有的源码包软件都一样,也就是说,源码包的安装并没有标准的 安装步骤。这就需要你拿到源码包解压后,进入目录,找到相关的帮助文档(通常,会以 INSTALL 或者 README 为文件名)。

二、编译Nginx

1.下载源码包

可以wget 下载也可以自行网上下载用u盘传输

# cd /usr/local/src/ 
# wget http://nginx.org/download/nginx-1.9.9.tar.gz 
在下载之前,我先进入/usr/local/src 目录,这是因为习惯把源码包都放到这个目录下。这样做的好处是方便自己和其他管理员维护。所以,建议你将下载的源码包都统一放到这个目录下,也可自行放置

2.解压源码包

解压源码包 解压.tar.gz 格式的压缩包,这在前面已经介绍过,示例命令如下:

# tar -zxvf nginx-1.9.9.tar.gz

3.配置相关的选项并生成 Makefile

首先,进入解压后的源码目录,在配置之前可以查看可用的配置参数,如下所示

# cd nginx-1.9.9
# ./configure --prefix=/usr/local/nginx

常用的配置选项有–prefix=PREFIX,它的意思是定义软件包的安装路径。
如果你想了解其他配置选项,也可以使用命令./configure --help查看详情。
这里我把Nginx安装在/usr/local/nginx 目录下,该选项的配置为–prefix=/usr/local/nginx。配置过程如下所示

nginx 编译mp4模块 nginx编译报错_nginx


nginx 编译mp4模块 nginx编译报错_nginx_02

4.进行编译

# make -bash: make: 未找到命令 
说明:这是因为我们的系统还未安装 make 命令,安装即可 
# yum install –y make # make

nginx 编译mp4模块 nginx编译报错_运维_03


报错了!

nginx 编译mp4模块 nginx编译报错_nginx_04


分析原因:

是将警告当成了错误处理,打开 nginx的安装目录/objs/Makefile,去掉CFLAGS中的-Werror,再重新make 也可以注释掉

-Wall 表示打开gcc的所有警告
-Werror,它要求gcc将所有的警告当成错误进行处理

发现又有一个错误

nginx 编译mp4模块 nginx编译报错_运维_05

这里提示我们struct crypt_data’没有名为‘current_salt’的成员:cd.current_salt[0] =~salt[0];
最好的办法是换一个版本,因为条件限制,我们就进到源码里把这行直接注释掉好了。

[root@root1 nginx-1.9.9]# vim src/os/unix/ngx_user.c
进去找到第36行 :set nu 显示行数

 28 {
 29     char               *value;
 30     size_t              len;
 31     struct crypt_data   cd;
 32 
 33     cd.initialized = 0;
 34 #ifdef __GLIBC__
 35     /* work around the glibc bug */
 36      /*cd.current_salt[0] = ~salt[0];*/  这一行注释掉
 37 #endif
 38

扩展错误:
openssl版本错误,这个很少遇到

原因:由于默认使用了openssl 1.1.x 版本,导致的API不一致引起
解决方法可以点击 这里

5.安装完配置

当make后没有错误可以通过echo $? 来验证 0成功

[root@root1 nginx-1.9.9]# echo $?
0
安装源码包的命令为 make install,如下所示: 
# make install

nginx 编译mp4模块 nginx编译报错_运维_06

执行完这一步,则会在/usr/local/nginx 目 录下增加很多目录。使用 ls 命令查看该目录,如下所示

nginx 编译mp4模块 nginx编译报错_nginx 编译mp4模块_07


启动nginx

/usr/local/nginx/sbin/nginx

查看nginx进程是否启动成功

ps -ef | grep nginx
root 7451 1 0 11:51 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 7452 7451 0 11:51 ? 00:00:00 nginx: worker process
root 7456 1668 0 11:51 pts/0 00:00:00 grep --color=auto nginx

nginx启动成功后有两个进程,一个主master进程,一个子worker进程。master负责读取配置文件以及对worker维护,worker负责处理请求,使用kill进程时,先杀master主进程,再进程。

两种方式:优雅关闭: kill -QUIT 主pid(当一个请求已经在执行时不会受到影响,但此时已经关闭了,仍会让你把那个请求完成掉) 快速关闭:kill -term 主pid (不管有没有请求,都关闭掉,最后一个请求会中断不可进行)。

当nginx已经启动想要重启时,到sbin下执行 ./nginx -s reload即可。
查看nginx端口是否启动成功

netstat -tunlp|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7451/nginx: master

检查nginx配置是否正确

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t

若想使用外部主机访问nginx,需要关闭服务器防火墙或开放nginx服务端口,端口为nginx.conf的配置端口

比如此时我的ip地址是192.168.92.87,那么我在浏览器中输入ip,就能看到下面这个界面了。如果显示到下面这个界面就证明已经安装成功了。

nginx 编译mp4模块 nginx编译报错_linux_08

到此,Nginx 源码的安装就完成了。其实在日常的源码安装过程中,遇到错误不能完成安装的情 况很多,这些错误通常都是因为缺少某一个库文件。这需要你仔细琢磨报错信息或者查看当前目录下 的 config.log 以得到相关的信息。


总结

希望能帮助到大家