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

2016-06-16 18:27:00 +08:00
 Lucky0604

关于部署 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;
    }
}

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

2373 次点击
所在节点    问与答
13 条回复
bdbai
2016-06-16 19:43:45 +08:00
看起来你的配置是在用 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
2016-06-16 19:47:01 +08:00
urls.py 补充:
from django.conf.urls.static import static
zonghua
2016-06-16 19:49:57 +08:00
可以参考一下我这里 https://applehater.cn/2016/04/14/6.html
Lucky0604
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
2016-06-17 10:46:59 +08:00
@zonghua 您的例子非常好,事实上我也通过 uwsgi 的文档学习到这种方法,基于 nginx uwsgi 部署 django 应用
还是一样的问题,我的环境上, nginx 与应用服务器不是同一个服务器。所以 location 中的路径如果作为本地路径是不行的,我的疑惑在于,能否使用远程路径。。。
再次感谢您的回答。
zonghua
2016-06-17 11:30:34 +08:00
@Lucky0604 你可以把 Nginx 装到静态文件的服务器,然后用 uwsgi 连接内网的 django 服务。
zonghua
2016-06-17 11:31:19 +08:00
@Lucky0604 uwsgi_pass 这里写内网的 ip
Lucky0604
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
2016-06-17 12:12:40 +08:00
@Lucky0604 10.1.0.10:3030 有监听 http 吗?不然肯定不行
Lucky0604
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
2016-06-17 18:39:44 +08:00
@Lucky0604 直接让 Django 处理静态文件的话,既然你已经配置好了 url 路由,干脆去掉 nginx 配置中 `location /static` 好了。
Lucky0604
2016-06-21 12:09:11 +08:00
@bdbai 已经解决,感谢,还是用 nginx 处理, django 关掉 debug 似乎是无法处理静态文件的。最后在 nginx 服务器上加了个 nfs 文件同步的服务,上传到 10 服务器的文件在 nginx 服务器上同步更新,然后 nginx 地址还是写本机的路径。曲线救国= =
bdbai
2016-06-21 18:11:17 +08:00
@Lucky0604 这样可以减轻上游压力,挺好的。还可以做一下缓存处理。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/286241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX