- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解决nginx+uwsgi部署Django的所有问题(小结)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
最近,自己暑假写的小项目也算完毕了,想着投放到自己云服务器上,本来以为只要打开端口运行python3 manager runserver 0.0.0.0:80就搞定了,最后才知道这只适用于Django的开发模式,只支持单用户访问,既然如此,那么就得需要web服务器进行部署了。我便使用了nginx 。
nginx?
为什么是nginx?
首先我觉得它小,很轻量级,用着简便,没有apache那么庞杂,并且网上都推荐nginx部署Django.
安装 。
这里直接略过,说一点Linux用户推荐大家源码安装,因为命令安装可能会自己装成一个淘宝二次开发的nginx,个人还是推荐用原版.
uwsgi 。
为何还需要这东西 。
简单来说,nginx属于反向代理服务器,他能做什么事呢?监听一个端口,比如说80,可以配置一个反向代理端口,比如8000,这样,所有外部用户对80端口的访问实际上都是请求了8000端口的数据,只是用户并非真实的在与8000端口交流,而是通过了80这座桥梁。目前自己只觉得这样能隐藏自己的真实端口,大家有什么高见请留言指出。 既然如此,那么实际上还是只能单用户访问,所以我们需要一个可以多用户并发访问的工具,那么便是uwsgi了.
如何安装?
1
|
pip install uwsgi
|
配置文件 。
首先给大家看看我项目的文件状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
FlyCold
├── FlyCold
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── SchoolBuy
│ ├── admin.py
│ ├── forms.py
│ ├── __init__.py
│ ├── models.py
│ ├── urls.py
│ └── views.py
└── templates
|
解释以下,这个是精简后的目录树,创建的项目名为FlyCold,生成的FlyCold子目录及SchoolBuy子目录。我的主要代码在SchoolBuy里,setting.py在Flycold子目录里,manager.py在FlyCold根目录里.
安装之后来一个配置文件,内容如下 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# myweb_uwsgi.ini file
[uwsgi]
# Django-related settings
socket = :8080
#真实服务的端口
# Django项目根目录 (绝对路径)
chdir = /home/lyt/FlyCold
# wsgi.py文件在项目中的位置
module = FlyCold.wsgi
# process-related settings
# master
master = true
# 运行的进程数
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
|
这个.ini文件可以放在任何地方,启动的时候uwsgi --ini ***.ini 。
配置nginx 。
找到nginx.conf,写入如下内容 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
server {
#这里是访问时用到的端口
listen 80;
server_name localhost;
charset UTF-8;
#这块存让日志文件
access_log /var/log/nginx/SchoolBuy_access.log;
error_log /var/log/nginx/SchoolBuy_error.log;
client_max_body_size 75M;
location / {
include uwsgi_params;
#同uwsgi内容
uwsgi_pass 127.0.0.1:8001;
#链接超时时间
uwsgi_read_timeout 30;
}
}
|
如此一来,重启你的nginx,访问80端口,就能看到效果了.
还有问题?
你可能发现了,你网页上的静态资源无法访问!!比如说admin页面,会特别简陋,这是因为nginx+uwsgi+Django时,Django对静态资源的处理nginx不能代理(可能吧)。总之这种事不该让Django做,因为nginx在处理静态资源上能力更强,对于静态资源,就让nginx处理吧.
通常来说,你会有两种静态资源/media/开头的链接和/static/开头的。static用来处理一些网站原始图片,视频,js,css文件,Django是自己就支持这种链接的。那么如何关闭让Django处理/static/开头的文件呢,很简单,在setting.py中将DEBUG值改为False,这时,Django就不去处理/static/文件了.
那么/media/呢?一般来说,用户上传的图片,我们会保存起来,在网页上显示时候就用/media/,在setting.py中设置 。
1
2
|
MEDIA_URL = '/media/' #访问的前缀链接
MEDIA_ROOT = os.path.join(BASE_DIR, '../media') #存放文件的具体位置
|
再在url.py中添加 。
1
2
3
4
|
from
django.conf
import
settings
from
django.conf.urls.static
import
static
if
settings.DEBUG:
urlpatterns
+
=
static(settings.MEDIA_URL, document_root
=
settings.MEDIA_ROOT)
|
这里的意思是在DEBUG=True时,会解析/media/文件,文件存放的位置是第二个参数.
如此一来当即在部署为生产环境时,只需要吧DEBUG改为False,Django就不会去处理static和media了.
收集静态文件 。
Django有一个工具可以将应用里用到的所有静态文件收集起来,方便nginx解析。具体:
在setting.py中设置STATIC_ROOT = os.path.join(BASE_DIR, '../collectedstatic') 。
这样收集的静态文件就都放进上面的目录里了。如何运行这个工具?python3 manager.py collectstatic 。
配置nginx解析静态文件 。
同样,nginx.conf 。
首先,在文件顶部加入 user root 。
声明让root用户跑nginx,否则访问静态文件可能提示没有权限 。
其次,在上面说的配置文件location /前加入以下带内容 。
1
2
3
4
5
6
7
8
9
|
location
/static/
{
autoindex on;
alias
/root/SchoolBuyWeb/collectedstatic/
;
}
location
/media/
{
autoindex on;
alias
/root/SchoolBuyWeb/media/
;
}
|
注意alias后对应好自己设定的目录即可! 。
重启nginx,现在已经ok了~~ 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/baidu_35085676/article/details/77160040 。
最后此篇关于解决nginx+uwsgi部署Django的所有问题(小结)的文章就讲到这里了,如果你想了解更多关于解决nginx+uwsgi部署Django的所有问题(小结)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!