上一篇文章了用twisted的WSGI容器发flask应用,用python开发web服务总有些担心,最典型的是头部可信问题,官方建议是使用Nginx代理,也就是用Nginx代理twisted的服务。在Nginx代理后面使用twisted运行WSGI应用,必须重写一些头部变量,经常会出现问题的有两个变量REMOTE_ADDR 和 HTTP_HOST。设置如下
server {
listen 80;
server_name _;
access_log log/access.log;
error_log log/error.log;
location / {
#WSGI应用地址
proxy_pass http://127.0.0.1:8000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
注意:
- httpd无法提供头部信息,可以调用 X-Forwarded-Host 定义的主机和 X-Forwarded-For 定义的远程地址。官方给的例子是:
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
3.不使用Nginx代理情况下使用twisted有安全问题的,它会盲目信任恶意客户端发来的头部。
官方给的例子是:
class CustomProxyFix(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
host = environ.get('HTTP_X_FHOST', '')
if host:
environ['HTTP_HOST'] = host
return self.app(environ, start_response)
app.wsgi_app = CustomProxyFix(app.wsgi_app)
我使用的是OpenResty,关于OpenResty和Nginx的这里就不介绍了,总之是中国大牛做的东西必须支持,中文文档比较多,还可以用lua进行扩展。openresty链接
Openresty版的目录如下
配置Nginx.conf文件
除了上面提到代理设置还要考虑以下几点
- 代理配置
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
- gzip 压缩设置
gzip on;
gzip_min_length 5k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
#根据需要设置
gzip_types text/plain application/x-javascript text/css application/xml application/json image/jpeg image/gif image/png;
gzip_vary on;
- 缓存设置
缓存时间可以设置为秒(m),小时(h),天(d)等
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path temps;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,5小时没有被访问的内容自动清除,硬盘缓存空间大小为10GB。
proxy_cache_path temps levels=1:2 keys_zone=cache_one:200m inactive=4h max_size=10g;
- 清除缓存设置
#用于清除缓存,/clear/就可以清除该URL的缓存!
location ~ /clear(/.*)
{
#设置允许清除URL缓存的IP。
allow 127.0.0.1;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
location /nstatus{
check_status;
access_log off;
}