您的位置:首页 > 运维架构 > 反向代理

利用Nginx实现tornado的反向代理

2015-08-21 16:51 471 查看
1.tornado的demo

首先写一个tornado的demo

在生产环境中,一般使用单个的进程启动,为了简单起见,这里我们使用multiprocessing模块启动多个进程,模拟生产环境

#!/usr/bin/python

#-*-encodeing:utf-8-*-

import tornado.web

import tornado.ioloop

import tornado.options

import multiprocessing

from tornado.options import define,options

import os,sys

define("port", default=9000, help="run on the given port", type=int)

class BaseHandler(tornado.web.RequestHandler):

def get_current_user(self):

return self.get_secure_cookie('user')

def get_template_path(self):

return os.path.join(os.path.dirname(__file__),'templates')

class MainHandler(BaseHandler):

@tornado.web.asynchronous

@tornado.web.authenticated

def get(self):

name=tornado.escape.xhtml_escape(self.current_user)

self.write('Hello'+self.current_user)

self.finish()

class LoginHandler(BaseHandler):

def lower(self,string):

return string.lower()

def get(self):

self.write('''

<html>

<head><title>MyDemo</title></head>

<body>

<form action='/login' method='post'>

Username:<input type='text' name='username'/>

Password:<input type='password' name='password'/>

<input type='submit' value='Submit'/>

</form>

</body>

</html>

'''),

def post(self):

if not self.request.headers.get('Cookie'):

self.write('Please enable your Cookie option of your broswer.')

return

self.set_secure_cookie('user',self.get_argument('username'),expires_days=1)

self.redirect('/')

settings={

'static_path':os.path.join(os.path.dirname(__file__),'static'),

'cookie_secret':'F/hsxF7kTIWGO1F6HrH78Rf4bMRe5EyFhjtReh6x+/E=',

'login_url':'/login',

'debug':True,

}

app=tornado.web.Application([

(r'/',MainHandler),

(r'/login',LoginHandler),

],**settings)

if __name__ == '__main__':

tornado.options.parse_command_line()

def run(mid,port):

print "Process %d start" % mid

sys.stdout.flush()

app.listen(port)

tornado.ioloop.IOLoop.instance().start()

jobs=list()

for mid,port in enumerate(range(9010,9014)):

p=multiprocessing.Process(target=run,args=(mid,port))

jobs.append(p)

p.start()

运行后,会启动4个进程



2.配置nginx的反向代理

安装好nginx后

进入nginx的配置目录:

# cd /usr/local/nginx/conf

备份原配置文件

# mv nginx.conf nginx.conf.bak

使用编辑器打开nginx.conf

user www www;

worker_processes 8;

error_log logs/error.log info;

pid logs/nginx.pid;

worker_rlimit_nofile 51200;

events

{

use epoll;

worker_connections 51200;

}

http

{

# Enumerate all the Tornado servers here

upstream frontends {

server 127.0.0.1:9010;

server 127.0.0.1:9011;

server 127.0.0.1:9012;

server 127.0.0.1:9013;

}

include mime.types;

default_type application/octet-stream;

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 1000m;

limit_conn_zone $binary_remote_addr zone=perip:256k;

limit_conn_log_level notice;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

sendfile on;

tcp_nopush on;

keepalive_timeout 65;

tcp_nodelay on;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

# Only retry if there was a communication error, not a timeout

# on the Tornado server (to avoid propagating "queries of death"

# to all frontends)

proxy_next_upstream error;

server {

listen 80;

#server_name localhost;

root /opt/nginx/html;

#charset koi8-r;

#access_log logs/host.access.log main;

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;
}

# error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

重启nginx

/etc/init.d/nginx_init reload



在浏览器中打开服务器ip的80端口就可以访问tornado的demo应用了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: