"UnicodeDecodeError: 'ascii' codec can't decode byte"
迁移了一个Django项目的Docker容器,发现运行存在问题,所以重建了virtualenv
环境。多个Django项目中,其中有一个Django运行出现异常:
这个问题看上去像是客户端请求中包含了Unicode字符,但是服务器端恢复virtualenv
环境没有支持?
google了一些文档,发现很多都指向了http请求中出现https,原因和nginx反向uwsgi_pass
给Django有关,似乎是客户端试图以https
访问http
导致的问题。 - 参考 strange UnicodeDecodeError on django
检查了nginx配置:
HAProxy
然而,在检查访问链路的时候,发现了一些和线上不同的区别:
虽然nginx配置和线上相似,但是线上环境是直接访问 nginx 反向代理到后端
uwsgi
运行的8080
端口线下开发环境是自己搭建的Docker环境,但是为了模拟复杂的网络环境,并且能够运行不同的测试环境,我采用了Docker来运行测试机,而且将Docker所在的主机放置在一台运行了HAProxy的主机(
gw-1
)之后再连接到局域网:模拟前端有防火墙的Internet服务,在
gw-1
上启用了Ubuntu UFW(使用ufw配置NAT masquerade)gw-1
上使用HAProxy反向代理到svr-1
上运行的Docker容器映射端口
Haproxy Charset 似乎说明HAProxy实际上默认使用UTF-8作为文本存储和渲染。
暂时停止gw-1
上HAProxy,然后暂时使用ufw端口映射来替代这个反向代理。编辑/etc/ufw/before.rules
添加到
但是发现使用ufw直接转发HTTP访问(没有使用HAProxy)依然出现同样的报错信息。看来,不是HAProxy代理的原因。
暂时绕开
由于不经过nginx反向代理,直接访问Django 8080端口是可以正常工作,所以修改docker,重建端口映射,直接将Docker 8001端口映射给Django 8001端口来运行应用。
然后在防火墙gw-1
上修改映射
暂时绕过nginx反向代理到Django端口运行到问题,采用直接访问Django 8080端口来测试。
Last updated