我正试图允许具有django的容器管理对使用nginx从另一个容器提供的媒体文件的访问。因此,尽管有nginx文档,但我还是从位置配置中删除了internal
行:
server {
server_name nginx; //name of the container used for accessing from another containers
charset UTF-8;
client_max_body_size 32m;
listen 80;
location /protected/media/ {
// internal;
alias /data/djan,go/media/;
}
}
通过此配置,我可以使用django容器中的/ protected / media url,因此我成功地使用django从容器的外壳中完成了wget http://nginx/protected/media/images/bank_credentials/H0grsrvgsBo.jpg
。
但是django的代码
response = HttpResponse()
del response['Content-Type']
response['X-Accel-Redirect'] = 'http://nginx/protected/media/' + path # I'm sure that this url matches to url I've used succesfully with wget
return response
返回404 这是django的网址:
path('media/<path:path>', media_access, name='media')
我错了吗?
答案 0 :(得分:1)
这听起来像是您要尝试为X-Accel-Redirect
加上外部域/主机的绝对URL,因此需要按照http://nginx.org/r/internal删除internal
无需身份验证即可访问的文件。它不是那样的。
看看http://nginx.org/r/proxy_pass_request_headers提供的示例,例如:
location /x-accel-redirect-here/ {
proxy_method GET;
proxy_pass_request_headers off;
proxy_pass_request_body off;
proxy_pass ...
}
nginx要求必须在X-Accel-Redirect
中使用相对URL是完全合理的;否则,nginx将如何知道如何准确地处理请求?
换句话说,您可能必须在X-Accel-Redirect
中使用相对URL,并且,如果需要转义到另一个容器中,则需要额外的internal
location
指令来进行显式proxy_pass
,视情况而定。
请注意,这样做可能首先使使用X-Accel-Redirect
的全部好处无效,尤其是由于http://nginx.org/r/proxy_buffering默认为on
,这会导致nginx将每个代理文件保存到光盘,因此光盘吞吐量可能很快成为您设置中的限制因素。