Pages

Thursday, 3 January 2013

Nginx 平滑升级到 Tengine

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

1、先查看原来 Nginx 的编译参数。
$ 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
   
$ 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 文件:
#define tengine_version 1003000 #define TENGINE_VERSION "1.3.0" #define TENGINE_VER "Tengine/unknown"
   
#define tengine_version    1003000
#define TENGINE_VERSION    "1.3.0"
#define TENGINE_VER        "Tengine/unknown"

行3,修改这里的版本号

接着修改 auto/cc/gcc 文件,禁用编译 debug 能减少编译后的容量。
# stop on warning CFLAGS="$CFLAGS -Werror" # debug #CFLAGS="$CFLAGS -g"
   
# stop on warning
CFLAGS="$CFLAGS -Werror"

# debug
#CFLAGS="$CFLAGS -g"

行5,注释掉这行

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

$ ./configure --prefix=path-to-nginx \ --user=www \ --group=www \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_gzip_static_module $ make
   
$ ./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、先测试下配置文件是否正常。
$ 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
   
$ 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、进行不重启平滑升级,先发送平滑升级的信号
kill -USR2 $(cat path-to-nginx/logs/nginx.pid)

此时主进程的 pid 文件会改名为 .pid.oldbin ,并启动新的主进程和工作进程,查询进程
ps -ef | grep [n]ginx

会发现同时存在2主进程和多个工作进程,即新老版本同时工作,此时对旧版本发送从容关闭工作进程的信号。
kill -WINCH $(cat path-to-nginx/logs/nginx.pid.oldbin)


6、旧版本在处理完手头上的工作就会慢慢“退休”,此时再次查询进程会发现旧版本只有1个主进程存在了,最后发送从容关闭的信号给他。
kill -QUIT $(cat path-to-nginx/logs/nginx.pid.oldbin)

7、完成,可以用 curl -I 目标 来查看头部验证是否升级成功.
----------------------------------------------------------------------
 完美适用于LNMP平滑升级Tengine最新版的方法

关于 Tengine,介绍就不必多说,这个是阿里的一项开源 Web 服务器项目。针对大访问量的网站和性能都有比较好的优化,当然、这是基于 Nginx 的!
一、安装/编译,这个方法适合军哥的 LNMP 和 AMH,不多说、给你一坨代码执行即可:
1 wget -c http://tengine.taobao.org/download/tengine-1.4.6.tar.gz && tar zxvf tengine-1.4.6.tar.gz && cd tengine-1.4.6/ && ./configure && make && mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old && cp -r objs/nginx /usr/local/nginx/sbin/nginx && vi /usr/local/nginx/conf/nginx.conf

二、删除配置,上面后面会有专门讲解,你在这段代码过后就会进入编辑器、输入“ i ”,找出如下: 1 location /status { 2 stub_status on; 3 access_log off; 4 } 三、查看状态,找到上面代码之后果断删除,找不到就看看 Nginx 是否正常: 1 /usr/local/nginx/sbin/nginx -t 如果有“ Successful ”结尾那就是没问题,最后收尾就好了! 收尾工作:停止 Nginx 并重启然后查看目前版本: 1 kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` && kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin` && /etc/init.d/nginx restart && /usr/local/nginx/sbin/nginx -v 如果你看到了 Tengine/1.4.6 的话那就是成功升级了! 如果没问题、就可以开始正常使用了!

我就不上那么多图了,看起来命令很多、事实上一下就执行完了!