Pulpcode

捕获,搅碎,拼接,吞咽

0%

使用nginx部署tornado

虽然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
#!/usr/bin/env python
# encoding: utf-8

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

你多次访问,就会发现,确实是在负载均衡。