nginxtotengine

Tengine 是淘宝在 Nginx 基础上开发的一个衍生版。官方的简介说针对大访问量网站的需求,添加了很多高级功能和特性,并且已经在淘宝网、天猫商城等大型网站的生产环境下稳定运行。具体可以访问其官网。开始进入主题,Nginx 如何不重启平滑升级过渡到 Tengine。

1、先查看原来 Nginx 的编译参数。

Shell
1
2
3
4
5
$ path-to-nginx/sbin/nginx -V
nginx version: nginx/0.8.54
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
TLS SNI support disabled
configure arguments: –prefix=path-to-nginx –user=www –group=www –with-http_stub_status_module –with-http_ssl_module

2、编译 Tengine,我习惯修改下显示的版本号,修改源码中的 src/core/nginx.h 文件:

1
2
3
#define tengine_version    1003000
#define TENGINE_VERSION    “1.3.0”
#define TENGINE_VER        “Tengine/unknown”

行3,修改这里的版本号

接着修改 auto/cc/gcc 文件,禁用编译 debug 能减少编译后的容量。

1
2
3
4
5
# stop on warning
CFLAGS=”$CFLAGS -Werror”
# debug
#CFLAGS=”$CFLAGS -g”

行5,注释掉这行

然后编译,依据之前查到的“前任”的参数,再适当添加模块,http_stub_status_module 取得运行状态的模块,http_gzip_static_module 防止重复压缩的模块,http_ssl_module 支持 SSL 的模块。

Shell
1
2
3
4
5
6
7
$ ./configure –prefix=path-to-nginx \
–user=www \
–group=www \
–with-http_stub_status_module \
–with-http_ssl_module \
–with-http_gzip_static_module
$ make

这里注意只需要 make 而不需要 make install 。

3、去源码目录 objs 下找到 nginx 文件,覆盖原来 nginx 的安装路径,建议先做好备份再覆盖。

4、先测试下配置文件是否正常。

Shell
1
2
3
$ path-to-nginx/sbin/nginx -t
the configuration file path-to-nginx/conf/nginx.conf syntax is ok
configuration file path-to-nginx/conf/nginx.conf test is successful

5、进行不重启平滑升级,先发送平滑升级的信号

1
kill -USR2 $(cat path-to-nginx/logs/nginx.pid)

此时主进程的 pid 文件会改名为 .pid.oldbin ,并启动新的主进程和工作进程,查询进程

1
ps -ef | grep [n]ginx

会发现同时存在2主进程和多个工作进程,即新老版本同时工作,此时对旧版本发送从容关闭工作进程的信号。

1
kill -WINCH $(cat path-to-nginx/logs/nginx.pid.oldbin)

6、旧版本在处理完手头上的工作就会慢慢“退休”,此时再次查询进程会发现旧版本只有1个主进程存在了,最后发送从容关闭的信号给他。

1
kill -QUIT $(cat path-to-nginx/logs/nginx.pid.oldbin)

7、完成,可以用 curl -I 目标 来查看头部验证是否升级成功。