5. 多进程部署
多进程部署也有两种方式:一是利用tornado自带的启动多个进程的方式,二是利用Nignx在前面做负载均衡的方式。
tornado自带方式
测试代码如下:
class LongHandler(tornado.web.RequestHandler):
def get(self):
stime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
pid=str(os.getpid())
self.write("<h1>[{}]:{}</h1>".format(stime,pid))
time.sleep(10)
if __name__ == "__main__":
app = tornado.web.Application(([r'/', LongHandler], ))
server = tornado.httpserver.HTTPServer(app)
server.bind(8010)
server.start(num_processes=3)
tornado.ioloop.IOLoop.current().start()
启动上例后,用ps可以看到启动了3个python的epoll进程,同时打开4个浏览页,可以看到3个浏览页在10秒之后返回,1个页面20秒返回,进程id显示也是3个。
这种方式下,多进程是由程序启动时自动产生的,如果需要不停服务进行系统更新,就几乎不可能了。
Nginx负载均衡方式
采用Nginx做前端的负载均衡,tornadohttp server就更简单了,实际上,它完全不知道Nginx的存在,但建议采用xheaders=True作为HTTPServer的启动参数,便于得到真正客户端的IP。这种方式也可跨机器部署。
官网上有比较完整的Nginx配置文件示例,以下是主要内容:
upstream frontends {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001 weight=2;
server 127.0.0.1:8002 weight=1;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://frontends;
}
这个配置中,Nginx将到达的http请求转发到本地的8000,8001,8002三个端口,也就是有三个Web Server分别侦听这三个端口,Nginx转发的概率(权值)分别为3,2,1。
Redis全局参数缓存
无论上面哪种方式部署,各进程间的信息(全局变量)共享都需要通过第三方来完成,此时就需要部署redis或memcached(鉴于memca