腾讯云部署Django Web 项目全流程(腾讯云Centos7.6+ Python-3.8.2 + Apache-2.4 + MySQL-5.7 + Django-2.2 部署Web项目)


腾讯云Centos7.6+ Python-3.8.2 + Apache-2.4 + MySQL-5.7 + Django-2.2 部署Web项目)

前言

开发环境详情
云服务器系统腾讯云 Centos7.6
远程连接工具Xshell + Xftp
编程语言环境Python-3.8.2
部署工具Apache2.4 + wsgi
Web框架Django 2.2
数据库MySQL 5.7

PS:Xshell连接云服务器的就直接略过了,相信这点小事情,大家早已独自完成了

准备工作

  • 更新系统各个软件包
yum update -y
  • 规划目录
  • 由于整个安装配置部署过程中会有很多的源码包进行下载,因此我在 /opt/ 目录下新建一个“install_pack”的目录专门用于存放所有下载的内容和执行编码的专用路径,在全部安装完成后,发明后年直接删除
  • 所有环境的安装制路径制定在**/usr/local/下,例如Python-3.8.2安装在/usr/local/python38/**
  • 升级GCC很重要!! 非常重要!!超级重要!!
    一般我们默认的gcc版本是4.8.5
    可以执行 gcc --version 查看
# 下载gcc8.3.0
wget https://mirrors.ustc.edu.cn/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.xz
# 解压
tar -vxf gcc-8.3.0.tar.xz
# 进入解压目录
cd  gcc-8.3.0/
# 下载依赖包
./contrib/download_prerequisites
# 安装scl源
yum install centos-release-scl scl-utils-build
# 安装8版本的gcc、gcc-c++、gdb工具链(toolchian)
yum install -y devtoolset-8-toolchain devtoolset-8
# devtoolset
scl enable devtoolset-8 bash
# 检查
gcc --version

成功安装

一、Python 安装

1.安装依赖

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel

yum -y install epel-release

2.Python下载

首先先去到Python官网,找到自己需要的源码包进行下载
在这里我下载的是Python-3.8.2.tgz
两种下载方式:

  1. 一种是在自己的电脑上下载,然后通过xftp上传到云服务器中
  2. 另一种是直接在云服务器中通过wget进行下载

这里采用第二种方式,通过wegt进行下载

# 进入到事先建好的install_pack
cd /opt/install_pack/
# 在官网找到下载链接,复制到wget后回车开始下载
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz

等待下载完成即可下载
下载完成后,对下载好的压缩包进行解压

# 解压
tar -zxvf Python-3.8.2.tgz

3.Python3 安装

由于我们是进行源码安装,而在linux下源码安装分为3个步骤

  1. 配置(./configure
  2. 编译(make
  3. 安装(make install
# 配置 --prefix==安装路径,按照之前的规划好的目录将安装在/usr/local/python38
./configure --prefix=/usr/local/python38
# 编译和安装命令通过 && 链接,先后执行
make && make install

4.Python3 软连接-环境变量配置

而linux不像我们的window可以自行添加环境变量
所以要配置一下软连接

# 配置python3软连接
ln -sf /usr/local/python38/bin/python3 /usr/bin/python3
# 配置pip3软连接
ln -sf /usr/local/python38/bin/pip3 /usr/bin/pip3

环境变量配置

# vim 打开配置文件
vim /etc/profile
# 在文件的最底部加入如下代码
PATH=$PATH:$HOME/bin:/usr/local/python38/bin
export PATH
# 生效配置
source /etc/profile
# 进入/etc/ld.so.conf.d
cd  /etc/ld.so.conf.d
# vim 编辑 python3.conf
vim python3.conf
# 添加 /usr/local/python38/lib 
/usr/local/python38/lib
# 保存退出后,运行ldconfig (动态链接管理)
ldconfig

5.Python3 环境测试

这个时候我们先测试一下

# 打印python3版本号
python3 -V
# 打印pip3的版本号
pip3 -V

在这里插入图片描述
诶,这时候就有一个问题了,我们下载安装配置的是3.8.2,但是输出版本的却是3.6.8。
不慌!这个3.6.8是我们腾讯云自带的python3,我们已经安装了python3.8.2,那就不需要自带的了,为了避免后面的冲突,我现在将python3.6.8卸载,在配置一次就可以了

# 卸载自带的 python3.6.8
yum remove python3

卸载完成后再次测试
配置结果

二、Apache 安装

1.Apache 下载

安装apache一共下载四个包

  1. Apr:http://archive.apache.org/dist/apr/apr-1.5.2.tar.gz
  2. Apr-Util:http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz
  3. pcre:http://jaist.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz
  4. Apache:https://mirror.bit.edu.cn/apache//httpd/httpd-2.4.46.tar.gz

首先我们回到install_pack目录中,并将以上4个包下载下来

# 回到install_pack
cd /opt/install_pack/
# 下载Apr
wget http://archive.apache.org/dist/apr/apr-1.5.2.tar.gz
# 下载Apr-Util
wget http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz
# 下载pcre
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz
# 下载Apache
wget https://mirror.bit.edu.cn/apache//httpd/httpd-2.4.46.tar.gz

2.安装依赖

yum -y install gcc**

3.Apr 的 解压-配置-编译-安装

# 解压
tar -zxvf apr-1.5.2.tar.gz
# 进入解压目录
cd apr-1.5.2/
# 配置
./configure --prefix=/usr/local/apr/
# 编译 && 安装
make && make install
# 安装完成,回到上级目录install_pack
cd ../

4.Apr-Util 的 解压-配置-编译-安装

# 解压
tar -zxvf apr-util-1.5.4.tar.gz
# 进入解压目录
cd apr-util-1.5.4/
# 配置
./configure --prefix=/usr/local/apr-util/  --with-apr=/usr/local/apr/
# 编译 && 安装
make && make install
# 安装完成后,回到上级目录install_pack
cd ../

5.pcre 的 解压-配置-编译-安装

# 解压
tar -zxvf  pcre-8.39.tar.gz 
# 进入解压目录
cd pcre-8.39/
# 配置
./configure --prefix=/usr/local/pcre/
# 编译 && 安装
make && make install
# 安装完成后,回到上级目录install_pack
cd ../

6.Apache 的 解压-配置-编译-安装

# 解压
tar -zxvf httpd-2.4.46.tar.gz 
# 进图解压目录
cd httpd-2.4.46/
# 配置
./configure --prefix=/usr/local/apache24/  --with-apr=/usr/local/apr/  --with-apr-util=/usr/local/apr-util/  --with-pcre=/usr/local/pcre/
# 编译 && 安装
make && make install

7.服务器配置

由于我们是在服务器上进行配置,我们希望可以通过网络直接访问到我们的服务器,那我们需要对我们的服务器进行一些小小的配置
编辑apache的配置文件httpd.conf 配置 ServerName

vim /usr/local/apache24/conf/httpd.conf
# 修改ServerName ,其中xxx.xxx.xxx.xxx 是你服务器的ip地址
ServerName xxx.xxx.xxx.xxx:80

修改ip

8.初次启动服务器

# 进入apache的安装路径下的bin目录
cd /usr/local/apache24/bin/
# 启动服务器
./apachectl start

打开浏览器 输入服务器的公网ip,就会显示It works!,如图所示
这表示服务器已经在工作了
在这里插入图片描述

三、mod_wsgi 安装

1.mod 下载

cd /opt/install_pack
# wget 下载mod_wsgi 4.7.1
wget https://codeload.github.com/GrahamDumpleton/mod_wsgi/tar.gz/4.7.1

2. mod_wsgi 的 解压-配置-编译-安装

# 解压
tar -zxvf 4.7.1
# 进入解压目录
cd mod_wsgi-4.7.1/
# 配置
./configure --with-apxs=/usr/local/apache24/bin/apxs --with-python=/usr/local/python38/bin/python3
# 编译 && 安装
make && make install

如果在编译的时候遇到这样一个问题,如图

apxs:Error: Command failed with rc=65536

在这里插入图片描述
嗯~,麻烦去到准备工作那里,升级下GCC

如图所示,就是安装成功了!
在这里插入图片描述

四、MySQL数据库安装

腾讯云 MySQL数据库的安装有在另外一篇博客,全面介绍,有需要数据库的可以移步看一下,不需要的可以直接跳过此步骤
腾讯云CentOS系统安装MySQL

五、安装Django

1.安装Django

# 通过pip3安装 Django 2.2是版本
pip3 install Django==2.2
# 通过pip3安装 pillow
pip3 install pillow

在这里插入图片描述

2.安装数据库工具包

安装数据库操作工具包
在这里插入图片描述
安装Python数据库客户端(不需要的可以跳过)

pip3 install mysqlclient

在这里插入图片描述

六、上传/创建 项目到服务器

A.新建测试项目(不需要数据库)

  • 我们先在云端服务器做一个简单的测试,由于我们的运行环境已经全部部署完成,那么我直接在云端服务器中建立一个新的django项目直接进行部署:
    现在data 目录下新建一个 WebDjangoPro的文件夹

1.新建项目

# 进入目录/data/
cd /data/
# 创建目录 WebDjangoPro
mkdir WebDjangoPro
# 进入目录
cd WebDjangoPro
# 创建Django项目 Test
django-admin startprogect test_django
# 进入项目目录
cd test_django/test_django/
# vim打开 wsgi.py
vim wsgi.py

2.编辑配置文件

编辑setting.py中的ALLOWED_HOSTS

# 默认是ALLOWED_HOSTS = [],修改成如下
ALLOWED_HOSTS = ["*"]

在这里插入图片描述

编辑的wsgi.py文件内容如下:
要注意 引入 sys 包

import os,sys

from django.core.wsgi import get_wsgi_application
# python安装路径
sys.path.append('/usr/local/python38/bin/')
# 项目路径
sys.path.append('/opt/WebDjangoPro/test_django')

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Test.settings')

application = get_wsgi_application()

编辑Apache 的配置文件 httpd.conf
在文件的最下面加入

LoadModule wsgi_module modules/mod_wsgi.so
<VirtualHost *:80>
    DocumentRoot  "/data/WebDjangoPro/test_django" # 项目路径
    WSGIScriptAlias  / "/data/WebDjangoPro/test_django/test_django/wsgi.py" # 项目的wsgi.py路径
    <Directory  /data/WebDjangoPro/test_django>
        AllowOverride all
        Require all granted
    </Directory>
</VirtualHost>

保存退出后,我们重启一下apache服务

# 进入目录
cd /usr/local/apache24/bin
# 重启服务
apachectl restart

3.首次浏览器测试

重启服务完城后,打开浏览器 输入服务器的公网ip,理论上来讲,到这里,项目就算部署成功了,浏览器中就会显示django自带的界面了
可以说,万万没想到,报错了!报错如图所示:
在这里插入图片描述
这个报错是:500 服务器内部错误,不要慌,网页中的错误信息呢也提示我们了,具体的报错信息可以在日志中查看。
在apache的安装目录下的logs子目录中,有一个error_log的文件,就是我们的错误信息日志文件。

# 打开文件
vim /usr/local/apache24/logs/error_log

错误日志信息如下:
在这里插入图片描述

AH00489: Apache/2.4.46 (Unix) mod_wsgi/4.7.1 Python/3.8 configured -- resuming normal operations
AH00094: Command line: '/usr/local/apache24//bin/httpd'
mod_wsgi (pid=31076): Failed to exec Python script file '/opt/WebDjangoPro/test_django/test_django/wsgi.py'.
mod_wsgi (pid=31076): Exception occurred processing WSGI script '/opt/WebDjangoPro/test_django/test_django/wsgi.py'.
Traceback (most recent call last):
  File "/opt/WebDjangoPro/test_django/test_django/wsgi.py", line 20, in <module>
    application = get_wsgi_application()
  File "/usr/local/python38/lib/python3.8/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
    django.setup(set_prefix=False)
  File "/usr/local/python38/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/python38/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/usr/local/python38/lib/python3.8/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/local/python38/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/local/python38/lib/python3.8/site-packages/django/contrib/auth/models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/usr/local/python38/lib/python3.8/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "/usr/local/python38/lib/python3.8/site-packages/django/db/models/base.py", line 117, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/usr/local/python38/lib/python3.8/site-packages/django/db/models/base.py", line 321, in add_to_class
    value.contribute_to_class(cls, name)
   File "/usr/local/python38/lib/python3.8/site-packages/django/db/models/options.py", line 204, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/usr/local/python38/lib/python3.8/site-packages/django/db/__init__.py", line 28, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/usr/local/python38/lib/python3.8/site-packages/django/db/utils.py", line 201, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/usr/local/python38/lib/python3.8/site-packages/django/db/utils.py", line 110, in load_backend
    return import_module('%s.base' % backend_name)
  File "/usr/local/python38/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/usr/local/python38/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 66, in <module>
    check_sqlite_version()
  File "/usr/local/python38/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 63, in check_sqlite_version
    raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

4.升级安装SQLite

错误提示我们的SQLite版本过低(服务器版本找到l3.7.17),但是需要 3.8.3即以上版本的SQLite
接下来进行SQLite的更新安装

# 进入安装的专用目录
cd /opt/install_pack
# 下载SQLite 
wget wget https://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz
# 解压
tar xvzf sqlite-autoconf-3070500.tar.gz
# 进入解压目录
cd sqlite-autoconf-3270200/
# 配置
./configure --prefix=/usr/local/sqlite
# 编译 && 安装
make && make install

检查版本

# 检查系统自带版本
/usr/bin/sqlite3 --version
# 检查自己安装的按sqlite版本
/usr/local/sqlite/bin/sqlite3 --version
# 检查环境按量中的sqlite
sqlite --version

检查版本
可以看到虽然我们安装的版本已经是3.27.2版本,但是环境加载的还是系统自带的3.7.17版本
接下来软连接讲新的sqlite3配置到 目录 /usr/bin/

# 首先我们将原先的sqlite软连接备份
mv /usr/bin/sqlite3 /usr/bin/sqlite3_bak
# 设置新的软连接
ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
'''
当然如果想省事的话也可以不备份直接覆盖原来的链接,一条命令即可
'''
ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3

检查环境

sqlite3 --version

在这里插入图片描述
修改共享库

# 打开编辑 /etc/profile
vim /etc/profile
# 在文件的最底下加入如下代码
export LD_LIBRARY_PATH="/usr/local/sqlite/lib"
# 保存退出,生效配置
source /etc/profile

最后检查python3调用sqlite3的版本

# 进入python3 交互
python3
# 导入sqlite3
import sqlite3
# 打印sqlite3版本
print( sqlite3.sqlite_version )

效果如图所示:
在这里插入图片描述

sqlite3 安装完成后重启一次服务器

# 重启服务器
reboot

重启之后进入Apache的bin目录,启动Apache服务

# 进入Apache的bin目录
cd /usr/local/apache24/bin/
# 启动apache服务
./apachectl start

5.最终测试

打开浏览器 输入服务器的公网ip
在这里插入图片描述
哦~舒服了!

B.上传项目到服务器(需要数据库)

1.修改项目 setting.py 和 wsgi.py

在上传之前,我要先将wsgi.py文件的内容修改好,修改内容和上面一样,如图所示
在这里插入图片描述
同样的setting.py中的ALLOWED_HOSTS也要做出修改
在这里插入图片描述
同时由于该项目需要数据库,因此需要配置数据库信息
在这里插入图片描述
HOST:数据库坐在主机地址,本地就可以用localhost

2.上传为项目到服务器

将项目上传到 目录/opt/WebDjangoPro/
在这里插入图片描述

3.配置Apache

上传完成后再服务其中修改Apache的httpd.conf配置文件
过程省略,直接上结果
在这里插入图片描述
相比于上面不同的这里设置了静态资源(在上面的图片中我打了绿框)的,毕竟还网页,有许多的js、css、图片等需要加载

# 在/usr/local/apache24/conf/httpd.conf 末尾加入如下代码
LoadModule wsgi_module modules/mod_wsgi.so
<VirtualHost *:80>
    DocumentRoot  "/opt/WebDjangoPro/Question_Bank/" # 项目路径
    WSGIScriptAlias  / "/opt/WebDjangoPro/Question_Bank/Question_Bank/wsgi.py" # 项目的wsgi.py路径
    Alias /static/ "/opt/WebDjangoPro/Question_Bank/static/" # 项目的静态资源文件路径
    <Directory  /opt/WebDjangoPro/Question_Bank/static>
        Require all granted
    </Directory>
    <Directory  /opt/WebDjangoPro/Question_Bank>
        AllowOverride all
        Require all granted
    </Directory>
</VirtualHost>

4.生成数据库迁移文件,创建表结构

由于数据库是在另一台服务器上,并且已经预先创建好数据库,这里不再详解

# 生成迁移文件
python3 manage.py makemigrations
# 创建表结构
python3 managa.py migrate

5.重启Apache服务

# 进入Apache bin目录,并重启
cd /usr/local/apache24/bin/
./apachectl restart

6.测试

打开浏览器 输入服务器的公网ip
在这里插入图片描述

总结

整个过程花费了我3天时间,其中发现遇到很多的报错,远没有写出来的一路下来的一帆风顺
不是说复制错误,去百度,搜出来的解决方案就可以帮你解决问题,那些只能作为参考,不能作为答案。
比如:我一开头的准备工作就说到升级安装高版本的GCC,这是因为不升级的话mod_wsgi,就会编译不通过,而如果你到了安装mod_wsgi才安装升级,那么下面也是进行不下去,因为你前面编译Python用的GCC版本不一样,很多编译出来的东西也就不一样,需要重新编译安装Python。

个人认为,遇到问题还是要去取剖析报错信息,检查报错日志信息,对于个人的能力也是一种锻炼和提升。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值