最近在开发一个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
输出如下:
这里密码为: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;执行结果如下:
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/目录下的动态库建立软连接也可以。