django项目基于nginx + uwsgi阿里云线上部署经验总结

当我第一次接触python的时候,就会联想项目如何部署,最简单的就是用django做了一个简单的demo项目,学习了django的用法之后,我就迫不及待的研究线上部署,十分猴急,担心费半天劲开发的项目部署不上去完蛋了,我这个人的性格就是想得比较远
平常我们使用django开发项目的时候使用一下命令启动django自带的服务器

python3 manage.py runserver [端口号]

这是我们的django为了方便我们开发,给我提供的简单服务器,当我们真正项目开发完成之后,部署到线上服务器,比如阿里云,不建议还以这样的方式启动服务器,首先是太low,另外对多线程高并发和静态文件等支持不好,性能上不推荐这么做,但是这个有个优点就是方便,当你更改了代码之后,不需要重启服务器,会自动为你加载,所以说这个服务器只适用本地电脑开发阶段使用,推荐nginx反向代理加uwsgi来部署项目

1. 三者之间的关系图

image.png

那么问题来了,这三者在一起的工作原理是什么?
1. 一般来说,客户端发起的http/https请求首先到达了我们的Web服务器(在这里我们使用Nginx作为我们的服务器)。
2. Web服务器收到请求后,对请求进行解析处理(一般来说如果是静态请求,直接返回静态页面(纯HTML页面)),然后将请求发送给uWSGI。
3. uWSGI对来自Nginx的请求进行处理,将处理后的结果发送给Web应用框架(在这里我们使用Django)。
4. Web应用框架收到请求之后,Web应用对请求进行处理(例如,Django通过某个函数进行处理),将结果返回给uWSGI。
5. uWSGI收到Web应用框架的处理结果后,对该结果进行处理打包,发送给Web服务器。
6. Web服务器将收到的结果返回给客户端。
这三者之间信息的传递涉及到数据格式以及协议的转换。

2.开始部署项目

我这里简单创建了一个django项目,命名haomai,简单做了个模板加载和model创建,在开发电脑上django自带的服务器上运行正常,现在我准备部署到我的阿里云服务器,我的服务器是centos7

2.1软件准备

1.安装nginx
2.安装mysql
3.安装python3(centos7默认自带python2,我喜欢3,在安装个python3)
原先我是做php的,其实我的服务器之前我已经安装过了nginx和mysql,我用的宝塔面板可视化安装的,非常方便,具体的安装步骤我就不给大家说了,安装教程百度一大把,确保这两个软件安装成功即可,下面我直接说python3的安装步骤,我写这篇文章的内容不是交大家如何安装软件,是对我遇到的坑给大家做个总结,希望能帮到大家

2.2 python3安装步骤

前提通过ssh登录进入你的远程服务器,具体 ssh root@xxxxxx
1.安装相应的编译工具
在root用户下(不要用普通用户,麻烦),全部复制粘贴过去,一次性安装即可.

yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install -y libffi-devel zlib1g-dev
yum install zlib* -y

2.下载安装包
我指定下载到/usr/local目录下,先cd /usr/local,这个路径随意,你想放哪就放哪
这里我安装的python版本号是3.8.2

wget wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz

3.解压

tar -xvJf  Python-3.8.2.tar.xz

4.创建编译安装目录

mkdir /usr/local/python3 

5.安装

cd Python-3.8.2
./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl 
#第一个指定安装的路径,不指定的话,安装过程中可能软件所需要的文件复制到其他不同目录,删除软件很不方便,复制软件也不方便.
#第二个可以提高python10%-20%代码运行速度.
#第三个是为了安装pip需要用到ssl,后面报错会有提到.
make && make install

我这一步是按照失败的,具体原因是我的gcc版本太低,是4.几的,是不支持 --enable-optimizations的,gcc8以上版本修复了这个问题,所以我的解决方案就是升级gcc版本,你若是安装成功了,就跳过下面gcc升级步骤

6.升级gcc

sudo yum install centos-release-scl
sudo yum install devtoolset-8-gcc*
scl enable devtoolset-8 bash
which gcc
gcc --version

我们在执行上面5步骤,这样就会安装成功,到此为止,我们python3 安装完成

7.创建软链接

ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3

8.验证是否成功

python3 -V
pip3 -V

2.3导出项目依赖

我们本地电脑开发的时候安装了很多第三方软件,当我们部署到远程服务器的时候我们也得需要这些软件,比如pymysql等,我们有两个方法安装

1.在远程服务器上一个一个通过pip3 install xxxx安装
2.导出依赖txt文件,通过txt文件一口气安装
这里我们大家肯定倾向第二种方法,简单省力,我个人的习惯是把依赖文件导出放到我的项目根目录,这样这个文件就不会丢,我部署服务器喜欢使用git传输部署,你也可以使用filezilla,只要把项目传到远程服务器即可

导出导入步骤如下

1.先cd到项目根目录(我是想把这个txt放在项目根目录)
2.pip3 freeze > requirements.txt #导出
3. pip3 install -r requirements.txt #导入

这样我们就会在远程服务器安装我们的依赖软件,比如我们的uwsgi就会安装成功

2.4配置uwsgi

先给uwsgi创建软连接,要不然找不到uwsgi

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

在项目wsgi.py同级目录下创建uwsgi.ini文件,添加如下配置


#ini file
[uwsgi]
# Django-related settings
#这里我使用9999端口,8000端口被django自带的服务器占用了,您随意
socket  = 127.0.0.1:9999
#sock是项目自动生成的,直接指定生成的路径即可,当然要和Nginx配置文件的相同

#经验证可以写相对路径,这样有个好处就是本地电脑和线上服务器不用来回切换全路径
chdir      = ../

# Django s wsgi file
#haomai是项目名,可以ls检查看看
module     = haomai.wsgi:application

# process-related settings
# master
master     = true
# maximum number of worker processes
processes    = 2

workers = 4

# clear environment on exit
vacuum     = true

chmod-socket = 755

thunder-lock = true

harakiri = 30

post-buffering = 4096

pidfile=  uwsgi.pid

daemonize   = ../uwsgi_log.log

现在我们启动uwsgi
在uwsgi.ini目录下执行以下命令
启动之后会在同目录下生成uwsgi.pid文件,具体文件名称和目录是上面配置文件中pidfile项配置的

#启动
uwsgi --ini uwsgi.ini
#停止
uwsgi --stop uwsgi.pid
#刷新重载
uwsgi --reload uwsgi.pid

想查看uwsgi运行状态,执行以下查看

ps gux | grep uwsgi

在上面的我们的配置文件中有两个选项daemonize和pidfile都会生成文件,由于我本地电脑也搭建了此环境,当我在本地运行的时候,在上传到远程git 会把这两个文件提交上去,远程服务器也会生成这两个文件,这样有时拉去代码会发生冲突,我的习惯是gitignore文件中忽略此文件,之前我没有忽略,引起了远程服务器uwsgi.pid的内容跟当前启动的进程号对不上的情况,我是重启远程服务器得以解决

2.5 配置nginx服务器

nginx反向代理服务器和uwsgi是通过socket通信的,找到nginx的配置文件,配置如下

server {
    listen      8080;
    #server_name www.ziqiangxuetang.com;
    charset     utf-8;
 
    client_max_body_size 75M;
 
    location /static {
        alias /Users/shuaijiguang/Documents/项目仓库/我的项目/Django学习/haomai/haomai/static;
    }
 
    location / {
        uwsgi_pass  127.0.0.1:9999;
        include     /Applications/MAMP/conf/nginx/uwsgi_params;
    }
}

若你不知道uwsgi_params在什么地方,你可以通过以下命令查找到具体在什么地方

find / -name uwsgi_params

3. 404页面配置

django为我们提供了非常方便的方法,我们只需要在项目根目录创建个templates文件中放入一个404.html模板文件即可,django会在找不到路由的情况的自动加载此模板,但是还得在setting.py配置下templates目录,要不然找不到,如下配置DIRS,(只有在debug = False正式环境下才会生效)


image.png

4.修改django配置

上线前我们需要把setting.py中的debug = True 改为debug = False,同事添加允许访问的域名

DEBUG = True
ALLOWED_HOSTS = ['*']

5.导出静态文件
我们上传到远程服务器需要导出静态文件,同样在setting.py设置导出路径

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

然后运行一下命令

python3 manage.py collectstatic

这样就会把我们在开发环境使用的静态文件导入到了项目根目录一个static文件夹下面

注意

我们上线时候,需要在远程服务器mysql中创建一个该项目的数据库,记得一定做迁移,无非也就是下面两个命令

python3 manage.py makemigrations
python3 manage.py migrate

我们后台的超级用户也需要重新创建,该用户是保存在数据库中的

python3 manage.py createsuperuser

还有一点就是数据库配置中HOST 一定写上127.0.0.1,不要写localhost,我这边写localhost在我的mac环境中没有问题,在远程阿里云是连接不上,具体原因还不清楚,以后有时间在查下

基本上我们的服务器上面部署差不多了,我们通过git 提交到远程,然后创建个tag v0.0.1版本,代表上下发布的,然后通过远程服务器拉去,切换到当前的v0.0.1tag,重启uwsgi,不出意外你就部署完成了

坚持一个原则

1.更改django文件,想要看到效果,一定重启uwsgi,一定,一定,重要事情说三遍
2.更改nginx配置文件重启nginx
以上是我自己一点一点实践出来的,问题也在上面总结了,后来在社区发现一个部署文章,基本和我流程一致,推荐给大家,供大家参考 https://www.django.cn/article/show-4.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容