• 本篇博客完整地记录了我从购买服务器到完成部署的全过程,需要的朋友可以参考一下我的流程,看这一篇文章就能成功部署项目啦。
  • 写这个的本意是为备忘( 保姆级步骤),同时由于我在最开始部署项目时,没有找到一个完整的部署参考教程,走了很多弯路、费了很大的精力,所以也希望通过这篇博客能帮助到更多需要这方面参考的人,可以让大家少走点弯路。

    目录

    • 1. 整体结构
    • 2. 购买云服务器
    • 3. 在服务器安装、配置MySQL
    • 4. 在服务器安装python
    • 5. 修改django项目配置并上传服务器
    • 6. 安装项目的环境依赖并测试
    • 7. 安装测试uwsgi
    • 8. 修改配置文件,收集静态资源
    • 9. 安装、配置、测试nginx
    • 10. 结语

1. 整体结构


贴一下之前写的细节讲解的部署过程,本篇侧重于整体过程的展示,想要了解细节讲解的朋友可以自行查看本人其他的文章:

  • 【django云服务器部署流程(1)】django+uwsgi+nginx:准备工作
  • 【django云服务器部署流程(2)】django+uwsgi+nginx:部署项目
  • 【uwsgi+nginx部署django项目】nginx配置文件的一些问题

2. 购买云服务器

由于我还有华为云的代金券没有使用,所以我购买的服务器是华为云的云耀云服务器,流程类似,下面是我购买服务器的流程:

登录以后,在搜索栏输入“云耀云服务器”,点击搜索,然后点击立即购买,选择自己想要的配置组合,选择同意声明,点击立即购买,付费即可。



购买完成后,进入管理控制台,可以看到如下内容,注意箭头部分指的弹性公网IP,这个IP地址就是后续访问服务器使用的IP地址,远程连接服务器也是使用这个IP;同时需要点击红框中的重置密码,这个密码就是远程登陆服务器使用的密码,重置完密码之后,购买服务器这个步骤就算是完成了,目前已经可以在本机使用Xshell、putty等远程登陆工具连接到该服务器了(此处提供一个Xshell的安装教程:Xshell7的下载和安装)。

3. 在服务器安装、配置MySQL

  • 3.1 安装MySQL
#更新apt-get
sudo apt-get update
#安装mysql服务
sudo apt-get install mysql-server
  • 3.2 初始化配置
sudo mysql_secure_installation

如下图,输入上述指令之后需要做出一个选择,输入N之后开始设置新密码,并重复密码。完成之后会出现四次选择,我的选择分别是:N、Y、N、Y

  • 3.3 检查MySQL服务的状态
systemctl status mysql.service

  • 3.4 配置远程登陆并测试
#输入下方指令以及3.2中设置的密码,进入mysql
sudo mysql -uroot -p
#创建一个远程登陆的用户以及登录密码(%为任意主机可连接,可设置为特定IP,test为用户名,123456为密码,任意设置)
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
#执行下列命令,命令立即生效
flush privileges;
#查询数据库的用户(看到 User: 'test'@'%'; 表示创建新用户成功了)
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

到这里并没有配置完成,还需要配置mysql的配置文件,首先输入 exit 退出mysql

#输入下方指令进入配置文件(MySQL 5.7),找到 bind-address = 127.0.0.1 将其注释(如下图)
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
#按esc --> 输入 wq --> 回车,即保存了修改
#输入下列命令,停止、启动mysql服务使得配置生效
/etc/init.d/mysql stop
/etc/init.d/mysql start



到这里mysql的远程登录就设置好了。需要注意:进行远程连接之前需要确保你的服务器的安全组是添加了3306端口的,参考步骤(后同):



现在就可以使用navicat( 使用workbench连接也可以;安装教程:[新人向]MySQL和Navicat下载、安装及使用详细教程 ps:我只参考了其中navicat安装部分)远程登录MySQL进行测试(如下图,可看到连接成功):

4. 在服务器安装python

Linux系统一般都自带python,我买的服务器自带的是python 3.6,我的django项目所在的环境是python 3.8.3,所以为了避免版本不兼容,我安装了一个python 3.8。

#4.1 升级
sudo apt update
sudo apt upgrade -y
#4.2 安装编译所依赖的环境
sudo apt install build-essential -y
sudo apt install libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev -y
sudo apt-get install zlib1g-dev
#4.3 下载压缩包
wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
#4.4 解压
tar -xzvf Python-3.8.3.tgz
#4.5 配置编译参数
cd Python-3.8.3
./configure --enable-optimizations
#4.6 编译和安装
sudo make
sudo make install
#4.7 查看python版本
python3 -V
#4.8 创建软连接
sudo ln -sf /usr/local/bin/python3.8 /usr/bin/python3
sudo ln -sf /usr/local/bin/python3.8 /usr/bin/python
sudo ln -sf /usr/local/bin/pip3 /usr/bin/pip3
sudo ln -sf /usr/local/bin/pip3 /usr/bin/pip
#4.9 pip换源(清华源为例)、更新
sudo pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install --upgrade pip

5. 修改django项目配置并上传服务器

  • 5.1修改连接数据库的相关参数
    本人没有使用django自带的数据库,而是使用MySQL数据库,使用pymysql进行数据库的相关操作,所以在部署到服务器时,需要将建立数据库连接的相关代码进行修改:
# host填步骤购买服务器中提到的弹性公网IP
# user和passwd与Navicat连接数据库时使用的相同
# db为服务器中数据库的数据库名
conn = pymysql.connect(host='服务器IP',port=3306,user="test",passwd='123456',db="数据库名",charset="utf8")
  • 5.2 修改项目的settings.py文件
# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG为True,则出现bug时页面会显示错误的具体信息,开发时可以打开便于自己调试,但是部署以后要关闭
DEBUG = False
# 中括号内写你的公网IP,表示允许该IP访问,如果填'*'表示允许所有IP访问
ALLOWED_HOSTS = ['服务器IP']
  • 5.3 导出项目的环境依赖
# 将项目环境内的所有依赖都导出:
pip freeze > requirements.txt
# 或者仅导出项目依赖(首先安装:pip install pipreqs):
pipreqs ./ --encoding=utf-8
  • 5.4 使用pycharm上传项目到服务器
    本人使用pycharm提供的Django搭建的该项目,所以直接使用pycharm进行了项目的上传(此处需要使用专业版的pycharm,如果没有也可以使用sftp、WinSCP等进行上传),上传过程参考:
5.4.1 打开pycharm专业版的 tools -> 点击Deployment -> 点击 Configuration
5.4.2 得到下图所示内容,按照下图进行配置
5.4.3 配置完成后,右键点击想要上传的文件,选中Deployment,点击Upload to想要上传的服务器,就可以了,文件会被上传到下图中的 Root path + Deployment path 中

(配置过程注意:connection中的ssh,一开始没有的话可以点右侧三个点添加,添加时的配置与Xshell相同,然后可以通过Test_connection进行连接测试;其次Root path如果不确定,可以点Autodetect;最后就是Mappings内的路径要设置正确。)

6. 安装项目的环境依赖并测试

#使用5.3导出的文件进行环境依赖的安装
pip install -r requirements.txt
#运行项目,下面使用的端口需要是没有被占用的
python manage.py runserer 0:8001
# 报错:ModuleNotFoundError: No module named '_sqlite3'#解决方法:
# (1.安装sqlite-devel
yum install sqlite-devel
# (2.重新配置编译参数,重新编译、安装python(即重复4.5和4.6步)

也可自行参考:【Python库—sqlite3】ModuleNotFoundError: No module named ‘_sqlite3‘
重新编译完再次启动项目,即可在网页访问了(记得将该端口在安全组中开放,方法同上述mysql的3306端口):

虽然上述测试成功了,但是静态资源的访问是无法访问的(如下图),这种情况是正常的,django框架仅在开发模式下提供静态文件服务:开启DEBUG模式时,django的内置服务器提供静态文件服务;关闭DEBUG模式后,django便不提供静态文件服务了。由于我使用的是nginx+uwsgi进行部署,所以此处不再写访问静态资源的方法。

7. 安装测试uwsgi

#安装
pip install uwsgi
#测试
uwsgi --http :8001 --chdir /root/pycharm -w test2.wsgi

如果没有问题,就可以像6.中一样在浏览器访问正常访问了,但是为了方便,一般会在项目的根目录创建一个uwsgi.ini文件,内容参考如下:
(编辑uwsgi.ini文件,没有的话会自动创建:vim uwsgi.ini)

#下列是uwsgi.ini文件的内容,第一行的[uwsgi]必须写
[uwsgi]
# 使用http访问,0表示任何IP,8001表示端口号,要求同上
http=0:8001
# 项目的绝对路径
chdir=/root/test1
# 项目的wsgi.py文件,如果你怕写乱,此处建议写绝对路径
wsgi-file=/root/test1/test1/wsgi.py
# 允许主线程存在
master=true
# 开启进程的数量
processes=1
# 开启多线程
enable-threads=false
# 当服务器退出的时候自动清理环境,删除socket文件和pid文件
vacuum=true
# 使进程在后台运行,并将日志打到指定的日志文件
daemonize=uwsgi.log
# 指定pid文件的位置,记录主进程的pid号,主要用于关闭服务
pidfile=uwsgi.pid

保存上述文件后,可以使用如下指令进行测试:

# 开启uwsgi,可通过浏览器进行验证
uwsgi --ini uwsgi.ini
# 关闭uwsgi,需要使用到配置文件中指定的路径下的pid文件,该文件在开启uwsgi后会自动创建
uwsgi --stop uwsgi.pid

同样的,此时也是无法访问静态资源的,此处不再写针对uwsgi的解决方案(后续使用nginx),有兴趣的朋友可以参考我的【django云服务器部署流程(2)】django+uwsgi+nginx:部署项目中“测试项目”及“uwsgi”部分。

8. 修改配置文件,收集静态资源

settings.py中的STATIC_URL是用于引用STATICFILES_DIRS或STATIC_ROOT所指向的静态文件的,DEBUG=True时,其引用的是STATICFILES_DIRS;而DEBUG=False时则引用STATIC_ROOT。并且有人提到,不收集静态资源的话,css、img、js的样式可能会失效(执行下列指令后可以看到,新收集的静态资源里面比原来的静态资源多一个admin文件)。步骤如下:

# 在settings.py文件中增加一句代码如下。配置完成后 STATIC_ROOT=项目根目录+"文件路径"
# 需要注意,这个文件的绝对路径与之前的静态资源的绝对路径不能相同
STATIC_ROOT = os.path.join(BASE_DIR, "文件路径")
# 配置完保存退出,在项目根目录执行下列指令收集静态资源
python manage.py collectstatic

9. 安装、配置、测试nginx

  • 9.1 通过如下指令进行nginx的安装及相关操作
# 更新apt-get
sudo apt-get update
# 安装nginx
# 如果使用apt-get安装报错,可能是因为没有nginx的安装源,可以通过增加安装源,或者手动下载安装包进行安装。
sudo apt-get install nginx# 验证配置是否正确,不正确会报错。也可以看到默认的配置文件,建议大家记录一下
nginx -t
# 查看nginx版本(详细版本用指令:nginx  -V)
nginx -v
# 启动nginx(我的好像是安装就已经启动了)
service nginx start    #或者  start nginx
# 快速停止nginx
nginx -s stop
# 正常关闭nginx
nginx -s quit
# 配置文件修改重装载命令
nginx -s reload
  • 9.2 进行完上述操作,都正常的话,就可以在浏览器输入你的IP(默认使用80端口,该端口可以不加)看到如下显示(如果看不到,可以检查一下你的80端口是否被占用、安全组是否添加80端口):
  • 9.3 配置
# 在项目根目录停止前面开启的uwsgi、nginx
uwsgi --stop uwsgi.pid
nginx -s stop
# 使用vim对uwsgi.ini做出修改:注释http那一行,添加
socket = 0.0.0.0:8002  #复制时删掉注释;0.0.0.0表示所有IP,端口需要选用空闲端口
  1. 使用 vim my_nginx.conf 指令创建、编辑my_nginx.conf,内容如下。文件名随意,复制时删掉注释,建议先复制到本地,修改完成再在Xshell操作
  2. 此处的配置的规则就是,将nginx -t指令得到的nginx的默认配置文件中的全部复制,粘贴到新建的文件中,删掉其中include开头 .conf结尾的行;并且将server{ }部分更改为下述内容(如果没有这个模块则直接将其添加到http{ }中即可),参考本人的配置文件:
user root;   #设置权限,后面会讲这个问题
worker_processes auto;
pid /run/nginx.pid;
events {worker_connections 768;
}
http {sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;include /etc/nginx/mime.types;  #这个文件有的教程说复制到项目根目录,我写了绝对路径default_type application/octet-stream;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLEssl_prefer_server_ciphers on;#下面两行是nginx的请求与错误日志,路径自行设计,可查看其内容修改bugaccess_log /var/log/nginx/access1.log;error_log /var/log/nginx/error1.log;gzip on;upstream django {server 127.0.0.1:8002;  #这个地方很重要,需要用与uwsgi.ini中socket写的端口一致}server{root /var/www/html;index index.html index.htm index.nginx-debian.html;listen 8001;    #监听端口,浏览器访问的就是这个端口server_name 1**.**.**.**5;  #你的服务器IPclient_max_body_size 75M;charset     utf-8;location / {uwsgi_pass  django;include  /etc/nginx/uwsgi_params;  #这个可以根据自己nginx的文件找到在哪}location /static_new/ {   #配置静态资源,此处写什么,在浏览器访问就需要写什么alias /root/test1/static_new/;  #静态资源的绝对路径,与8.中收集到的静态资源路径一致,最后的 /一定要加}location /media/ {   #配置媒体资源,要求同静态资源一致alias /root/test1/media/;}location /templates/ {alias /root/test1/templates/;}}
}

上述配置文件的具体问题(包括访问时得到 403 Forbidden 或者 404 Not Found 等)可以参考本人的博客:【uwsgi+nginx部署django项目】nginx配置文件的一些问题

  • 9.4 启动nginx服务
# 9.4.1 启动uwsgi
uwsgi --ini uwsgi.ini
# 9.4.2 加载nginx配置文件,加载过一次即可
# 此处的配置文件为“配置”步骤中创建的my_nginx.conf;-c 表示加载配置文件启动
sudo nginx -c /root/test1/my_nginx.conf
# 9.4.3 重新加载nginx
# 如果后续再次修改配置文件,可再次使用这个命令,如果报错,则使用9.4.2的指令重新加载一次
nginx -s reload
  • 9.5 测试
    根据前面配置的端口、目录,在浏览器进行访问(关键是静态资源)

通过上图可以看到,项目已经按照前面的配置部署好了,所以至此,该项目在云服务器的部署已经完成。

10. 结语

看完这篇文章大家应该能够比较顺畅地部署一个简单的Django项目了,非常感谢能看到这的小伙伴,文章中可能存在一些不正确的地方,恳请大家能够指证,希望这篇文章能给大家带来帮助,如果有疑问、问题可以随时提问,我会积极回复的,也希望大佬能够不吝赐教,再次感谢大家。

  • 相关文章

    • 【django云服务器部署流程(1)】django+uwsgi+nginx:准备工作
    • 【django云服务器部署流程(2)】django+uwsgi+nginx:部署项目
    • 【uwsgi+nginx部署django项目】nginx配置文件的一些问题
    • 【Django后端】微信小程序post请求返回403或者500的解决方案
    • 【Python库—sqlite3】ModuleNotFoundError: No module named ‘_sqlite3‘

【django云服务器部署】django+uwsgi+nginx 部署的完整流程相关推荐

  1. Django扩展 —— uwsgi+nginx部署

    -- uwsgi+nginx部署(django) -- 服务器环境配置 -- 导出虚拟环境的所有包 pip freeze > list.txt -- 通过ftp软件将项目以及list.txt文件 ...

  2. Centos django+uwsgi+nginx部署

    Centos django+uwsgi+nginx部署 安装Python CentOS 7 Linux发行版默认包含Python 2.但是,Python 2将于2020年1月1日停产.尽管一些遗留应用 ...

  3. django+uwsgi+nginx部署

    最近线上部署运维工单系统,使用django+uwsgi+nginx部署,发现这篇文章,很详细,觉得不错,转载一下: 写了那么长时间的django,一直没跟nginx结合一下,访问的时候老是得加端口号, ...

  4. 江在川上曰:云服务器上的flask项目部署(Ubuntu+Flask+Gunicorn+Supervisor+Nginx+Anaconda)

    云服务器上的flask项目部署(anaconda.python.flask等相关安装) 在探索未知的路上走了很多弯路,这里记载了我在阿里云上部署项目切实可行的步骤,当然问题因人而异,没有四海皆适用的准 ...

  5. 云服务器的IT价值与部署分析

    作为云计算落地的基础设施服务,云服务器在帮助企业IT架构转型,缩减IT运营成本的过程广获认可.在此,我们将对云服务器的价值与IT部署可行性作简单分析. 云服务器是否能够降低应用的长期成本 随着云计算应 ...

  6. 单机 docker 部署fastfds_云服务器使用docker可视化一键部署Wrodpress个人博客,操作简单,适合小白...

    原文链接在我的博客: 教你云服务器使用docker可视化一键部署Wrodpress个人博客,操作简单,适合小白 - Kyellow's blog​kyellow.gitee.io 前段时间领取了一台云 ...

  7. 华为云服务器上安装jdk和部署tomcat

    华为云服务器上安装jdk和部署tomcat 一.下载jdk和tomcat 下载jdk 下载tomcat: 进入tomcat官网 二.安装jdk和tomcat 1,用ftp上传安装包到云服务器上 用xs ...

  8. uwsgi+nginx部署django项目(有图原理的详细展示的)

    1. 概念解析(wsgi协议,uwsgi协议,uWSGI) 参考:https://www.cnblogs.com/wspblog/p/8575101.html 1.1 现实世界的web请求: 1.2  ...

  9. Ubuntu下Django+uWSGI+nginx部署

    本文采用uwsgi+nginx来部署django 这种方式是将nginx作为服务端前端,将接受web所有的请求,统一管理,Nginx把所有的静态请求自己处理,然后把所有非静态请求通过uwsgi传递给D ...

最新文章

  1. java开发用amd处理器_HBase1.x实战:协处理器Java开发实例--ObserverCoprocessor
  2. IIS目录禁止执行权限
  3. 超图桌面开发VC++ 入门程序
  4. asio boost 异步错误处理_boost::asio::error的用法浅析
  5. python3下的paramiko 安装
  6. java简单编译器源代码_25行代码实现一个简单的编译器
  7. 函数伪代码_Excel常用函数
  8. linux和windows下忘记mysql密码的几种找回方法
  9. 需要学习的技术知识备忘录
  10. 三百行python代码的项目_300行Python代码打造实用接口测试框架
  11. 原来TOGAF标准第10版是个活力生态圈
  12. 【Java设计模式】——工厂模式
  13. C语言零碎知识点之输入字符数组
  14. 技术管理角度看C++游戏程序员发展
  15. 【已解决】【V3版本】如何使用脚本关闭Win10自动更新服务并阻止其自动启动?
  16. 手机贴图压缩技术标准及作用
  17. android 实现发送彩信方法 (MMS)
  18. uni-app上传图片并添加水印
  19. 软件魔方制作系统启动盘并安装win7系统
  20. 如何回答「为什么要雇用你」【面试核心问题4】

热门文章

  1. java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...
  2. Linux 创建目录和删除空目录
  3. linux 创建共享目录
  4. Linux 创建目录和文件
  5. Versatil Markdown for Mac(超级文本编辑器)
  6. 机器学习随笔(拾人牙慧)
  7. get和post的区别(传参方式)
  8. 动力电池编码追溯系统_学习编码时如何保持动力(10条可行的技巧!)
  9. 大家怎么过的年......
  10. 如何将腾讯视频的qlv格式转换为mp4格式