基于uwsgi+nginx+centos的Django项目部署经历
1.起因
寒假之前,我滴帅部长召哥给我们布置寒假作业:要求我们每个人把上个学期写的电商项目给部署到远程服务器上面。然后他也没告诉我们具体怎么去部署。我就自己在网上找教程,跌跌撞撞摸索出了部署的流程。
2.选择服务器
要把Django部署上远程服务器,首先得有一台远程服务器。之前寄导课做实验,给了我们每个人华为云两百大洋的代金券,我才用了几块钱,本来想买华为云的,但是召哥推荐我们买良心云(腾讯云)和套路云(阿里云),然后我就用学生优惠花40大洋买了一年的腾讯云2H2G+40G的轻量应用服务器,性能对我来说还是够用的。
镜像我装了centos,至于为什么没用宝塔,主要使我想体验一下比较纯正的服务器体验。
3.配置环境
我配置服务器主要参考腾讯云服务器部署 django项目整个流程 - lvye001 - 博客园 (cnblogs.com)这篇文章,剩下的细节和问题都是在网上不停搜索解决的。
1)安装Python3.9.5
在安装python之前,先升级一下包管理工具,在安装一下可能用到的依赖。
1 | yum update -y |
然后再进入/usr/local路径下,
1 | cd /usr/local |
下载Python3.9.5到/usr/local目录
1 | wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz |
下载有亿点点慢,耐心等等或者也可以在自己的电脑上下载好,在上传到服务器上。下载完毕,解压安装
1 | tar -zxvf Python-3.9.5.tgz |
编译安装到指定路径
1 | ./configure --prefix=/usr/local/python3 |
/usr/local/python3 路径可以自己指定,自己记着就行,下边要用到。
安装python3
1 | make |
安装完成之后 建立软链接 添加变量 方便在终端中直接使用python3(这一步很重要,可以为后边步骤提供不少便利)
1 | ln -s /usr/local/python3/bin/python3.9 /usr/bin/python3 |
Python3安装完成之后pip3也一块安装完成,不需要再单独安装
一样建立软链接
1 | ln -s /usr/local/python3/bin/pip3.9 /usr/bin/pip3 |
全局环境下安装了Python3.9.5,但是一般Django部署到虚拟环境好一点,方便管理package。安装virtuallenv
1 | pip3 install virtualenv |
建立软连接
1 | ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv |
然后在和项目同级目录下,创建虚拟环境
1 | mkdir -p /Django/env |
然后进入/Django/env/pyweb/bin
启动虚拟环境:
1 | cd /Django/env/pyweb1/bin |
2)安装Django包依赖
在windows上,我们开发Django项目的环境可能有非常多的包,我们不可能在服务器上一一手动安装,这时候就需要用到批量安装了
在Windows下,导出pip安装的包到requirements.txt里
1 | pip freeze > requirements.txt |
然后把这个文件上传到服务器,在这个文件同目录下批量安装
1 | pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt #这里换了清华的源,加速安装 |
3)CentOS7安装MySQL
数据库嘛,没什么好说的,我用的是MySQL
(1)下载并安装MySQL官方的Yum Repository
1 | wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm |
(2) 使用上面的命令就直接下载了安装用的Yum Repository,大概25KB的样子,然后就可以直接yum安装了。
1 | yum -y install mysql57-community-release-el7-10.noarch.rpm |
(3)安装MySQL服务器
1 | yum -y install mysql-community-server |
(4)MySQL数据库设置
启动数据库
1 | systemctl start mysqld.service |
查看MySQL运行状态,如图所示:
1 | systemctl status mysqld.service |
此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:
1 | grep "password" /var/log/mysqld.log |
图中圈出来的部分就是默认密码,用如下命令进入数据库:
1 | mysql -uroot -p |
登录时会提示你输入密码,这时密码输入之后时没有显示的。
登陆后,修改密码
1 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password'; |
其中‘new password’替换成你要设置的密码,注意:密码设置必须要大小写字母数字和特殊符号(,/‘;:等),不然不能配置成功
(5)开启mysql的远程访问
这个过程比较玄学,容易失败,首先先试试直接授权法
1 | grant all privileges on *.* to 'root'@'192.168.0.1' identified by 'password' with grant option; |
成功后再输入下面两行命令:
1 | mysql> flush privileges; |
这是将root账户开放给192.168.0.1也就是本地,在测试阶段,可以选择将上述IP换成%,这样所有IP均可远程访问。
如果上面的方法不生效,再试试修改表法
1 | use mysql; |
先观察表里的root账户的主机是什么,然后再将其修改成%即可,这里是将127改成localhost
更改后:
最后在windows远程测试:
1 | mysql -h 101.43.216.170 -P 3306 -uroot -p |
也可以用可视化的第三方工具(比如navicat)
如果开放了远程权限,仍然连不上远程MySQL,有可能是服务器的防火墙,我用的腾讯云默认是不开放3306端口,所以得自己在防火墙开放3306端口后我才可以正常访问。
4)reids的安装(可选)
redis是很好用的缓存服务器,可以大大提升缓存资源的访问,安装和使用也很简单,首先先下载redis的包,这里我安装的是6.2.6的版本,因为旧版本编译失败了
1 | cd /usr/local |
编译安装完成后,就可以启动redis服务了。但是再次之前,还得先设置一下,让redis可以在后台运行
1 | cd /usr/local/redis-6.2.6 |
打开redis.conf配置文件,修改daemonize,将no修改成yes
然后保存退出就可以后台启动redis服务了(下面这条命令是在redis解压目录下执行)
1 | ./src/redis-server ./redis.conf |
启动服务后,可以查看进程来查看redis是否正常运行
1 | ss -tnl |
redis 的很多设置例如:设置密码,远程访问,持久化等,
然后在这里介绍Django-redis:
1 | pip install django-redis |
直接通过pip就能安装,然后再修改Django项目中的缓存配置
1 | # redis作为Django缓存和session存储后端的标准配置 |
或者简单一点的配置:
1 | CACHES = { |
5)安装和配置uwsgi
首先,先安装uwsgi
1 | pip install uwsgi |
配置uwsgi,在项目根目录下(manage.py同层目录),新建uwsgi.ini,输入以下内容
1 | # mysite_uwsgi.ini file |
然后启动uwsgi
1 | uwsgi -i uwsgi.ini # 启动 |
通过查看日志或者查看端口状态观察uwsgi是否开启成功
1 | tail -f uwsgi.log #在manage.py目录下 |
6)配置Django项目
在成功配置和启动uwsgi服务后,接下来可以开始配置Django项目了。
首先先把Django项目打包丢到服务器的Django目录下再解压,然后修改settings.py文件的内容
(1)收集静态文件
1 | DEBUG = False #调试的时候可以打开 |
(2)创建数据库
1 | mysql -uroot -p #进入数据库 |
1 | CREATE DATABASE table_name CHARACTER SET = UTF8; #table_name要与Django项目中的保持一致 |
(3)创建数据库缓存表(可选)
如果在Django的缓存配置中,启用了数据表缓存,则需要在服务器上创建一个缓存用的数据表
1 | python manage.py createcachetable #在manage.py目录下 |
(4)初始化数据表
差不多到了最后一步,现在只要初始化一下数据表就可以跑起来了
1 | python manage.py makemigrations #检查数据库是否有变化 |
完成了上面这些步骤之后,可以使用Django自带的服务器来查看项目是否已经可以运行:
1 | python manage.py runserver 0.0.0.0:8000 |
7)安装和配置nginx
切进 该 /usr/local/ 目录下,执行下面命令
1 | wget http://nginx.org/download/nginx-1.13.7.tar.gz |
下载完成后,执行解压命令
1 | tar -zxvf nginx-1.13.7.tar.gz |
进入解压后的nginx-1.13.7文件夹,依次执行以下命令:
1 | ./configure |
nginx一般默认安装好的路径为/usr/local/nginx
在/usr/local/nginx/conf/中先备份一下nginx.conf文件,以防意外。
1 | cp nginx.conf nginx.conf.bak |
然后打开nginx.conf,把原来的内容删除,直接加入以下内容:
1 | user root; |
配置完成后,启动nginx
1 | ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #建立软连接 |
这时,通过查看端口开放情况,就可以知道nginx是否启动成功,
然后再记得去服务器控制面板处开放想对应的端口访问权限,此时,去浏览器里,输入IP+端口即可访问网站:
至此,服务器就可以算搭好了,其他的功能就需要各位自己去探索了。