在开发公司CMDB过程当中,前端使用augular4,后端使用django+restframework。前端
前端angular代码打包直接经过nginx静态资源访问的方式提供服务,后端api经过apache2的wsgi方式启动,经过nginx代理解决跨域向前端提供服务。python
在本机开发的时候就很简单,nginx同时转发angular启动的web服务,django启动的api服务,api访问也很正常。nginx
搭建集成测试环境时,后端使用virtualenv打包,经过apache2 conf启动,相关配置以下:web
nginx:apache
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; }
apache2django
<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值为空。api
开始怀疑nginx没有将Authorization头转发,经过postman直接请求api,报相同的问题。跨域
排除nginx问题,又怀疑是virtualenv依赖不全致使的,而后停掉apache2,激活virtualenv时经过python manager.py runserver调用api,发现没有问题。python2.7
最终剩下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>