虽然tornado是一个不错的web服务器,但是在真实的生产环境,我们还是会布置多份,而且一般情况下,份数和cpu核数一样。
首先一个重要的原因是单线程的tornado,在遇到同步的堵塞请求时,会使整个服务都停到那里,这样你就无法在处理新的请求,所谓的同步请求,就是类似数据库查询,
或者是磁盘访问块。
nginx
之前在介绍flask的部署方式时,已经提到nginx的好处了,nginx本身是一个更安全,更专业的服务器,而且对静态资源也有更好的支持,在加上机器上还有其它的web服务要管理,那nginx自然是最好的选择了。
基本流程是:客户端通过Internet连接一个反向代理服务器,然后反向代理服务器发送请求到代理后端的Tornado服务器池中的任何一个主机。
准备tornado代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web
from tornado.options import define, options define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler): def get(self): greeting = self.get_argument('greeting', 'Hello') self.write(greeting + ', friendly user!')
if __name__ == "__main__": tornado.options.parse_command_line() app = tornado.web.Application(handlers=[(r"/", IndexHandler)]) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
|
这个时候,你要同时开启四个tornado进程(或者用supervisor):
1 2 3 4
| python server.py -port=9000 python server.py -port=9001 python server.py -port=9002 python server.py -port=9003
|
nginx配置
将此配置放在nginx的vhosts下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| proxy_next_upstream error;
upstream tornadoes { server 127.0.0.1:9000; server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; }
server { listen 9999; server_name localhost;
location /static/ { root /var/www/static; if ($query_string) { expires max; } }
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://tornadoes; } }
|
还有你需要在nginx的主配置(nginx.conf)中,events中,加入use epoll
,还要记得在http中将这个conf文件include进来。
然后,你就可以通过如下命令访问你服务了:
1
| curl http://localhost:9999
|
你多次访问,就会发现,确实是在负载均衡。