V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Lucky0604
V2EX  ›  问与答

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

  •  
  •   Lucky0604 · 2016-06-16 18:27:00 +08:00 · 2323 次点击
    这是一个创建于 2921 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关于部署 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 条回复    2016-06-21 18:11:17 +08:00
    bdbai
        1
    bdbai  
       2016-06-16 19:43:45 +08:00 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  
       2016-06-16 19:47:01 +08:00 via Android
    urls.py 补充:
    from django.conf.urls.static import static
    zonghua
        3
    zonghua  
       2016-06-16 19:49:57 +08:00
    可以参考一下我这里 https://applehater.cn/2016/04/14/6.html
    Lucky0604
        4
    Lucky0604  
    OP
       2016-06-17 10:44:25 +08:00
    @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
       2016-06-17 10:46:59 +08:00
    @zonghua 您的例子非常好,事实上我也通过 uwsgi 的文档学习到这种方法,基于 nginx uwsgi 部署 django 应用
    还是一样的问题,我的环境上, nginx 与应用服务器不是同一个服务器。所以 location 中的路径如果作为本地路径是不行的,我的疑惑在于,能否使用远程路径。。。
    再次感谢您的回答。
    zonghua
        6
    zonghua  
       2016-06-17 11:30:34 +08:00
    @Lucky0604 你可以把 Nginx 装到静态文件的服务器,然后用 uwsgi 连接内网的 django 服务。
    zonghua
        7
    zonghua  
       2016-06-17 11:31:19 +08:00
    @Lucky0604 uwsgi_pass 这里写内网的 ip
    Lucky0604
        8
    Lucky0604  
    OP
       2016-06-17 12:07:36 +08:00
    @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  
       2016-06-17 12:12:40 +08:00
    @Lucky0604 10.1.0.10:3030 有监听 http 吗?不然肯定不行
    Lucky0604
        10
    Lucky0604  
    OP
       2016-06-17 12:33:17 +08:00
    @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  
       2016-06-17 18:39:44 +08:00 via Android
    @Lucky0604 直接让 Django 处理静态文件的话,既然你已经配置好了 url 路由,干脆去掉 nginx 配置中 `location /static` 好了。
    Lucky0604
        12
    Lucky0604  
    OP
       2016-06-21 12:09:11 +08:00
    @bdbai 已经解决,感谢,还是用 nginx 处理, django 关掉 debug 似乎是无法处理静态文件的。最后在 nginx 服务器上加了个 nfs 文件同步的服务,上传到 10 服务器的文件在 nginx 服务器上同步更新,然后 nginx 地址还是写本机的路径。曲线救国= =
    bdbai
        13
    bdbai  
       2016-06-21 18:11:17 +08:00 via Android
    @Lucky0604 这样可以减轻上游压力,挺好的。还可以做一下缓存处理。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2584 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:19 · PVG 16:19 · LAX 01:19 · JFK 04:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.