admin管理员组文章数量:1122850
项目体验地址:https://python3web
目录
一. 任务概述
二. 架构设计
三. 创建和开发Django项目
3.1 创建Django项目
3.2 项目开发
3.2.1 加载文字
3.2.2 静态资源导入
四、Nginx+uWSGI生产级部署
4.1 安装Nginx
4.2 协同部署
4.3 uwsgi后台运行
五. SSL安全认证
5.1 准备SSL证书
5.2 修改Nginx配置信息
5.3 修改Django的settings.py
六. 小结
一. 任务概述
最近准备将原有Django项目迁移到腾讯云的Ubuntu上面去,以前在部署Django应用的时候主要采用Windows的IIS进行部署。为了便于今后操作,本文详细记录在Ubuntu的部署流程。
二. 架构设计
整体的设计架构图如下所示:
Django 的部署可以有很多方式,采用 nginx + uwsgi 的方式是其中比较常见的一种方式。在这种方式中,我们的通常做法是,将 nginx 作为服务器最前端,它将接收 web 的所有请求,通过负载均衡(如果有多台服务器的话)统一管理请求,同时nginx 把所有静态请求(主要是图片、css样式、字体文件等)自己缓存自己来处理(nginx处理静态文件性能非常强)。接下来,nginx 将所有非静态请求传给 uwsgi 来进行处理。uwsgi可以理解为是支撑django的生产级服务器,稳定性和并发性都非常好。通过这样的两级服务器支持,我们可以极大的提高网站访问的稳定性和访问性能。nginx和uwsgi之间一般处于内网环境,使用socket来代替http进行通信,速度极快。
有人会有疑问,为什么不用django自带的开发服务器然后通过命令行python manage.py runserver来启动呢?这是因为django自带的开发者服务器性能比较差,只能用来调试代码,真实生产级环境中无法满足高并发的要求。
三. 创建和开发Django项目
开发环境:Django3.2.10、Python3.6
远程登录软件:基于SSH 的MobaXterm
云服务器:Ubuntu server18.04
3.1 创建Django项目
Django是一个基于Python的Web框架,使用Django可以方便、快捷的创建网站等网络应用。本文仅介绍与本章内容相关的Django部署知识,如果想要深入学习Django的读者可以参考我的Django系列教程或者参考我的书籍《python web开发从入门到实战》
首先安装Django:
pip3 install django==3.2.10
然后我们创建Django项目,项目名称为blog:
python3 /home/ubuntu/.local/lib/python3.6/site-packages/django/bin/django-admin.py startproject blog
上述命令注意要找到云服务器上django的安装路径,可以参考上面给出的路径。
此时会自动创建photoweb项目,进入该项目:
cd blog
接下来为该项目创建一个应用:
python3 manage.py startapp app
打开blog/blog/settings.py文件,添加应用同时放开访问权限:
ALLOWED_HOSTS = ['*',]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',# 添加应用
]
接下来可以启动项目:
python3 manage.py runserver 0.0.0.0:8000
此时,我们可以通过公网ip远程访问这个开发者服务器:http://175.27.165.229:8000/
正常情况下会出现下图所示界面:
说明此时我们在腾讯云上成功创建了一个最简单的示例网站,并且可以简单访问了。
如果上述步骤没有成功,那么需要查看购买的云服务器上8000端口是否已放开,需要登录云服务器控制台将端口开通。每个云服务器提供商对于端口的开通情况不一致,我在使用腾讯云的时候没有这个问题,百度云需要自己开通8000端口。
3.2 项目开发
本小节我们继续加强我们的django应用,最终实现一个基本的个人站点,可以多页面显示和数据库访问。由于需要远程编辑代码,这里推荐使用VS Code的远程调试功能,比较方便编辑代码。
3.2.1 加载文字
打开blog/app/views.py文件,添加视图接口函数:
from django.shortcuts import render
# Create your views here.
def home(request):
return render(request,'home.html')
这里我们希望通过render函数直接渲染home.html页面。
我们在app文件夹下新建名为templates的子文件夹,然后在templates文件夹中添加对应的home.html文件,这个文件可以随便从网上下载一个html网站模板即可,我们后面会讲解如何对其修改使得django能够正常渲染。这里我们先把免费的html网站首页的html文件拷贝到templates文件夹中然后修改名称为home.html即可。
为了能够顺利的访问图片等静态资源,我们在app目录下创建static文件夹,然后将网站对应的静态资源(css、js、img等)拷贝到该static文件夹下面。
最终完整目录如下所示:
接下来我们为新添加的视图处理函数添加对应的路由,打开blog/urls.py文件,添加路由如下:
from app.views import home
urlpatterns = [
...其它路由...
path('', home, name='home'),
]
这里默认使用根网址。保存所有修改后启动项目:
python3 manage.py runserver 0.0.0.0:8000
然后通过外网访问这个网站:
http://175.27.165.229:8000/
效果如下所示:
可以看到页面文字都显示出来了,但是页面的静态资源文件没有加载成功,下面我们继续完善。
3.2.2 静态资源导入
前面已经将网站需要的css、图片等静态资源放在了app/static目录下面。首先我们要做的就是确定部署环境时的静态资源路径。
打开settings.py文件,添加代码如下:
import os
STATIC_URL = '/static/'
STATIC_ROOT= os.path.join(BASE_DIR,'static')
接下来我们进行静态文件迁移(把app下的static静态资源统一迁移到根目录下的static文件夹中):
python3 manage.py collectstatic
正常情况下效果如下:
接下来修改html模板,主要修改如下:
(1)头部静态标签引入
在html头部引入静态资源标签,类似于java web的jsp语法:
{% load static %}
注意,这里我们采用的是django3进行部署,如果是django2,那么需要采用下面的语法:
{% load staticfiles %}
(2)静态资源引用
修改所有静态资源引用的地方,主要包括js、css、img等的引入,具体示例如下:
- css文件
<link rel="stylesheet" href="css/bootstrap.min.css" />
替换为:
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" />
- js文件
<script src="js/jquery-1.11.0.min.js"></script>
替换为:
<script src="{% static 'js/jquery-1.11.0.min.js' %}"></script>
- img图片:
<img src="img/01.jpg" alt="Image 1" class="" />
替换为:
<img src="{% static 'img/01.jpg' %}" alt="Image 1" class="" />
改完以后重新启动,刷新页面,可以看到效果如下所示:
所有效果和样式都已经正常了。这里我们就在云上基于开发者服务器部署完了。
四、Nginx+uWSGI生产级部署
目前,我们使用的django是采用其默认的开发者服务器进行部署的,这种部署方式不适合高并发需求,稳定性较差。本小节我们将采用nginx + uwsgi 来进行生产级部署。
4.1 安装Nginx
sudo apt-get install nginx
安装好后我们可以检测下nginx版本号:
nginx -v
效果如下所示:
接下来启动nginx:
sudo service nginx start
启动后nginx默认会开启一个站点,端口在80。我们可以通过外网访问:175.27.165.229:80/
出现下图所示表示启动成功:
4.2 协同部署
首先安装uwsgi:
sudo pip3 install uwsgi
然后在 Django 项目根目录下新建一个 uWSGI 的配置文件 uwsgi.ini:
cd blog
touch uwsgi.ini
接下来打开刚刚创建好的配置文件 uwsgi.ini 添加如下配置:
[uwsgi]
socket = :8888
chdir = /home/ubuntu/code/blog
module = blog.wsgi
master = true
processes = 1
vacuum = true
接下来配置Nginx。
Nginx 默认的配置文件都在 /etc/nginx
目录下,我们需要进入 /etc/nginx/sites-available 目录下进行配置 default 文件。
首先将原有配置文件进行备份,并打开 nginx 配置文件
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
sudo vim /etc/nginx/sites-available/default
删掉原先的内容,添加配置如下:
server {
listen 80;
server_name 175.27.165.229;
charset UTF-8;
access_log /var/log/nginx/blog_access.log;
error_log /var/log/nginx/blog_error.log;
client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8888;
uwsgi_read_timeout 10;
#uwsgi_max_temp_file_size 0; # 禁用临时文件缓冲器
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/ubuntu/code/blog/static;
}
}
上述配置不难分析,nginx本身配置在80端口,用于接收所有从80端口来的请求。然后转发给uwsgi对应的8888端口。如果是静态资源,则直接使用nginx进行返回(location /static指明了静态文件路径)。
现在重新启动 nginx:
sudo service nginx restart
然后启动uwsgi。具体的通过 uwsgi 命令读取前面创建的 uwsgi.ini 文件启动项目:
sudo uwsgi --ini uwsgi.ini
注意这里的ini文件里面我们把uwsgi的启动端口设置为了8888。
正常状态内容如下所示:
注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。
到这里我们就基本部署完成了。
这个时候我们通过外网访问http://175.27.165.229/ 进行测试。效果如下图所示:
可以可以正常访问文字页面,但是css、图片等静态资源没有加载进来。
我们可以查看nginx错误日志,位于/var/log/nginx/blog_error.log,打开后内容如下所示:
2022/01/01 22:22:48 [error] 11674#11674: *41 open() "/home/ubuntu/code/blog/static/slick/slick.min.js" failed (13: Permission denied), client: 112.22.88.175, server: 175.27.165.229, request: "GET /static/slick/slick.min.js HTTP/1.0", host: "175.27.165.229", referrer: "http://175.27.165.229/"
2022/01/01 22:22:48 [error] 11674#11674: *42 open() "/home/ubuntu/code/blog/static/jquery.magnific-popup.min.js" failed (13: Permission denied), client: 112.22.88.175, server: 175.27.165.229, request: "GET /static/jquery.magnific-popup.min.js HTTP/1.0", host: "175.27.165.229", referrer: "http://175.27.165.229/"
可以看到所有静态资源请求均提示Permission denied,这是nginx权限问题。我们使用下面的命令查看当前nginx权限用户:
ps aux | grep "nginx: worker process"
可以看到我们当前id=11674工作的nginx用户名是www-data,并不是ubuntu(腾讯云ubuntu系统默认账户名为ubuntu),因此我们需要将nginx的工作用户改为ubuntu即可。
具体操作如下:
sudo su
cd /etc/nginx
vim nginx.conf
在打开的文件里面将user www-data;
修改为 user root;即可。
然后重新加载nginx:
nginx -s reload
接下来我们重新访问,即可看到页面如下:
到这里图片和css样式等都能准确加载了。
4.3 uwsgi后台运行
最后,我们还遗留了一个问题。我们是采用远程ssh方式启动uwsgi的,一旦我们的ssh关闭,会发现这个启动的uwsgi也就关掉了。因此,我们希望通过ssh将uwsgi启动并能够在后台一直运行。
我们可以使用下面的命令启动uwsgi并且能够在后台运行:
sudo uwsgi -d --ini uwsgi.ini
这个时候我们关掉ssh,可以看到网站依然可以访问。
如果我们想要关掉已经在后台运行的uwsgi,那么可以使用下面的方法:
首先查询当前所有正在运行的uwsgi:
ps -ef|grep uwsgi
效果如下:
其中第2列表示进程号,我们可以直接将其kill掉:
sudo kill -9 23559
五. SSL安全认证
通过前面的操作,我们已经将项目部署上线了,这时我们还需要考虑是否购买SSL证书,让我们的网站支持https协议。为什么网站需要支持HTTPS协议?
简而言之:HTTPS = HTTP + SSL = 更安全的数据传输
HTTP协议简称超文本传输协议,它广泛用于在Web浏览器和网站服务器之间传递信息。HTTP协议的缺点是它以明文方式发送内容(包括用户密码),不提供任何方式的数据加密。如果攻击者截取了Web浏览器和网站服务器之间的传输文本,就可以直接读取其中的信息。
为了解决这个隐患和保证数据的传输安全,HTTPS协议(安全套接字层超文本传输协议)诞生了。它在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信数据加密。
注意:HTTP协议默认使用的端口是80端口,HTTPS协议默认使用的端口是443端口。由于我们使用的是云服务器,需要确保设置安全组时已经开放了443端口(在每个云服务器对应的控制台将443端口权限放开)。
如何在生产环境中部署Django项目中配置HTTPS?
一共分三步:
- 购买下载SSL证书,通常包括一张证书(.crt)和一个私有密钥文件(.key);
- 修改Nginxe配置信息,并上传下载颁发的SSL证书及key到指定文件夹;
- 修改Django配置文件settings.py;
5.1 准备SSL证书
SSL证书有很多种, 级别越高越贵。对于个人网站使用单域名的DV SSL证书一般就够了,这种证书各大云平台做活动期间是可以免费申请的。购买SSL证书时选择单域名-DV SSL-免费版即可,如下图所示
无论哪个SSL证书服务商最后都会提供证书下载链接或直接将证书发送到你的邮箱,只是流程不同而已。随后需要将下载的证书上传到服务器指定文件夹,见下一步。
5.2 修改Nginx配置信息
首先重新打开 nginx 配置文件
sudo vim /etc/nginx/sites-available/default
针对原先80端口的server内容,修改如下:
server {
listen 443 ssl; #监听443端口
ssl_certificate /home/ubuntu/code/ssl/python3web_bundle.crt; # 证书地址
ssl_certificate_key /home/ubuntu/code/ssl/python3web.key; # 私有密钥文件地址
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
server_name python3web; # 域名
charset UTF-8;
access_log /var/log/nginx/blog_access.log;
error_log /var/log/nginx/blog_error.log;
client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8888;
uwsgi_read_timeout 10;
#uwsgi_max_temp_file_size 0; # 禁用临时文件缓冲器
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/ubuntu/code/blog/static;
}
}
然后重新启动nginx:
sudo service nginx restart
5.3 修改Django的settings.py
当nginx支持https后,需要对应修改django项目的settings.py文件。具体的添加代码如下:
# SECURITY安全设置 - 支持http时建议开启
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
SECURE_SSL_REDIRECT = True # 将所有非SSL请求永久重定向到SSL
SESSION_COOKIE_SECURE = True # 仅通过https传输cookie
CSRF_COOKIE_SECURE = True # 仅通过https传输cookie
SECURE_HSTS_INCLUDE_SUBDOMAINS = True # 严格要求使用https协议传输
SECURE_HSTS_PRELOAD = True # HSTS为
SECURE_HSTS_SECONDS = 60
SECURE_CONTENT_TYPE_NOSNIFF = True # 防止浏览器猜测资产的内容类型
最后重新启动项目即可。接下来我们就可以使用带https的前缀来访问我们的页面了。
六. 小结
本文主要讲解如何在腾讯云的ubuntu上实现django的生产级部署。由于水平有限,本文难免有错误或不当的地方,请读者予以指正。
版权声明:本文标题:腾讯云Ubuntu18.04部署Django应用(Django 3)完整教程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1726450677a1098280.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论