前言
编译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。配置过程如下所示
4.进行编译
# make -bash: make: 未找到命令
说明:这是因为我们的系统还未安装 make 命令,安装即可
# yum install –y make # make
报错了!
分析原因:
是将警告当成了错误处理,打开 nginx的安装目录/objs/Makefile,去掉CFLAGS中的-Werror,再重新make 也可以注释掉
-Wall 表示打开gcc的所有警告
-Werror,它要求gcc将所有的警告当成错误进行处理
发现又有一个错误
这里提示我们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
执行完这一步,则会在/usr/local/nginx 目 录下增加很多目录。使用 ls 命令查看该目录,如下所示
启动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 源码的安装就完成了。其实在日常的源码安装过程中,遇到错误不能完成安装的情 况很多,这些错误通常都是因为缺少某一个库文件。这需要你仔细琢磨报错信息或者查看当前目录下 的 config.log 以得到相关的信息。
总结
希望能帮助到大家