Kate Li (Taiwan)的部落格

首頁

github

作者 lace 時間 2020-03-18
all

因為一個奇怪的需求,使用Python和Tornado框架實現了一個Web網站的反向代理。實現的功能是這樣:

怎麼通過一個公共的網站反向代理訪問後端的多個網站,當時的討論帖在這裡,我採用的是:

.site. backend_site .site = backend_site .site = backend_site1 backend_site1

環境需求

Python 2.7Tornado 4.0

所代理的後端網站注意事項

url的首碼不應出現/.site.由於反向代理採用url首碼來區分後端網站,如/.site.example/,表示後端網站example。例如以下為禁用的url:/.site.//.site.example//.site.example/user/login/

cookies中不應出現以.site命名的cookie值,這個cookie是用來標識當前訪問的後端網站

CentOS 7.0部署

Tornado的部署可以參照這裡的教程。通過啟動多個Tornado實例,來避免調用到同步函數塊,導致阻塞住,無法響應其他用戶的請求。使用supervisor來啟動Tornado Server,並使用Nginx作為Web服務器,反向代理後端的這些Tornado實例。

修改設定檔settings.py

使用supervisor啟動Tornado Server

設定設定檔

vim /etc/supervisord.conf

輸入如下資訊

[program:tornado_server_9001] command=python /home/python/web_proxy/proxy.py --port=9001 directory=/home/python/web_proxy autorestart=true redirect_stderr=true stdout_logfile = /var/log/supervisord/web_proxy.log [program:tornado_server_9002] command=python /home/python/web_proxy/proxy.py --port=9002 directory=/home/python/web_proxy autorestart=true redirect_stderr=true stdout_logfile = /var/log/supervisord/web_proxy.log [program:tornado_server_9003] command=python /home/python/web_proxy/proxy.py --port=9003 directory=/home/python/web_proxy autorestart=true redirect_stderr=true stdout_logfile = /var/log/supervisord/web_proxy.log supervisorctl reload

重新啟動所有程式

sudo supervisorctl restart all

配寘nginx

添加nginx設定檔

vim /etc/nginx/conf.d/web_proxy.conf upstream tornadoes { server 127.0.0.1:9001; server 127.0.0.1:9002; server 127.0.0.1:9003; } server { listen 9000; server_name your_server_name; # 例如输入服务器IP gzip on; # 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。 gzip_min_length 1000; gzip_buffers 4 16k; gzip_http_version 1.1; # 1~9,默认为1,数值越大,压缩率越高,CPU占用越多,时间越久 gzip_comp_level 3; gzip_vary on; # 禁用对 IE 6 使用 gzip 压缩 gzip_disable "MSIE [1-6]\."; gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json; ## Individual nginx logs access_log /var/log/nginx/web_proxy_access.log; error_log /var/log/nginx/web_proxy_error.log; 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

service nginx restart