首先说下环境:
服务器是 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;
}
}
但是似乎并没作用,请问这样配置是否正确,错误在什么地方,希望大神能指点一下,谢谢!
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 学习小组 :) |
2
bdbai 2016-06-16 19:47:01 +08:00 via Android
urls.py 补充:
from django.conf.urls.static import static |
3
zonghua 2016-06-16 19:49:57 +08:00
可以参考一下我这里 https://applehater.cn/2016/04/14/6.html
|
4
Lucky0604 OP @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 |
5
Lucky0604 OP @zonghua 您的例子非常好,事实上我也通过 uwsgi 的文档学习到这种方法,基于 nginx uwsgi 部署 django 应用
还是一样的问题,我的环境上, nginx 与应用服务器不是同一个服务器。所以 location 中的路径如果作为本地路径是不行的,我的疑惑在于,能否使用远程路径。。。 再次感谢您的回答。 |
8
Lucky0604 OP @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; } } 目前我是这样写的。 |
10
Lucky0604 OP @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 这个服务是可以的 |
11
bdbai 2016-06-17 18:39:44 +08:00 via Android
@Lucky0604 直接让 Django 处理静态文件的话,既然你已经配置好了 url 路由,干脆去掉 nginx 配置中 `location /static` 好了。
|