基于centos7+nginx+uwsgi+python3+django2.0部署Django项目
0、序言
本文讲解如何基于centos7+nginx+uwsgi+python3+django2.0把windows上的本地项目部署到云服务器上。
本文服务器上的django项目和虚拟环境的路径将建立在 /home路径下,项目名为"BlogProject",虚拟环境名为"py3.6env"。
对于Django部署而言,nginx和uWSGI是不错的选择,但它们并非唯一的选择,也不是“官方”选择。对于它们两个,都有不错的替代品,因此鼓励你去详细研究一下。
nginx (发音为 engine-x) 是一个免费开源并且高性能的HTTP服务器和反向代理,还是一个IMAP/POP3代理服务器。
web服务器软件:可以向浏览器等web客户端提供文件 (HTML, 图像, CSS等等)。常用的软件有Apache,Nginx,IIS(在windows系统使用)。
一、概念
一个web服务器面对的是外部世界。它能直接从文件系统提供文件 (HTML, 图像, CSS等等)。然而,它无法“直接”与Django应用通信;它需要借助一些工具的帮助,这些东西会运行运用,接收来自web客户端(例如浏览器)的请求,然后返回响应。
一个Web服务器网关接口(Web Server Gateway Interface) - WSGI - 就是干这活的。 WSGI 是一种Python标准。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask,Django框架写的程序)通信的一种规范。
uWSGI是一种WSGI实现。本文我们将设置uWSGI,让它创建一个socket,并且通过WSGI协议提供响应到web服务器。
二、安装环境
OS:centos7.6
python版本:python3.6.5
django版本:Django2.0
uwsgi版本:使用本文发布时最新的2.0.18
nginx版本:使用本文发布时官网最新的1.15.11
三、安装Python3.6
1.不要删除自带的python2.7,否则会出问题,因为centos许多软件需要依赖系统自带python
2.安装依赖工具 (安装这些模块都是为了成功编译安装python3,防止出现各种异常)
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel mysql-devel gcc gcc-devel python-devel
3.下载
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
4.解压
tar -zxvf Python-3.6.5.tgz
5.移动至规范的放软件的目录下
mv Python-3.6.5 /usr/local
6.安装
cd /usr/local/Python-3.6.5/
./configure
make
make install
./configure命令没有指定安装路径,则默认安装在/usr/local/bin,如果指定安装路径,则命令为./configure --prefix=/usr/local/python3。
安装完成之后,网上很多教程都说要建立软链接 添加变量 才能在终端中直接使用python3,但是我这里不用建立软链接,可直接在终端中直接使用python3.

pip3也不用建立软链接,可直接在终端中直接使用pip3

7.验证版本号
python3 -V

四、虚拟环境
1.安装虚拟环境virtualenv,建议大家都安装一个virtualenv,方便不同版本项目管理。
系统已经帮我们安装好virtualenv,可不用安装直接使用

2.创建虚拟环境virtualenv
在/home路径下,创建虚拟环境,这里的路径大家可以自己选择,我习惯建在/home路径下。也可以在根目录下建立两个文件夹env和BlogProject(项目路径 ),主要用于存放env和网站文件的
virtualenv py3.6env
3.进入虚拟环境
source /home/py3.6env/bin/activate

红色方框出现(py3.6env),说明是成功进入虚拟环境。
五、安装uwsgi
1.系统上安装uwsgi
pip3 install uwsgi
2.虚拟环境上安装uwsgi
进入虚拟环境,执行安装命令
pip3 install uwsgi
注意:uwsgi要安装两次,先在系统里安装一次,然后进入对应的虚拟环境安装一次。
安装完成后查询uwsgi安装情况,如图所示,则安装成功。

同样这里也不用建立软链接,可以直接在终端使用uwsgi。
3.验证
在/home/路径下建立test.py,输入以下内容:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello Django"]
执行命令
uwsgi --http :8001 --wsgi-file test.py
浏览器访问,网页能显示 Hello Django 那么就没问题。((记得关闭系统防火墙或者在服务器安全组开放8001端口))
六、本地项目搬迁到服务器
1.备份本地数据库。
使用sqlite数据库的话,直接打包数据库文件(db.sqlite3)上传到服务器即可。
使用Mysql数据库,要先在本地Mysql里备份导出数据,然后在服务器上安装Mysql数据库软件。
mysqldump -u 用户名 - p 数据库名 > data.sql #备份导出数据
ps:服务器上安装Mysql数据库软件,请参考:CentOS7 安装并配置MySQL8.0
2.在本地项目目录下用下面的命令把当前的环境依赖包导出到requirements.txt文件。
pip3 freeze > requirements.txt
3.把项目源码(包括数据库文件,环境依赖包文件)压缩打包,上传到服务器对应的目录里(这里在git bash里使用scp命令上传数据到服务器),解压。
scp BlogProject.zip root@“服务器IP地址”:/home/BlogProject.zip #传输到home路径下
4.进入刚才步骤三创建的虚拟环境,然后进入项目路径安装requirements.txt里的依赖包。
pip3 install -r requirements.txt

5.导入数据库到服务器。(如果用的是Mysql的话)
默认使用的是SQLite数据库,就不用做此操作。数据库原来是SQLite的,想换成Mysql,请查看文章:Django中把SQLite数据库转换为Mysql数据库的配置方法
如果是Mysql数据库的,则在命令行里输入:
#把上传到服务器的data.sql,在服务器里用下面命令导入
mysql -u 用户名 -p 你的密码
use 数据库名; #这里的数据库名要项目中的settings.py文件的数据库名一致
source /home/data.sql #导入数据库文件
6.运行一下项目,如果能正常启动,在浏览器里访问服务器地址(域名),就能查看到项目,则进行下一步,不能正常运行往上检查
python3 manage.py runserver 0.0.0.0:80
ps:如果在云服务器上没有为80端口设定安全组,则不能在浏览器访问。
七、Django正常运行之后我们就开始配置一下uwsgi。
我们网站项目路径是 /home/BlogProject,在/home路径下新建文件夹BlogProject_uwsgi,专门存在uwsgi配置文件,日志文件,进程文件,另外也可以直接在项目根目录下创建BlogProject_uwsgi.ini文件,这里我选择新建文件夹。
在/home/BlogProject_uwsgi路径下新建BlogProject_uwsgi.ini文件
#BlogProject_uwsgi.ini [uwsgi]
# 通过uwsgi访问django需要配置成http
# 通过nginx请求uwsgi来访问django 需要配置成socket # web项目根目录
chdir = /home/BlogProject
#虚拟环境的目录
home = /home/py3.6env
# module指定项目自带的的wsgi配置文件位置
module = BlogProject.wsgi # 允许存在主进程
master = true
# 开启进程数量
processes = 4
#每个进程的最大请求时间
harakiri = 60
#每个进程的最大请求数
max-requests = 5000 # 8001是内部端口,是django的端口号
socket = 127.0.0.1:8001
#用户id
uid = 1000
#组id
gid = 2000 #存放进程文件的目录
pidfile = /home/BlogProject_uwsgi/master.pid
#存放日志文件的目录
daemonize = /home/BlogProject_uwsgi/BlogProject.log
# 服务器退出时自动清理环境
vacuum = true
BlogProject_uwsgi.ini里面参数的设定可参考官方文档https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/。
八、安装nginx和配置nginx.conf文件
进入home目录,执行下面命令
cd /home/
wget http://nginx.org/download/nginx-1.13.7.tar.gz
下载完成后,执行解压命令:
tar -zxvf nginx-1.15.11.tar.gz
移动至规范的放软件的目录下
mv nginx-1.15.11 /usr/local
安装,进入解压后的nginx-1.15.11文件夹,依次执行以下命令:
cd /usr/local/nginx-1.15.11/
./configure
make
make install
nginx一般默认安装好的路径为/usr/local/nginx
在/usr/local/nginx/conf/中先备份一下nginx.conf文件,以防意外。
cp nginx.conf nginx.conf.bak
然后打开nginx.conf,把原来的内容删除,直接加入以下内容:
events{
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80; #80是对外的端口号
server_name 47.112.128.209:80; #nginx代理uwsgi对外的ip,改为自己的域名,没域名修改为服务器ip地址
charset utf-8;
location /static/ {
alias /home/BlogProject/static/; #静态资源路径
}
location /media/ {
alias /home/BlogProject/media/; # #媒体资源路径
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001; #端口要和uwsgi里配置的一样
}
}
}
- 80是对外的端口号
- server_name:nginx代理uwsgi对外的ip
- 127.0.0.1:8001即当nginx收到80端口的请求时,直接将请求转发给 127.0.0.1:8001
要留意备注的地方,要和UWSGI配置文件BlogProject_uwsgi.ini,还有项目路径对应上。
进入/usr/local/nginx/sbin/目录
执行./nginx -t命令先检查配置文件是否有错:

如果出现上图红色方框的内容,则代表没有错,就执行以下命令,启动nginx:
./nginx
或者执行:
/usr/local/nginx/sbin/nginx #启动nginx
终端没有任何提示就证明nginx启动成功。可以使用你的服务器地址查看,成功之后就会看到一个nginx欢迎页面。
留意:一定要注意Uwsgi和Nginx配置文件里的项目路径和静态资源路径,填写正确了才能成功访问。不然会出现502错误。还有就是,修改Django文件和其它配置文件之后,一定要重启Uwsgi和Nginx,不然不生效。
之后,在settings.py里设置:(如果之前在本地项目设置过,可不用再设置)
a、关闭DEBUG模式。
DEBUG = False
b、ALLOWED_HOSTS设置为* 表示任何IP都可以访问网站。
ALLOWED_HOSTS = ['*']
九、访问项目的页面
1.启动uwsgi
uwsgi --ini /home/BlogProject_uwsgi/BlogProject_uwsgi.ini
执行完命令,如下图所示

查看uwsgi是否启动
ps -aux | grep uwsgi
如下图所示,表示uwsgi启动成功。

以上步骤都没有出错的话。
进入/usr/local/nginx/sbin/目录
执行:
./nginx -s reload
或者执行:
/usr/local/nginx/sbin/nginx -s reload
重启nginx 。
执行命令,查询nginx是否启动
ps -aux | grep nginx
如下图所示,表示nginx启动成功。

然后在浏览器里访问你的项目地址! (记得关闭系统防火墙或者在服务器安全组开放80端口)

访问之前建立的文件夹BlogProject_uwsgi,可以看到自动生成了日志文件(BlogProject.log)和进程文件(master.pid)。

我们可以利用进程文件(master.pid)进行uwsgi的重启,停止。
uwsgi --stop /home/BlogProject_uwsgi/master.pid #关闭uwsgi进程 uwsgi --reload /home/BlogProject_uwsgi/master.pid #重新加载uwsgi进程
除了利用进程文件(master.pid)进行uwsgi的开启,重启,停止,uwsgi还有以下方法进行操作。
Uwsgi和Nginx重启方法:
ps -aux | grep uwsgi ##查看Uwsgi进程,是否启动
killall -9 uwsgi #用kill方法把uwsgi进程杀死,然后启动uwsgi
uwsgi --ini /home/BlogProject_uwsgi/BlogProject_uwsgi.ini #启动uwsgi ps -aux | grep nginx ##查看nginx进程,是否启动
killall -9 nginx #用kill方法把nginx进程杀死
/usr/local/nginx/sbin/nginx #启动ngnix
/usr/local/nginx/sbin/nginx -s reload #Nginx平滑重启方法
关于线上部署admin后台样式没有生效的问题:
方法一:
1、在settings.py尾部:
STATIC_ROOT = os.path.join(BASE_DIR, 'BlogProject_collected')#指定样式收集目录
#或者
STATIC_ROOT = '/home/BlogProject/BlogProject_collected' #指定样式收集目录
2、收集CSS样式,在终端输入:
python manage.py collectstatic
运行这个命令之后,就会自动把后台CSS样式收集到/BlogProject_collected/目录下,如图所示。刷新页面就能恢复样式!

方法二:
在Python安装目录下(如果使用虚拟环境,则在虚拟环境目录下)找到\Lib\site-packages\django\contrib\admin\templates目录,把里面的admin目录复制到指定目录即可。
注意:以上两种方法在收集或复制前一定先在settings里配置并指定STATIC_ROOT路径,STATIC_ROOT路径可以自己定。指定的时候一定要在settings.py和nginx里指定新的路径。不然无法生效。

关于图片上传不到服务器,500错误 :
原因:上传文件的目录及其子目录没有写的权限。
解决方法:运行以下代码,给media目录及其子目录设定rwx权限。
chmod -R media #-R表示递归设置权限

关于日志文件的读写权限问题:
运行以下代码, 给BlogProject_debug.log设定rw权限。
chmod BlogProject_debug.log

基于centos7+nginx+uwsgi+python3+django2.0部署Django项目的更多相关文章
- 基于Nginx和uWSGI在Ubuntu上部署Django项目
前言: 对于做Django web项目的童鞋,重要性不言而喻. 参考:https://www.cnblogs.com/alwaysInMe/p/9096565.html https://blog.cs ...
- 转载:CentOS7下部署Django项目详细操作步骤
部署是基于:centos7+nginx+uwsgi+python3+django 之上做的 文章转自:Django中文网 https://www.django.cn/article/sh ...
- 腾讯云服务器部署 django项目整个流程
CentOS7下部署Django项目详细操作步骤 前记:购买腾讯云服务器,配置自选,当然新用户免费体验半个月,我选择的系统是centos7系统版本, 接下来我们来看整个配置项目流程. 部署是基于:ce ...
- nginx + uwsgi 部署django项目
因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...
- 使用uWSGI+nginx部署Django项目
最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...
- 使用Nginx+uWSGI部署Django项目
1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi l ...
- ubuntu18+uwsgi+nginx部署django项目
更新系统软件源 sudo apt-get update pip3安装 sudo apt install python3-pip 安装virtualenvwrapper pip3 install vir ...
- nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!
前言:自己在windows上用PyCharm编写的Django项目,编写完后在windows上运行一点问题都没有,但是部署到服务器上时却Bug百出.百度,CSDN,sf,各种搜索寻求解决方案在历时3天 ...
- linux上使用nginx、uwsgi部署django项目
参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...
随机推荐
- 电脑忘记WiFi密码了,但又想知道,该怎么办?
如何查看电脑已经连过的WiFi的密码? 你有没有遇到这样的情况,电脑之前连过的WiFi,正好手机也想连此WiFi,但是忘记密码了,没有WiFi的手机怎么能叫手机呢?.下面我们来看看如何查看已连接过的W ...
- .net core Ocelot实现API网关并部署在docker中
基于Ocelot(http://ocelot.readthedocs.io)搭建的API网关demo 软件以及系统版本: Asp.Net Core 2.2 Ocelot 13.5.0 CentOS ...
- mybatis缓存的设计
继续用提问的方式来看Mybatis的缓存设计. 1.Mybatis如何开启缓存 Mybatis对查询结果进行缓存,所以缓存的对象为具体的Statement 通过在Statement上是否使用缓存来启用 ...
- ionic2 调用 cordova非本地化native 插件方法
1,在项目中添加你的插件 cordova plugin add puginId|puginName|puginUrl|puginPath 2,查看插件clobbers标记 打开项目目录plug ...
- [WebService].net中WebService的使用实例
.net中WebService的使用实例 一.创建一个Webwebservice 1.新建一个项目WebserverDemo 2.在项目处添加新建项,添加一个web服务 3.编辑TestServer. ...
- MVC和WebApi的区别:
1.mvc 和WebApi: 区别: a.MVC是建立网站的一种框架,倾向于返回用户的页面请求:webApi倾向于返回用户数据请求 b.mvc直接继承system.mvc.controller:web ...
- Promise的一点感悟~
在什么大环境下? 今天要讨论的Promise,是js的同步|异步任务的概念下出来的 什么是同步?什么是异步? 我的理解: 一件事情Q 分三部分:Q1 , Q2 , Q3 同步方式完成: Q1 - ...
- 使用python函数持续监控电脑cpu使用率、内存、c盘使用率等
方法一: # import time 导入time模块 # import psutil 导入psutil模块 # def func(): # while True: ------->持续监控得w ...
- redis哨兵架构的基础知识及部署和管理
一.前言 1.哨兵的介绍 sentinal,中文名是哨兵 哨兵是redis集群架构中非常重要的一个组件,主要功能如下 ()集群监控,负责监控redis master和slave进程是否正常工作 ()消 ...
- java 基础排序算法
冒泡: 从左往右依次比较相邻的两个数,将小数放在前面,大数放在后面. public void bobSort(){ for(int i=0;i<length-1;i++){//排序 ...
