Lucky0604
V2EX  ›  问与答

Django, uWsgi, nginx 部署,缺失静态文件

  •  
  •   Lucky0604 · Jun 16, 2016 · 2752 views
    This topic created in 3708 days ago, the information mentioned may be changed or developed.

    关于部署 Django 的问题

    首先说下环境:
    服务器是 Centos6.5
    数据库 mysql
    python version 2.7.6
    django version 1.8.4 nginx version 1.8.0

    遇到的问题

    DEBUG = True时,运行:

    python manage.py runserver 0.0.0.0:3030
    

    是没有问题的,此时在开发环境
    切换DEBUG = False,此时应该是利用 nginx 去配置静态文件

    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    # 这里也试过 STATICFILES_DIRS ,效果一样
    

    然后

    python manage.py collectstatic
    

    应用服务器内网 IP 是 10.1.0.10 ,部署的 django 应用, nginx 服务器则是在另外一台服务器上, IP:10.1.0.30 ,此台服务器上只配置 nginx :

    upstream django {
    	  server 10.1.0.10:3030 max_fails = 2 fail_timeout=30s;
        ip_hash;
    }
    server {
    	  listen 80;
        server_name xx.xx.com;
        charset utf8;
        client_max_body_size 75M;
        location / {
        	  uwsgi_pass django;
            include uwsgi;
        }
        location /media {
        	alias 10.1.0.10:3030/media;
        }
        location /static {
        	alias 10.1.0.10:3030/static;
        }
    }
    

    但是似乎并没作用,请问这样配置是否正确,错误在什么地方,希望大神能指点一下,谢谢!

    13 replies    2016-06-21 18:11:17 +08:00
    bdbai
        1
    bdbai  
       Jun 16, 2016 via Android
    看起来你的配置是在用 Django 来路由静态文件。在你的 settings.py 中:
    ```python
    STATIC_ROOT = BASE_DIR + '/static'
    STATIC_URL = '/static/'
    ```
    其中 `BASE_DIR` 是你的站点根目录。然后在 urls.py 中:
    ```python
    from your_project import settings
    urlpatterns= [
    # ...
    ] + static(settings.STATIC_URL, document_root = settings.STATIC_ROOT)
    ```
    这样就可以了。事实上,你可以用 NGINX 直接处理静态请求,这也就是 collectstatic 的意义所在。
    ```
    location /static {
    root /path/to/your/project;
    }
    ```
    这样可以减少 Django 的负担,使得静态请求更高效。参考这个项目:
    https://github.com/djangoStudyTeam/DjangoBlog
    如果楼主有兴趣可以加入我们 Django 学习小组 :)
    bdbai
        2
    bdbai  
       Jun 16, 2016 via Android
    urls.py 补充:
    from django.conf.urls.static import static
    zonghua
        3
    zonghua  
       Jun 16, 2016
    可以参考一下我这里 https://applehater.cn/2016/04/14/6.html
    Lucky0604
        4
    Lucky0604  
    OP
       Jun 17, 2016
    @bdbai 感谢您的回复。
    是这样的, STATIC_ROOT 和 STATIC_URL 我是设置了的,否则也无法 collectstatic 。
    urls 里面因为我设置的是图片路径,所以我的 urlpatterns 是
    urlpatterns = [
    # ...
    ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
    同样 static 的引入是对的。
    最后我的确是想用 nginx 处理静态请求,问题的关键是 nginx 和我的应用不是同一个服务器, nginx 服务器和应用服务器 IP 分别为 10.1.0.30 和 10.1.0.10
    我是在想 location /static {
    alias # 这里地址能否是远程地址,比如就是 10.1.0.10:3030/static
    }
    nginx 文档上和网上的资料都是本地路径。

    非常感谢您的回答,也很高兴能加入你们的小组:p
    Lucky0604
        5
    Lucky0604  
    OP
       Jun 17, 2016
    @zonghua 您的例子非常好,事实上我也通过 uwsgi 的文档学习到这种方法,基于 nginx uwsgi 部署 django 应用
    还是一样的问题,我的环境上, nginx 与应用服务器不是同一个服务器。所以 location 中的路径如果作为本地路径是不行的,我的疑惑在于,能否使用远程路径。。。
    再次感谢您的回答。
    zonghua
        6
    zonghua  
       Jun 17, 2016
    @Lucky0604 你可以把 Nginx 装到静态文件的服务器,然后用 uwsgi 连接内网的 django 服务。
    zonghua
        7
    zonghua  
       Jun 17, 2016
    @Lucky0604 uwsgi_pass 这里写内网的 ip
    Lucky0604
        8
    Lucky0604  
    OP
       Jun 17, 2016
    @zonghua
    server {
    listen 80;
    server_name dy.zrshop.com;
    charset utf8;
    access_log logs/dy.zrshop.com.access.log main;
    client_max_body_size 75M;
    location / {
    uwsgi_pass 10.1.0.10:3030;
    include /usr/local/nginx-1.8.0/conf/uwsgi_params;
    #proxy_pass http://django;
    }
    location /media {
    alias 10.1.0.10:3030/media;
    proxy_pass 10.1.0.10:3030/media;
    }

    location /static {
    alias 10.1.0.10:3030/static;
    proxy_pass 10.1.0.10:3030/static;
    }
    }
    目前我是这样写的。
    zonghua
        9
    zonghua  
       Jun 17, 2016
    @Lucky0604 10.1.0.10:3030 有监听 http 吗?不然肯定不行
    Lucky0604
        10
    Lucky0604  
    OP
       Jun 17, 2016
    @zonghua
    我总共 nginx 的配置是包含三个文件
    nginx.conf 中
    include myconf/website.conf
    upstream.conf 中
    upstream django {
    server 10.1.0.10:3030 max_fails=2 fail_timeout=30s;
    ip_hash;
    }
    最后就是这个 website.conf 了
    这些都是在 10.1.0.30 这台 nginx 服务器上的文件
    访问 10.1.0.10:3030 这个服务是可以的
    bdbai
        11
    bdbai  
       Jun 17, 2016 via Android
    @Lucky0604 直接让 Django 处理静态文件的话,既然你已经配置好了 url 路由,干脆去掉 nginx 配置中 `location /static` 好了。
    Lucky0604
        12
    Lucky0604  
    OP
       Jun 21, 2016
    @bdbai 已经解决,感谢,还是用 nginx 处理, django 关掉 debug 似乎是无法处理静态文件的。最后在 nginx 服务器上加了个 nfs 文件同步的服务,上传到 10 服务器的文件在 nginx 服务器上同步更新,然后 nginx 地址还是写本机的路径。曲线救国= =
    bdbai
        13
    bdbai  
       Jun 21, 2016 via Android
    @Lucky0604 这样可以减轻上游压力,挺好的。还可以做一下缓存处理。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4615 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:05 · PVG 12:05 · LAX 21:05 · JFK 00:05
    ♥ Do have faith in what you're doing.