在开发公司CMDB过程中,前端使用augular4,后端使用django+restframework。
前端angular代码打包直接通过nginx静态资源访问的方式提供服务,后端api通过apache2的wsgi方式启动,通过nginx代理解决跨域向前端提供服务。
在本机开发的时候就很简单,nginx同时转发angular启动的web服务,django启动的api服务,api访问也很正常。
搭建集成测试环境时,后端使用virtualenv打包,通过apache2 conf启动,相关配置如下:
nginx:
root /usr/share/cmdb/web
location /api {
proxy_pass http://127.0.0.1:8000;
}
location /docs {
proxy_pass http://127.0.0.1:8000;
}
location /static {
proxy_pass http://127.0.0.1:8000;
}
apache2
<VirtualHost *:8000>
WSGIScriptAlias / /usr/share/cmdb/venv/cmdb-api/cmdb/wsgi.py
WSGIDaemonProcess cmdb python-path=/usr/share/cmdb/venv/lib/python2.7/site-packages
WSGIProcessGroup cmdb
WSGIApplicationGroup %{GLOBAL}
Alias /static/ /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/
<Directory /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/>
Require all granted
</Directory>
</VirtualHost>
api调用是需要登录后在header中加入Authorization,但搭建好的测试环境除了登录api能调用外,其余的api全部报401,提示信息为"invalid token header"。
通过print打印发现传入的Authorization值为空。
开始怀疑nginx没有将Authorization头转发,通过postman直接请求api,报相同的问题。
排除nginx问题,又怀疑是virtualenv依赖不全导致的,然后停掉apache2,激活virtualenv时通过python manager.py runserver调用api,发现没有问题。
最终剩下apache2的问题,这时候看了openstack keystone的配置,发现有个WSGIPassAuthorization On,看着很像。
在conf中加上此配置,Authorization请求头顺利转发。api调用正常。
最终的apache配置如下
<VirtualHost *:8000>
WSGIScriptAlias / /usr/share/cmdb/venv/cmdb-api/cmdb/wsgi.py
WSGIDaemonProcess cmdb python-path=/usr/share/cmdb/venv/lib/python2.7/site-packages
WSGIProcessGroup cmdb
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
Alias /static/ /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/
<Directory /usr/share/cmdb/venv/lib/python2.7/site-packages/rest_framework/static/>
Require all granted
</Directory>
</VirtualHost>