Django学习路线之将项目部署到阿里云服务器
Django虽然没有讲完,但是基础部分已经讲完了,根据前四篇文章:
- Django学习路线之从虚拟环境开始Django初体验
- Django学习路线之URL与视图
- Django学习路线之Django自带模板语言DTL
- Django学习路线之MySQL驱动安装及简单连接(文末附简单图书管理系统实例)
再加上这篇文章,您已经可以自己完成一个简单的Django项目了。但是,项目做出来是需要别人访问并使用的,因此还需要部署项目。
这篇文章是基于CentOS + nginx + uwsgi 的部署方法。
下面是四大步骤:
1. 生产环境部署准备
为什么要用云服务器部署?
像这样查到的ip地址,是动态变化的,可能重启一下路由就变了:
我们是通过IP地址访问网站的,而IP地址一变,就访问不到了,而用云服务器能固定IP
购买ECS云服务器
进入阿里云购买一台ECS云服务器,配置根据自己的需求进行选择,买的过程就不多说了,阿里云的产品文档写的都挺清楚的,系统选择CentOS,当然选择Ubuntu也是可以的,但是比较常用的还是CentOS
下面是已经购买好的ECS云服务器:
如果您是第一次使用云服务,还需要重置实例密码,具体操作可以查看阿里云的产品文档:
配置安全组规则
新建一个安全组规则,点击快速添加:
开放必要的端口:
为什么要配置安全组呢?
安全组负责管理是否放行来自公网或者内网的访问请求。
为安全起见,安全组入方向大多采取拒绝访问策略。
因此,如果不配置安全组,可能无法远程连接数据库等
通过Xshell测试连接云服务器
刚刚已经开放了端口22,下面我们就用Xshell访问服务器:
点击同意并保存:
这时输入系统的账户和密码:
这样就算连接成功了:
2. 阿里云部署安装必要的软件
安装Python3
CentOS 8.1 已经预先安装了Python3:
但是老版本只安装了Python2,如果你用的是老版本,那就需要手动安装Python3
1.安装依赖包
yum install opensll-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++ opensll-devel libffi-devel python-devel mariadb-devel
2.下载Python源码
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
tar -xzvf Python-3.7.3.tgz -C /tmp
cd /tmp/Python-3.7.3
3.把Python3.7安装到 /usr/local目录
./configure --prefix=/usr/local
make
make altinstall # 这一步比较耗时
4.更改/usr/bin/python链接
ln -s /usr/local/bin/python3.7 /usr/bin/python3
ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
安装maridb
mariadb跟MySQL是一样的,centos中已经集成了,安装非常简单
1.安装命令
sudo yum install mariadb-server
安装好后:
2.启动、重启
sudo systemctl start mariadb
sudo systemctl restart mariadb
开启数据库服务:
然后也可以show databases查看数据库,最后按Ctrl+C退出
下面我们试一下在本地连接一下服务器里的数据:
测试连接时是失败的,失败的原因是我们还需要绑定一下端口
3.设置安全规则,配置MySQL端口
在根目录下:
vim /etc/my.cnf
进入后:
输入 i 进入编辑模式:
添加两行:
[mysqld]
bind-address = 0.0.0.0
按ESC退出编辑模式,输入:wq保存并退出
重启服务:
sudo systemctl restart mariadb
然后再进入数据库:
4.设置外部ip可以访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
如下图所示:
这时回到SQLyog测试连接:
可以看到连接成功了,密码是刚刚的123456
这里说一句,为了演示方便,所以我设置了一个简单的密码,但是在实际项目中,密码应该复杂些,否则很危险
来show databases:
和本地查看的结果是一样的:
安装redis
yum install redis
service redis start
然后开启redis服务:
安装Nginx
sudo yum install epel-release
sudo yum install nginx
sudo systemctl start nginx
安装virtualenvwrapper
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
yum install python-setuptools python-devel
pip install virtualenvwrapper
3. 上传并启动项目
将项目所用到的本地数据库导出
先把本地的数据库文件导出:
将导出的数据库上传至服务器
下面我们把在本地导出的数据库导入服务器:
现在再来执行以下show databases:
查看里面的数据表:
查表:
这就是上一篇文章里用到的数据表
使用FileZilla上传项目文件
如下图所示连接服务器:
成功连接后:
选中需要上传的项目,右键点击上传即可:
成功上传:
回到Xshell,看一下文件有没有成功上传:
启动项目
还记得前几篇文章里讲的方法吗:
python3 manage.py runserver 0.0.0.0:8000
这里我们直接运行是会报错的,因为我们还有一些资源库没有安装:
下面我们把这些库都装一下,另外,我在安装mysqlcilent时出了点问题,这时我们先执行这一条命令:
yum install python3-devel mariadb-devel -y
然后再:
pip3 install mysqlclient
安装成功!启动项目:
这时咱们来访问一下:
这时我们要回到settings.py文件:
将ALLOWED_HOSTS改成*:
ALLOWED_HOSTS = ['*']
另外,正式上线的话,DEBUG = True应该也改一下
修改好以后,再来运行一下项目:
这时就可以正常访问了!
4. 配置Nginx以及uwsgi
刚刚已经成功把项目跑起来了,但是那样的方式其实并不是特别好,在访问时需要输入端口号,不安全
接下来我们通过使用uwsgi的方式来跑项目
安装uwsgi
pip3 install uwsgi
安装的过程中,可能会有一点慢
测试uwsgi
uwsgi --http :8000 --module django_db_demo.wsgi
出现下面的界面是正常的:
再来访问一下网站:
配置Nginx
先在项目的目录下新建一个名为conf的文件夹,再在conf这个文件下新建两个目录,分别是nginx和uwsgi:
在nginx下新建一个uc_nginx.conf文件并在里面添加以下内容:
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name 101.201.181.229; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /root/logic_online/media; # 指向django的media目录
}
location /static {
alias /root/logic_online/static; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
这里要注意的是,server_name要改成自己的域名或IP
然后再在uwsgi这个目录下新建uwsgi.ini配置文件,并添加如下内容:
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /root/django_db_demo
# Django's wsgi file
module = django_db_demo.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = 127.0.0.1:8001
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
virtualenv = /root/.virtualenvs/django_db_demo
#logto = /tmp/mylog.log
如果不用虚拟环境,后面那块可以不写:
- chdir:表示需要操作的目录,也就是项目的目录
- module:wsgi文件的路径
- processes:进程数
- virtualenv:虚拟环境的目录
然后将这个conf文件夹上传至服务器:
在用之前,我们先来改一个文件:
vim /etc/nginx/nginx.conf
将nginx改成root
重启Nginx服务:
sudo systemctl restart nginx
将改配置文件加入到Nginx的启动配置文件中
sudo ln -s 你的目录/logic_online/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/
当然也可以直接找到这个文件,然后用cp命令复制过去:
cp uc_nginx.conf /etc/nginx/conf.d/
执行完以后记得重启Nginx服务:
sudo systemctl restart nginx
接下来进入项目所在目录,并执行以下命令即可:
uwsgi yourfile.ini
这时就不需要输入端口号了:
到这里,Django项目就全部部署结束了!