最为简单的按照,就是全部使用默认选项
./configure
make
make install
1、configure
configure
脚本检测操作系统内核和已经安装的软件, 参数的解析(option
), 中间目录的生成(init
)以及根据各种参数生成一些C源码文件、 Makefile
文件等。
make
命令根据configure
命令生成的Makefile
文件编译Nginx工程, 并生成目标文件、 最终的二进制文件。
make install
命令根据configure
执行时的参数将Nginx部署到指定的安装目录, 包括相关目录的建立和二进制文件、 配置文件的复制。
#!/bin/sh
#这是一个shell脚本执行程序
#Copyright (C) Igor Sysoev
#Copyright (C) Nginx, Inc.
LC_ALL=C
export LC_ALL
#依次调用auto目录下面的option、init、sources脚本来处理,利用对应的变量名标志。
#处理用户输入
. auto/options
#初始化相关的shell变量,例如生成makefile的路径,特性测试c文件的路径。
. auto/init
#生成Makefile里面的依赖项
. auto/sources
#目录不存在则生成目录obj。
test -d $NGX_OBJS || mkdir $NGX_OBJS
echo > $NGX_AUTO_HEADERS_H
echo > $NGX_AUTOCONF_ERR
#将用户定义的配置选项存起来。
#在NGX_CONFIGURE="$opt"
echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H
#NGX_DEBUG是在auto/options文件中处理的,如果有--with-debug选项,则其值是YES
if [ $NGX_DEBUG = YES ]; then
#当有debug选项时,将NGX_DEBUG宏写入ngx_auto_config.h
have=NGX_DEBUG . auto/have
fi
#在opition中没有赋值平台属性,则默认是Linux,通过uname获取属性
#本机上面NGX_PLATFORM = "Linux 4.4.0-119-generic x86_64"
if test -z "$NGX_PLATFORM"; then
echo "checking for OS"
NGX_SYSTEM=`uname -s 2>/dev/null`
NGX_RELEASE=`uname -r 2>/dev/null`
NGX_MACHINE=`uname -m 2>/dev/null`
echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"
NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";
case "$NGX_SYSTEM" in
MINGW32_*)
NGX_PLATFORM=win32
;;
esac
else
echo "building for $NGX_PLATFORM"
NGX_SYSTEM=$NGX_PLATFORM
fi
######configure会依次调用其它几个文件,来进行环境的检测,包括编译器、操作系统相关。
# 编译器选项
. auto/cc/conf
#将支持的头文件通过宏定义声明
if [ "$NGX_PLATFORM" != win32 ]; then
. auto/headers
fi
# 操作系统相关的配置的检测
. auto/os/conf
if [ "$NGX_PLATFORM" != win32 ]; then
# unix体系下的通用配置检测
. auto/unix
fi
. auto/modules
. auto/lib/conf
case ".$NGX_PREFIX" in
.)
NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx}
have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
;;
.!)
NGX_PREFIX=
;;
*)
have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
;;
esac
if [ ".$NGX_CONF_PREFIX" != "." ]; then
have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define
fi
have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define
have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define
have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define
have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define
have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define
have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define
have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""
. auto/define
have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\""
. auto/define
have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\""
. auto/define
have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\""
. auto/define
have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\""
. auto/define
# 生成objs/makefile文件
. auto/make
# 生成关于库的编译选项到makefile文件
. auto/lib/make
# 生成与安装相关的makefile文件内容,并生成最外层的makefile文件
. auto/install
# STUB
. auto/stubs
have=NGX_USER value="\"$NGX_USER\"" . auto/define
have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define
# 编译的最后阶段,汇总信息
. auto/summary
2、configure参数解释
详情请参考深入理解Nignx模块开发与结构解析。
3、运行configure过后生成的文件
- src目录用于存放编译时产生的目标文件。
Makefile
文件用于编译Nginx工程以及在加入install参数后安装Nginx。autoconf.err
保存configure
执行过程中产生的结果,系统特性检测结果都保存在这里。ngx_auto_headers.h
和ngx_auto_config.h
保存了一些宏, 这两个头文件会被src/core/ngx_config.h
和src/core/ngx_headers.h
使用。ngx_modules.c
是一个关键文件, 我们需要看看它的内部结构。后续继续分析。
4、Nignx命令行控制
在Linux中, 需要使用命令行来控制Nginx服务器的启动与停止、 重载配置文件、 回滚日志文件、 平滑升级等行为。 默认情况下, Nginx被安装在目录usr/local/nginx/
中, 其二进制文件路径为usr/local/nginc/sbin/nginx
, 配置文件路径为usr/local/nginx/conf/nginx.conf
。 当然, 在configure
执行时是可以指定把它们安装在不同目录的。 为了简单起见, 只说明默认安装情况下的命令行的使用情况, 如果安装的目录发生了变化, 那么替换一下即可。
1、默认启动及配置参数
输入脚本执行/usr/local/nginx/sbin/nginx
程序会读取默认路径下的配置文件/usr/local/nginx/sbin/nginx.conf
。在configure
脚本指向期间,可以通过--conf-path=*
参数,指定nginx.conf
的路径。另外也可以通过/usr/local/nginx/sbin/nginx -c temp_nginx.conf
指定配置文件。-c
参数用于指定配置参数。
2、不启动Nignx测试配置参数
/usr/local/nginx/sbin/nginx -t
可以测试配置文件是否有问题。
3、Nignx版本信息
`/usr/local/nginx/sbin/nginx -v
4、快速地停止服务
使用-s stop
可以强制停止Nginx服务。 -s参数其实是告诉Nginx程序向正在运行的Nginx服务发送信号量, Nginx程序通过nginx.pid
文件中得到master进程的进程ID, 再向运行中的master进程发送TERM信号来快速地关闭Nginx服务。
/usr/local/nginx/sbin/nginx -s stop
实际上, 如果通过kill命令直接向nginx master进程发送TERM
或者INT
信号,效果是一样的。
4、从容地退出服务
如果希望Nginx服务可以正常地处理完当前所有请求再停止服务, 那么可以使用-s quit
参数来停止服务。当选择快速停止服务时, worker进程与master进程在收到信号后会立刻跳出循环,退出进程。而从容地退出服务时,首先会关闭监听端口,
停止接收新的连接, 然后把当前正在处理的连接全部处理完,最后再退出进程。直接发送QUIT
信号给master进程来停止服务, 其效果与执行-s quit
命令是一样的。
/usr/local/nginx/sbin/nginx -s quit
5、运行中的Nginx重读配置项并生效
Nginx会先检查新的配置项是否有误,如果全部正确就以“优雅”的方式关闭,再重新启动Nginx来实现这个目的。类似的, -s是发送信号, 仍然可以用kill命令发送HUP
信号来达到相同的效果。
/usr/local/nginx/sbin/nginx -s reload
6、日志回滚
使用-s reopen
参数可以重新打开日志文件, 这样可以先把当前日志文件改名或转移到其他目录中进行备份, 再重新打开时就会生成新的日志文件。 这个功能使得日志文件不至于过大。使用kill命令发送USR1
信号也可以实现相同效果。
/usr/local/nginx/sbin/nginx -s reopen
7、平滑升级Nignx
当Nginx服务升级到新的版本时,必须要将旧的二进制文件Nginx替换掉,通常情况下这是需要重启服务的,但Nginx支持不重启服务来完成新版本的平滑升级。
1)通知正在运行的旧版本Nginx准备升级。通过向master进程发送USR2
信号可达到目的。这时,运行中的Nginx会将pid文件重命名, 如将/usr/local/nginx/logs/nginx.pid
重命名为/usr/local/nginx/logs/nginx.pid.oldbin
,这样新的Nginx才有可能启动成功。
2)启动新版本的Nginx, 可以使用以上介绍过的任意一种启动方法。 这时通过ps命令可以发现新旧版本的Ngin
x在同时运行。
3)通过kill命令向旧版本的master进程发送SIGQUIT
信号,以“优雅”的方式关闭旧版本的Nginx。随后将只有新版本的Nginx服务运行,此时平滑升级完毕。
8、显示帮助
使用-h或-?
参数显示Nginx支持的所有命令行参数。