Python中在良心云上部署nginx + uwsgi + django时,首页正常但admin管理后台404,是哪里配置出错了吗?

我在nginx中的配置如下:

server {
    listen 80 default_server;
    listen 118.24.***.*** default_server;
    location / {
        try_files $uri $uri/ =404;
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
    }
    location /static {
        alias /root/test1/test2/static/;
    }

我的uwsgi.ini的配置如下:

[uwsgi]
socket=0.0.0.0:8000
#http=:8000
chdir=/root/test1
wsgi-file=test1/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log

Python中在良心云上部署nginx + uwsgi + django时,首页正常但admin管理后台404,是哪里配置出错了吗?

14 回复

把 try_files 那行删掉试试


这个问题很典型,通常是uWSGI的静态文件路径没配好,Django的admin后台依赖静态文件(CSS、JS)。

核心问题是:uWSGI进程没权限或者没找到Django的静态文件,导致admin页面引用的/static/admin/ 这些资源404,页面就崩了。

关键检查点就两个:

  1. Django的静态文件收集了吗? 在部署服务器上,确保你已经运行了收集命令,并且STATIC_ROOT设置正确。

    python manage.py collectstatic
    

    这会把admin的静态文件从Python包复制到你指定的STATIC_ROOT目录(比如/var/www/myproject/static/)。

  2. Nginx配置里代理静态文件了吗? 你的Nginx配置里必须有专门处理/static//media/路径的location块,直接由Nginx提供文件,而不是转发给uWSGI。检查你的nginx site配置,必须有类似下面的部分:

    server {
        listen 80;
        server_name your_domain.com;
    
        location /static/ {
            alias /var/www/myproject/static/; # 这里必须和你的STATIC_ROOT完全一致
            expires 30d;
        }
    
        location /media/ {
            alias /var/www/myproject/media/;
        }
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/path/to/your/mysocket.sock; # 或者 127.0.0.1:8000
        }
    }
    

    重点alias后面的路径必须以/结尾,且必须和collectstatic的目录完全一致

快速诊断步骤:

  1. 直接浏览器访问 http://your-server/static/admin/css/base.css。如果也404,那就100%是上面说的静态文件问题。
  2. 如果这个CSS文件能访问,但admin页面还是404,那可能是Django的urls.py没包含admin路径,或者uWSGI进程权限问题(比如无法读取app目录)。不过从“首页正常”来看,这种情况较少。

一句话总结: 九成是Nginx没配好静态文件代理,或者collectstatic没做。

良心云是什么云平台?

腾讯云,良心云

谢谢,的确可以了,不过有个疑问,我把静态文件放在上面所写的目录下,访问 admin 时,js 和 css 会抱 403 错误,我只有在把文件放在 var/www/static 目录下后,更改 nginx 配置,才能成功访问

你再服务器上面有收集静态文件吗?使用 collectstaic 命令?

有收集静态文件,/root/test1/test2/static/这个项目目录下新建的文件,然后静态文件都收集到这里了,然后配置按照上面的配置,css 和 js 请求会出现 403,然后我把收集到的静态文件复制了一份到 /var/www/static/目录下,nginx 配置中修改为
<br>location /static {<br> #alias /root/test1/test2/static/;<br> alias /var/www/static/;<br> }<br>
这样才正常了

这个 alias /root/test1/test2/static/改成 alias /root/test1/test2 试试

test2 已经设置了 777 权限了,不知道是不是你说的 nginx 的权限?

应该是权限的问题,要确保 nginx 有权限访问那个目录的文件

再看看 static 和 static 里面文件的权限

额,把里面的子文件权限都调到 777 可以了,有个疑问 var/www/下的为何权限不够也可以??

一般确保执行 collectstatic 操作的用户和 nginx 的运行用户在一个组里,然后设置该组有读取 static 的权限。权限问题很麻烦,我也记不住,只能出问题的时候去看看相关用户和目录文件的设置。

谢谢,受教了

回到顶部