gpt4 book ai didi

django - 无法使 nginx 内部重定向工作

转载 作者:行者123 更新时间:2023-12-01 11:29:36 24 4
gpt4 key购买 nike

我正在使用 ubuntu 14.04 并运行 nginx 1.4.6 作为反向代理服务器来与我在 uwsgi 上运行的 django 后端通信。我无法使内部重定向工作,也就是说,请求根本没有到达 django。这是我的 nginx 配置 /etc/nginx/site-enabled/default文件。请让我知道我的配置有什么问题。

server {
listen 8080;
listen 8443 default_server ssl;
server_name localhost;
client_max_body_size 50M;
access_log /var/log/nginx/nf.access.log;
error_log /var/log/nginx/nf.error_log debug;
ssl_certificate /etc/ssl/nf/nf.crt;
ssl_certificate_key /etc/ssl/nf/nf.key;
location / {
proxy_pass http://localhost:8000;
}
location /static/ {
root /home/northfacing;
}
location /media/ {
internal;
root /home/northfacing;
}
}

添加我的 uwsgi 配置。
[uwsgi]
chdir=/home/northfacing/reia
module=reia.wsgi:application
master=True
pidfile=/home/northfacing/reia/reia-uwsgi.pid
vacuum=True
max-requests=5000
daemonize=/home/northfacing/reia/log/reia-uwsgi.log
http = 127.0.0.1:8000

添加我的 uwsgi 启动脚本
#!/bin/bash
USER="northfacing"
PIDFILE="/home/northfacing/reia/reia-uwsgi.pid"

function start(){
su - ${USER} /bin/sh -c "source /home/northfacing/nfenv/bin/activate && exec uwsgi --pidfile=${PIDFILE} --master --ini /etc/init.d/reia-uwsgi.ini"
}

function stop(){
kill -9 `cat ${PIDFILE}`
}

$1

/home/northlooking/nfenv 是我的 python 环境目录。

最佳答案

如果您希望 django 处理访问媒体文件的权限,首先要做的是将所有请求传递给 django。我假设 /home/northfacing是您的项目根目录(默认情况下将放置 manage.py 的目录),您的静态文件被收集到 public/static项目中的子目录和媒体文件存储在 public/media .

基于这些假设,这里是该行为的基本配置:

server {

listen 8080;
server_name localhost;

client_max_body_size 50M;

access_log /var/log/nginx/nf.access.log;
error_log /var/log/nginx/nf.error_log debug;
ssl_certificate /etc/ssl/nf/nf.crt;
ssl_certificate_key /etc/ssl/nf/nf.key;

root /home/northfacing/public/;

location @default {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
include /etc/nginx/proxy_params;

proxy_pass softwaremind_server;
break;
}

location /static/ {
try_files $uri @default; # just some simple default action, so you can show django's 404 page instead of nginx default
}

location /media/ {
internal;
error_page 401 403 404 = @default;
}

location / {
try_files /maintenance.html @default; # you can disable whole page with simple message simply by creating maintenance.html with that message
}
}

简单说明:所有对 /media/中的url的请求被视为内部,因此如果直接输入,nginx 将提供 404、401 或 403 错误。但是在那个位置,我们的代理服务器(在那种情况下是 django)被设置为处理程序,因此它会收到请求并能够检查用户是否具有访问权限。

如果没有访问权限,django 可以抛出它自己的错误。如果访问权限被授予,django 应该返回一个空响应 X-Accel-Redirect设置为文件路径。简单的 View 看起来像这样:
class MediaView(View):

def get(self, request):

if not request.user.is_authenticated():
raise Http404

response = HttpResponse()
response.status_code = 200
response['X-Accel-Redirect'] = request.path

# all this headers are cleared-out, so nginx can serve it's own, based on served file
del response['Content-Type']
del response['Content-Disposition']
del response['Accept-Ranges']
del response['Set-Cookie']
del response['Cache-Control']
del response['Expires']
return response

而在 urls.py :
    url(r'^media/', MediaView.as_view(), name="media")

关于django - 无法使 nginx 内部重定向工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33824643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com