利用Nginx實現tornado的反向代理
阿新 • • 發佈:2019-01-08
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應用了
首先寫一個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應用了