Django Web 项目在Linux环境的在线部署(补充记录)

环境介绍:

系统:CentOS 8 64位

工具:Nginx + uWSGI

语言:python

框架:Django

数据库:Mysql

上篇记录的是离线环境下的部署,本篇对在线环境下部署项目做个记录:

软件版本对应:

Nginx --- 1.20.2

python --- 3.10.4

Django --- 4.0.4

MySQL --- 5.7.37

一、相关软件安装:

在线环境下相关软件都使用 yum 进行安装,便以版本以及软件依赖管理,首先使用yum对系统内核及软件方面做个更新

由于centos 版本的原因之前的源已经搬家了需要更改yum源 手动去修改容易出问题,使用 sed 工具统一替换修改:

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*

sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

修改后 sudo yum update 等待更新完成

 1、下载安装 python

系统默认安装了3.6.8

 而 yum 源中并没有 python-3.10.4 的 rpm 包,最高的就是python39,所以下载源码 python-3.10.4安装

 解压、编译安装

 安装依赖:

sudo yum install libffi-devel gdbm-devel libtirpc-devel openssl-devel readline-devel sqlite-devel python3-pyOpenSSL tk-devel

 sudo make clean 再重新编译 make

sudo make install

 修改pip及python指向

 2、安装MySQL

参照MySQL官方文档安装

MySQL :: MySQL 8.0 Reference Manual :: 2.5.1 Installing MySQL on Linux Using the MySQL Yum Repositoryhttps://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html

2.1 下载安装 MySQL Yum Repository

sudo wget https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm

 sudo yum install ./mysql80-community-release-el8-4.noarch.rpm

 查看是否安装成功

选择安装版本,官方文档是介绍了可以选择mysql的安装版本,通过手动配置 mysql-community.repo 将关于 8.0的 enabled参数设置为0,添加 5.7的配置信息并使enabled = 1

但是最终没能安装

 如图中所示:不考虑最佳匹配安装可以安装 4.7.18 ,但全是 el6 的 ,mysql官网中也没找到 el8 和 mysql 5.7 可用的 yum 源,所以如果一定要安装 MySQL 5.7.37(严格要求该版本)就只能源码安装了,就如同前面安装python一样,源中最高只提供了 python39 的 rpm,一定要python 3.10.4 就只能源码安装,这里MySQL的源码安装就不记录了(sudo wget 下载源码下来,安装前篇已经记录了)

尝试安装 8.0,修改mysql-community.repo 将关于 8.0的 enabled参数设置为1,删除或注释关于5.7的配置信息后执行安装:sudo yum install mysql-community-server

 等待安装完成

 启动mysql服务

 查看系统设置的 root 密码并重置为自己的密码

sudo grep 'temporary password' /var/log/mysqld.log

alter user 'root'@'localhost' identified by 'new-password';

默认会安装密码验证机制,必须包含大小写字母、数字和特殊符号,长度最少8个

 3、安装Nginx

同样如果追求最新稳定版本 1.20.2 就只能源码安装了,官网查看下载地址,wget 下载源码下来

 源码具体安装这里就不记录了

 等待安装完成

 启动nginx服务

可以看到,yum 安装完后nginx 工作进程的用户是 nginx ,来看下配置文件

 4、安装uWSGI

很遗憾,源里面没有收录 uWSGI的 rpm 包,可以选择源码安装或者pip安装

首先记录 pip 安装 ,注意此处如果直接pip install uwsgi 则会在当前用户家目录下安装,可以使用 python -m site 查看pip 安装目录

使用 sudo pip install uwsgi 则安装到全局 python 环境中去

 第二方法就是源码安装了,参照官方文档 wget 下载

二、项目部署

1、创建项目目录、在项目目录内创建虚拟环境 PrescriptionPushSystem_env 并激活

 2、pycharm 配置远程deployment ,上传requirements.txt ,配置pip 源,安装项目依赖

 获取项目依赖清单 requirements.txt 

上传 requirements.txt

到服务器查看

 配置pip源,家目录下创建 pip.conf 到家目录下的 .pip 文件夹下

[global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple

项目虚拟环境激活状态下安装项目依赖

 3、按照开发环境创建 项目 PrescriptionPushSystem 及 相关app

 4、修改映射关系,上传项目源码

 5、django runserver 方式试启动项目

 6、本地项目pycharm中创建uwsgi配置文件 my_uwsgi.xml 管理uwsgi的启动与后台运行,并上传至服务器

 7、试运行 项目,失败,uwsgi.log 中总是提示无法导入django

但是虚拟环境下已经完全安装了,回去阅读uwsgi官方文档,使用 pip 将uwsgi安装到虚拟环境中

 再运行正常!

8、配置nginx

 启动nginx 试访问站点——失败

 查看nginx 日志

又是权限问题,yum 安装nginx后,默认配置文件中 nginx 的工作进程使用用户 nginx ,尝试使用 deployer 用户作为 nginx 的工作进程用户:修改 配置文件重新加载nginx再访问站点

问题依旧!使用root:

 root 都不好使!查看SELinux 状态

 关闭 SELinux 并重启问题解决!

 9、数据库初始化,、迁移sesions、settings配置以及静态资源收集

初始化创建相关数据表时报错

 认证插件不支持 caching_sha2_password,回到mysql官方文档位置:

MySQL :: MySQL 8.0 Reference Manual :: 2.11.4 Changes in MySQL 8.0https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-root-account

 原因就是 8.0 以后的版本使用 caching_sha2_password 认证插件,而不是之前的mysql_native_password,参照官方文档由于使用的是 yum 安装mysql ,所以数据目录的初始化是自动完成的所以采用第二种修改方式:配置文件中设置  default_authentication_plugin 参数。

修改 /etc/my.cnf,默认已经提供了这个参数项,只需取消注释就行

 重启 mysql 服务

 再次尝试问题依旧!开发环境中用的是 mysql 5.7,安装的连接器是 mysql-connector,在安装项目依赖时也是安装的mysql-connector-2.2.9,其实问题很明确 就是之前的连接器不支持 caching_sha2_password 而在mysql 官方文档中关于python 与mysql 开发指南篇有如下说明
MySQL :: MySQL Connector/Python Developer Guidehttps://dev.mysql.com/doc/connector-python/en/

 因此需要安装对 mysql 8.0 及更高版本支持的连接器,对应的模块就是 MYSQL-connector-python

 取消之前对 /etc/my.cnf 的修改,直接安装 MYSQL-connector-python 模块后成功初始化创建相关数据表!

迁移 sessions

 settings 配置及静态收集

 10、重启 uwsgi 和 nginx 并验证

 ok!至此部署完成,做点总结:

前后两篇都是关于 linux 的部署,前篇记录的是完全离线环境部署,自己文中记录的方式是相关软件包、依赖等存放在U盘中,自己的U盘做成双类型的一部分是FAT文件类型,另一部分是NTFS(可以存放大数据,比如系统 iso),用于 linux挂载 NTFS 文件系统的驱动 NTFS-3G 就存放在 FAT区,系统自动识别就可以直接安装NTFS-3G,安装完后通过挂载 NTFS 区就可以使用里面的 软件包、依赖及项目包了。

前半部分都是关于软件的安装(python/mysql/uwsgi/nginx),离线环境安装主要就是解决软件依赖问题,自己文中记录的方式还是具有一定的限制,这跟用来部署的服务器内核版本有关,系统在部署前是最小安装还是server with GUI 亦或是否已经安装了诸如 Development Tools等软件都是限制因素。一种具有普遍适用性的方法可以在开发环境(有外网)直接将 yum 源或 pip 源下载下来,到部署环境再部署成本地源使用,至于怎么操作就不记录了,相信网上也有很多教程!第二篇中在线环境安装就主要看所使用的 yum 源以及对软件版本是否苛刻,如果 yum 源里面没有相关软件版本对应的 rpm 包也就只能源码安装了,还想到一点自己可以将开发环境的软件比如 python 自己编译打包成 rpm 包来安装,应该能实现,不过回头一想一是需要去验证,再者这又回到离线环境了,有点南辕北辙,既然是在线环境 如果 yum 安装不了就直接下载源码安装,简单直接!至于在线源码安装需要的依赖项前文已经记录不在赘述。

相关软件安装完毕就是项目部署了,前篇离线环境部署采用的是全局部署,没有将项目放到单独的虚拟环境中,相对来说这种直接快捷,而本片就为项目创建了单独的虚拟环境,这也导致前文中 初次以 uwsgi 启动项目失败而卸载之前安装的uwsgi后再到虚拟环境中 pip 安装 uwsgi,uwsgi 没有安装到虚拟环境中,uwsgi启动项目加载 wsgi文件时路径就是不对也无法导入 django,自然也无法启动 application;总结一点,针对 uwsgi 的安装:如果计划将项目部署到单独的虚拟环境当中去,那么在部署前安装软件时就先不安装 uwsgi ,直接等到部署时创建好项目虚拟环境后直接激活项目虚拟环境以 pip install uwsgi 来安装;若项目没必要拥有单独的环境则可以是源码或者sudo pip install uwsgi 来全局安装(经过验证,无论采用这两种哪种安装,只要是将项目放到虚拟环境在启动时都报一样的错误,路径不对,找不到django也启动不了application);此外,uwsgi.log 中两此测试都有一个警告:!!! no internal routing support, rebuild with pcre support !!! 认为是警告是因为并没有影响项目的正常启动运行,提示需要有 pcre 的支持下重新编译,这之前没遇到,解决办法就是在安装 uwsgi 之前先 sudo yum install pcre-devel,装完pcre-devel 再安装 uwsgi 。

需要注意的:SELinux 对项目运行的影响。全局部署也出现过nginx 工作进程用户对收集好的静态资源访问权限不足,当时也想到了 SELinux 的影响,但是当时已经尝试关闭SELinux 后来运行但并没起什么作用,最终还是通过配置 nginx 工作进程用户与静态资源所属用户一致 均为 deployer 用户解决;但是在本篇中还有点不同:并不是访问 静态资源权限不足,而是 nginx 与 uwsgi 之间通信建立连接时权限不足,nginx 和 uwsgi 正常启动,并不是静态资源加载失败而是页面都没加载,而关闭SELinux则解决该问题。

关于最终软件版本说明:自己最初开发环境为 python-3.7.2 + django-3.2.12 + mysql-5.7.38 ,那么本篇主要记录在线部署,但 yum 源中只提供 python36、python38、python39 的安装,今年刚发布的 python310又没有,所以索性就直接源码安装 python 3.10.4.稳定版,毕竟3.7已经快是5年之前的了,借此机会也就将之前项目python 版本,pycharm等升级到最新重新调试一下,当然django版本自然也升级用 4.0.4 了,而 mysql 是一直使用 5.7.38,而官方源又没提供 5.7的(也可能是自己没找到吧),就索性也升级到 8.0 来用用了!只做记录,反正没有或者找不到的至少都有源码,大不了就源码安装呗!就这样。

---------------------------------------------------------------------------------------------------------------------------------————————————————————    完     ———————————————————----------------------------------------------------------------------------------------------------------------------------------

后面几次部署中pip 安装 项目依赖时会遇到如下bug:

 这里做下记录,源码安装python时,安装依赖的时候加一项mysql-devel

该问题不一定会出现,使用python 3.10.4在华为云上面没遇到过,在自己虚拟机上出现,后面在华为云上使用python 3.10.5时又出现,不管如何,安装python时都安装一下该依赖 

总的依赖如下:

sudo yum install libffi-devel gdbm-devel libtirpc-devel openssl-devel readline-devel sqlite-devel python3-pyOpenSSL tk-devel mysql-devel