最近在开发一个web服务,用了django2.1,由于django版本兼容python版本问题,版本不对应会有语法问题,因此需升级python。另外,使用了mysql数据存储。服务器使用的是国产linux系统,内核版本为4.1。安装过程中有很多依赖问题,为了方便之后安装,记录下升级的过程。

1.Python环境与Django版本对应表


图一

2.python2 升级到python3.7

首先安装依赖:

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

因为python3需要引用openssl模块,需要的openssl版本最低为1.0.2,但是系统默认的为1.0.1,所以需要重新更新openssl。因为我的系统升级了openssl1.1.1问题仍存在,于是按python3.7官方建议安装LibreSSL。LibreSSL是openssl的一个分支,LibreSSL 的漏洞数与严重程度要比 OpenSSL 少的多、轻的多。

2.1 libressl安装

首先下载libressl:

wget  https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.9.2.tar.gz

解压:

tar -zxvf libressl-2.9.2.tar.gz

切换到libressl-2.9.2目录下,配置安装目录,我这配置安装目录为/usr/local/libressl:

cd  libressl-2.9.2

./configure --prefix=/usr/local/libressl

接着执行:make && make install

为了系统命令默认使用该版本的ssl,需要修改一些软连接:

首先备份:

mv  /usr/bin/openssl  /usr/bin/openssl.backup

mv  /usr/include/openssl /usr/include/openssl.backup

建立软链接:

ln -s /usr/lcoal/libressl/bin/openssl  /usr/bin/openssl

ln -s /usr/local/libressl/include/openssl /usr/include/openssl

openssl一般以一种动态库或者静态库的方式链接到其他程序中,因此需要解决链接库依赖问题,把opessl编译的动态库路径写入ld.so.conf配置文件

如下: echo "/usr/local/libressl/lib/"  /etc/ld.so.conf

接着执行:ldconfig  -v  使其生效

2.2 python 3.7安装

下载python3.7:

wget  https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz

解压:

tar -zxf  Python-3.7.3.tgz

配置安装目录:

进入到cd Python-3.7.3后执行./configure --prefix=/usr/local/python3.7

编译及安装:

make  && make install

备份python2的软链接:

mv /usr/bin/python /usr/bin/python.bak

创建python3的软连接 :

ln -s /usr/local/python3.7/bin/python3.7  /usr/bin/python

查看版本:

python  -V

因为yum需要使用python2,将/usr/bin/python改为python3后,yum就不能正常运行了,因此需要更改一下yum的配置。

vim  /usr/bin/yum

vim  /usr/libexec/urlgrabber-ext-down

编辑这两个文件,将文件头的#!/usr/bin/python改为#!/usr/bin/python2即可。

3. django安装

这里使用pip安装,首先查看pip 版本,在输出信息末尾查看python2还是python3.7:pip  -V

如不是python3.7 ,需要修改软链接:

mv /usr/bin/pip /usr/bin/pip.backup

ln -s /usr/local/python3.7/bin/pip3 /usr/bin/pip

接着安装django2.1:

pip install django==2.1

4.mysql 8 .0安装

4.1 安装软件源

这里通过rpm包安装,首先下载rpm包。安装包下载路径:http://repo.mysql.com/。由于我这里硬件特殊性,这里选择:mysql80-community-release-el7.rpm

下载:

wget http://repo.mysql.com/mysql80-community-release-el7.rpm

安装:

rpm  -ivh  mysql80-community-release-el7.rpm

4.2 安装和配置mysql服务端

(4.2.1)安装:

yum install -y  mysql-community-server

启动mysql,验证时候安装成功:

service mysqld start

启动后查看状态:

service mysqld status

此时:active (running),表明安装成功,并正常运行。

(4.2.2)修改密码

首先查看安装时默认的密码:

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

输出如下:


图2

这里密码为:acu%ah.=q2eO

首先使用默认密码登录:

mysql -uroot -p

输入密码即可登录.

用该密码登录到服务端后,必须马上修改密码再执行一些数据库操作,不然会报如下错误:You must reset your password using ALTER USER statement before executing this statement.

修改密码(*********为你要设置的密码):

ALTER USER 'root'@'localhost' IDENTIFIED BY '*********';

如果密码设置太简单出现以下的提示:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements.必须修改两个全局参数:

首先,修改validate_password.policy参数的值:

set global validate_password.policy=0;

再修改密码的长度validate_password.length:

set global validate_password.length=1;

再次执行修改密码就可以了.

ALTER USER 'root'@'localhost' IDENTIFIED BY '******';

(4.2.3)授权远程登录

mysql数据库安装完成后有默认的mysql数据库,里面有个user表,数据就是默认的系统用户的一些信息,包括权限。我们给root用户一个访问权限。

use mysql;

select host,user,authentication_string,plugin from user;执行结果如下:


图3

host和user中可以看到root用户对应的值为localhost,即root用户的访问权限为localhost,想把该用户的访问权限设置可远程连接,我们只需要把localhost更改为通配的%就可以了。

update user set host = "%" where user = "root";

此时客户端连接,会出现caching-sha2-password问题:

修改加密规则:

ALTER USER 'root'@'%' IDENTIFIED BY '******' PASSWORD EXPIRE NEVER;

更新下用户密码:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY ******;

刷新权限:

FLUSH  PRIVILEGES;

5.运行django项目

python manage.py runserver

(5.1)如出现 libmysqlclient18.so无法找到,需要确定是否安装,如果有安装则需要修改软连接。我这里没有安装:

安装libmysqlclient18:

下载(我这里是arm64处理器,下载对应版本的rpm,arm适配链接:http://rpmfind.net/):

libmysqlclient18-10.0.35-35.1.aarch64.rpm

libmysqlclient-devel-10.0.35-35.1.aarch64.rpm

libmysqlclient_r18-10.0.35-35.1.aarch64.rpm

下载后直接rpm -ivh 安装即可。

(5.2)如果出找不到libssl.so.1.0.0、libcrypto.so.1.0.0则需要修改软连接,在/usr/lib/目录下有openssl的动态库,建立一个软链接即可解决问题。

我这里如下:

ln -s /usr/lib64/libssl.so.1.0.1j  /usr/lib64/libssl.so.1.0.0

ln -s /usr/lib64/libcrypto.so.1.0.1j  /usr/lib64/libcrypto.so.1.0.0

使用2.1步骤中libressl安装目录下/usr/local/libressl/lib/目录下的动态库建立软连接也可以。