damien.h

如何在Django+Nginx fcgi方式下不间断服务地部署新代码

极品座驾“上线以来,用户访问量一直运行在高位,上周末创下了单日pv 139万的记录。在这样的情况下,保持服务不间断是最重要的事情。目前我们支撑这样访问量的架构,是使用Nginx作为web服务前端,用fcgi方式运行django的python进程,再和前端Nginx连接起来。fcgi模式下,python进程把字节码装入内存,来提供最佳的执行速度。但是这样带来的问题就是更新了python代码以后,服务器没法动态装入新代码,而是需要杀掉现有fcgi进程然后spawn新进程才能达到更新代码的目的。虽然重启django fcgi进程的速度很快,但是不可避免的会导致用户服务的中断,在访问量大的情况下更是很危险的方式。为了达到不中断服务的目的,我们采用了这样的方法:

  1. 更新python代码
  2. 在另一个端口spawn一组新的fcgi进程
  3. 更改Nginx配置,把proxy_pass转发端口指向新fcgi进程的端口
  4. 动态重载Nginx配置
  5. 过一段时间等到原fcgi端口不再有未完成的用户请求,再把原端口上的进程全部杀掉

由于Nginx可以在运行状态下不间断的重载配置改动,所以在重载配置以后所有的访问请求都被转发到新的fcgi端口了。而在用户操作频繁的时候,访问请求从原fcgi端口被转到新端口也只需要很短的时间(可以借助netstat命令来观察)。这样一来,就可以实现在不影响用户操作的情况下不间断的切换到新代码了。

Browse Happy logo

My tweets

2016年十二月
« 八    
 1234
567891011
12131415161718
19202122232425
262728293031  

分类目录

Articles

Fancy Stats