环境介绍:
系统:CentOS 8 64位
工具:Nginx + uWSGI
语言:python
框架:Django
数据库:Mysql
本文记录下所有部署用到的软件均使用源码Tarball安装(极限环境)对应版本如下:
Django= 3.2.12
部署前的准备:
1、下载相关软件,这里也记录下:
python:
Python Release Python 3.7.2 | Python.orghttps://www.python.org/downloads/release/python-372/
下载CentOS版本
mysql:
MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/5.7.html#downloads
Nginx: nginx: downloadhttp://nginx.org/en/download.html
uWSGI:Getting uWSGI — uWSGI 2.0 documentation (uwsgi-docs.readthedocs.io)https://uwsgi-docs.readthedocs.io/en/latest/Download.html
2、项目及依赖打包,之前记录过就不再啰嗦
最终部署用到的东东如下:
3、将包含部署文件的设备(u盘/移动硬盘等)挂载给Linux 系统使用
插入U盘查看是否读取成功:
报了个错!尝试挂载自己的移动硬盘报一样的错查看文件系统类型:
U盘或者移动硬盘为NTFS文件系统,centos默认并不能识别,查看系统文件系统类型驱动:
并没有关于ntfs的驱动程序,网上查看,很多资料都说需要安装 NTFS-3G,百度百科:NTFS-3G为Linux提供NTFS的驱动程序
yum install ntfs-3g
修改镜像地址:注释掉原来文件中的 mirrorlist ,修改 baseurl。其实修改
CentOS-Linux-AppStream.repo 和 CentOS-Linux-BaseOS.repo 两个文件就行,执行下面的命令更直接一点
cd /etc/yum.repos.d/
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-*
yum 更新:yum update -y
会更新700+东东,python3都直接安装了
安装 NTFS-3G
下载NTFS-3G源码安装,源码包统一放到 /usr/local/src 下面
wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz
解压缩:
tar -xvzf ntfs-3g_ntfsprogs-2017.3.23.tgz
直接使用默认安装路径编译安装:
[root@localhost src]# cd ntfs-3g_ntfsprogs-2017.3.23/
[root@localhost ntfs-3g_ntfsprogs-2017.3.23]# ./configure
安装:make & make install
安装完成再次挂载:
mount -t ntfs-3g -o iocharset=cp950 /dev/sdb1 /mnt/deployment
开始部署:
1、账号相关设置:创建用于部署的帐号 deployer 及 用户组 deploy
修改deployer 用户密码:
deployer帐号信息微调:添加帐号说明
切换部署账号 deployer 创建项目部署目录 djangoWebRoot
修改部署目录权限:
进入u 盘 deploy文件夹,将software下的安装包复制到 /usr/local/src 下面
2、安装python 3.7.2
系统经过 yum update -y 默认安装 python 3.6.8
解压缩 python 安装包:sudo tar -xvf Python-3.7.2.tar.xz
进入解压后的文件夹,查看安装指南文件README统一将自定义安装的软件安装到 /usr/local/ 下各自单独的目录,创建python 安装目录:
sudo mkdir python3.7.2
进入解压后的文件夹,指定安装路径编译:
sudo ./configure --prefix=/usr/local/python3.7.2 --enable-optimizations
查看setup.py源码找到未找到的模块对应的模块名:
_ssl 和 _hashlib :
对应模块 openssl-devel
_sqlite3 :
所以对应缺失的模块应该是 sqlite-devel
_dbm 、 _gdbm 和 nis :
_dbm 和 _gdbm对应模块 gdbm-devel,nis 对应模块 libnsl
_curses 和 _curses_panel :
两个应该对应模块 ncurses-devel
readline:
所以 readline 应该对应模块 readline-devel
_tkinter 和 _uuid :
_tkinter 对应 模块 tk-devel,_uuid 对应模块 uuidd
_bz2:
就是 bzip2 就对应模块 bzip2-devel
综合一下,相关包及依赖如下表:
yum 下载相关包:
sudo yum install openssl-devel --downloadonly,通过添加参数 --downloadonly ,yum只会下载相关的包及这个包的依赖,这些保存在cache里面,找了好半天才找到:
那会不会所有的都会保存到这个目录下呢,执行 sudo yum clean packages
清完再下载其他的包:
的确!默认都是保存到这里的,注意另外几个是从appstream下载的就保存到另外appstream对应的目录里面了:
另一种方法:sudo yum -y install yum-utils
安装完成使用 yumdownloader 指定保存路径下载包
这种方式下载不会考虑依赖关系,只会把从yum源中找到能找的包下载下来
Index of /8.3.2011/BaseOS/x86_64/os/Packages (centos.org)https://vault.centos.org/8.3.2011/BaseOS/x86_64/os/Packages/如果不考虑依赖关系可以使用这种方式下载包!
还是使用上一种方式下载其他的包及依赖,对比之前Ubuntu源码安装python时的一点记录,有许多相似之处:
之前 ubuntu 中安装时所安装的依赖如下:
Linux 源码安装python3.7.2 预先安装依赖包:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install build-essential checkinstall
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libpcap-dev
sudo apt-get install python-dev python-setuptools python-pip python-smbus
sudo apt-get install zlib1g-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install libffi-dev
sudo apt-get install liblzma-dev
sudo apt-get install libbz2-dev
sudo apt-get install uuid-dev
最终呢,极限环境下(无外网)centos 源码安装python 预先需要安装的依赖如下:
现在来手动安装这些依赖项:依赖里面还有依赖的先装里层的依赖:
有依赖的先装依赖再装外层的包,同时安装多个依赖,空格隔开
安装完成依赖项,再来编译python安装:
[deployer@localhost Python-3.7.2]$ sudo ./configure --prefix=/usr/local/python3.7.2 --enable-optimizations
[deployer@localhost Python-3.7.2]$ sudo make clean
[deployer@localhost Python-3.7.2]$ sudo make
[deployer@localhost Python-3.7.2]$ sudo make test
参考网上资料:(2条消息) SSLError: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590)_彭世瑜的博客-CSDN博客https://blog.csdn.net/mouday/article/details/80653882
在yum 源中查找 ssl相关的,找到
其依赖项里面就有 cryptography,检索idna分别在baseos 和 appstream 中检索到
而关于 _ctypes的是缺少libffi-devel包
nis 的缺失问题依旧,证明不是缺少 libnsl 的问题,源里面检索 nis 找到这个
尝试吧!安装这个包再看!
另外还提到这几个包:db4-devel libpcap-devel xz-devel,在这里先下载安装libffi-devel、nss_nis、python3-pyOpenSSL以及 python3-idna做验证:
idna默认已经安装
安装完其他再编译安装python
sudo make
_ctypes问题没有了,nis依旧!
sudo make test
sudo make install
3、修改默认指向
创建新链接:
sudo ln -s /usr/local/python3.7.2/bin/python3.7 /usr/bin/python
sudo ln -s /usr/local/python3.7.2/bin/pip3 /usr/bin/pip
查看 pip 版本
升级 pip 和 setuptools,这种是安装完成后升级,要用wheel升级,后面尝试编译python的时候直接将新版本的pip以及setuptools编译进去直接安装
下载最新的 pip 和 setuptools
https://pypi.org/project/https://pypi.org/project/
4、安装mysql:
解压:
可以看到,解压缩后的mysql文件里面并没有configure 而是被cmake替代了,所以查看INSTALL,按照官方说明一步一步来:
参照说明下载依赖项
① 安装 cmake
[deployer@localhost cmake-3.23.1]$ sudo mkdir /usr/local/CMake
[deployer@localhost cmake-3.23.1]$ sudo ./bootstrap --prefix=/usr/local/CMake
[deployer@localhost cmake-3.23.1]$ sudo gmake
[deployer@localhost cmake-3.23.1]$ sudo make install
添加链接:[deployer@localhost bin]$ sudo ln -s /usr/local/CMake/bin/cmake /usr/bin/cmake
ok!cmake 安装完成
② 安装 boost
下载依赖项:
安装依赖
[deployer@localhost mysql-dependencies]$ sudo tar -xvjf boost_1_79_0.tar.bz2
[deployer@localhost mysql-dependencies]$ sudo mv ./boost_1_79_0 /usr/local/
先决条件搞定,开始使用cmake来构建MySQL
这里指出还需要一个先决条件:bison ,查看,已经安装了!
开始构建:
① MySQL 源码目录下创建构建目录子目录:mysql_build
[deployer@localhost mysql-5.7.37]$ sudo mkdir mysql-build
② 进入构建目录使用cmake配置
绿色部分其实可以不用再手动配置,直接使用默认值就行 [deployer@localhost mysql-build]$ sudo cmake .. -DWITH_BOOST=/usr/local/boost_1_79_0
高版本还不行? 参考文档
[deployer@localhost mysql-build]$ sudo cmake .. -DDOWNLOAD_BOOST=ON -DWITH_BOOST=/home/my_boost
喔嚯!timeout,手动下载安装;到官网找对应的版本下载Boost Version Historyhttps://www.boost.org/users/history/
[deployer@localhost mysql-build]$ sudo cmake .. -DWITH_BOOST=/usr/local/boost_1_59_0\
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DDOWNLOAD_BOOST=0 \
> -DENABLED_LOCAL_INFILE=1 \
> -DENABLE_DOWNLOADS=1 \
> -DINSTALL_STATIC_LIBRARIES=1 \
> -DMYSQL_DATADIR=/data/mysqldb \
> -DSYSCONFDIR=/usr/local/mysql/etc/my.cnf \
> -DWITH_DEBUG=1 \
> -DWITH_SSL=system \
> -DWITH_SYSTEMD=1
Bug again!安装模块呗
妈蛋!什么情况?
安装这个试试
好了,出现新bug ,找不到 rpcgen,这是个什么鬼东东,yum 源里面也检索不到
这篇文档中说是缺少 rpcsvc ,源里面同样检索不到关于这个东东的任何信息,参考下面这位仁兄的文章
(2条消息) linux安装mysql_daiend的博客-CSDN博客https://blog.csdn.net/qq_43148818/article/details/113775042需要 rpcsvc-proto 这项依赖,源里面检索不到只能下载源码安装了,通过下面链接下载
rpcsvc-proto-1.4.3 (linuxfromscratch.org)https://linuxfromscratch.org/blfs/view/svn/basicnet/rpcsvc-proto.html按照文档安装
[deployer@localhost mysql-dependencies]$ sudo tar -xvf rpcsvc-proto-1.4.3.tar.xz
[deployer@localhost rpcsvc-proto-1.4.3]$ sudo ./configure --sysconfdir=/etc && make
一起执行报错,权限问题,分开执行
[deployer@localhost rpcsvc-proto-1.4.3]$ sudo ./configure --sysconfdir=/etc
[deployer@localhost rpcsvc-proto-1.4.3]$ sudo make
[deployer@localhost rpcsvc-proto-1.4.3]$ sudo make install
删除构建目录下的 CMakeCache.txt 再重新编译mysql
ok,编译构建成功! 查看下编译参数:[deployer@localhost mysql-build]$ sudo cmake . -L
③ make 很长时间,估计半小时
[deployer@localhost mysql-build]$ sudo make VERBOSE=1
④ install
[deployer@localhost mysql-build]$ sudo make install
⑤ 执行安装后的配置,包括:
初始化数据目录
启动mysql并测试是否能正常进入
mysql初始帐户的(密码)保护设置
mysql服务随系统启动和关闭设置
初始化数据目录:首先为运行mysqld创建专有用户mysql,该账号为系统账号,不需要有登录主机的权限,用户组属于 mysql 用户组
进入安装目录:/usr/local/mysql
执行最后一条命令,会根据编译的时候所设置的数据目录位置来创建,但奇怪的是抛出No such file or directory,没有自动创建官网的说明也是会自动创建
自己估计会不会是权限问题,索性手动创建/data目录,再执行
成功了!那么进行第二步,启动mysql服务,测试能否登入,在编译的时候设置了-DWITH_SYSTEMD=1,所以使用 systemctl start mysqld
没法了从头来过重新编译:
[deployer@localhost mysql_build]$ sudo cmake .. -DWITH_BOOST=/usr/local/boost_1_59_0\
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DDOWNLOAD_BOOST=0 \
> -DENABLED_LOCAL_INFILE=1 \
> -DENABLE_DOWNLOADS=1 \
> -DINSTALL_STATIC_LIBRARIES=1 \
> -DWITH_DEBUG=1 \
> -DWITH_SSL=system \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
> -DCPACK_MONOLITHIC_INSTALL=1 \
> -DWITH_MYISAM_STORAGE_ENGINE=1 \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
>
sudo gmake VERBOSE=1
sudo make install
[deployer@localhost mysql]$ sudo mkdir mysql-files
[deployer@localhost mysql]$ sudo chown mysql:mysql mysql-files/
[deployer@localhost mysql]$ sudo chmod 750 mysql-files/
[deployer@localhost mysql]$ sudo bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
启动mysql:
依旧不行,不过这次编译的时候没加入-DWITH_SYSTEMD=1,在mysql的bin 下有mysqld_safe,可以按照官方文档中的第一种启动方式:
测试:首先修改环境变量,deployer家目录下新建.bashrc ,添加下面这条:PATH=${PATH}:/usr/local/mysql/bin
激活新的环境变量:source ~/.bashrc
测试连接数据库
根据文档做测试:
验证可以关闭mysql,关闭后还可以再启动
对初始账号 root 设置密码保护:
mysql随系统启动设置:官方文档中介绍了一种设置方式,使用 mysql 启动脚本——mysql.server
现在重启验证下
ok,mysql安装完毕!直接编译安装成系统服务的模式最开始测试过失败,可能还是哪里设置不对边看官方文档边测试,好费劲,后面再来测试吧!
5、安装Nginx
按照官方文档编译报错,缺少PCRE,pcre 已经安装了那就尝试安装 pcre-devel吧!
再编译
make
make install
将nginx 注册成系统服务:
/usr/lib/systemd/system 下创建nginx系统配置文件nginx.service
写入以下配置内容
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
:wq 重新加载系统配置
[root@localhost system]# systemctl daemon-reload
然后启动 nginx 服务
[root@localhost system]# systemctl start nginx
同样可以使用 nginx -s signal 来管理
有一点,nginx好像不支持开机自启动,不管是通过chkconfig --add nginx 还是通过下面的都提示不支持!
6、安装uwsgi
参照官方文档安装
需要的依赖项:gcc、clang、Development Tools、python、python-devel,gcc、python已经有了,检查下其他项
安装clang:
将uwsgi解压到 /usr/local 下面:
[deployer@localhost src]$ sudo tar -xvzf uwsgi-2.0.20.tar.gz -C /usr/local/
编译安装:
[deployer@localhost uwsgi-2.0.20]$ sudo python uwsgiconfig.py --build
使用配置文件编译安装,执行完就行,查看文件与未编译之前的对比,产生一个可执行文件 uwsgi
将 /usr/local/uwsgi-2.0.20 加入环境变量中,可以直接执行 uwsgi
7、安装项目依赖
将项目tarball移动至部署目录下并解压
将解压后的项目文件移动至部署目录下
进入 relies_packages 安装项目依赖
[deployer@localhost relies_packages]$ pip install --no-index --find-links=./packages -r deploy_requirements.txt
下载安装
这才反应过来,之前的所有wheel包是在windows环境下下载打包的,直接拿到centos上怎么用嘛!!蠢!到linux环境下重新下载依赖项,默认镜像源太慢也容易timeout,设置使用清华源:
用户家目录下新建 .pip 文件夹, .pip 文件夹下新建 pip.conf ,向其中写入内容:
[global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
保存退出
下载依赖项:
pip download --no-deps on -d ./packages/ -r deploy_requirements.txt
根据 deploy_requirements.txt 中列出的清单及版本下载依赖项到当前目录下的 packages 目录中
安装:
[deployer@localhost relies_packages]$ pip install --no-index --find-links=./packages -r deploy_requirements.txt
安装完依赖项,使用 django 默认的启动方式试启动项目
说明项目可以正常启动,接下来要使用uwsgi来启动项目
进入项目根目录
尝试访问站点:
按照提示开启线程:
[deployer@localhost PrescriptionPushSystem]$ uwsgi --http :8008 --module PrescriptionPushSystem.wsgi --enable-threads
尝试登录
数据库未初始化的问题,和之前Windows一样迁移sessions,初始化数据库
首先连接mysql创建数据库
然后运行 models.py 做初始化
迁移sessions
再使用uwsgi启动项目验证:
这有点不理解!白天在公司还正常加载样式,回到家现在就不行了,难道白天是虚的!仔细看白天输出的日志,第一次runserver方式是成功的,第二次警告 静态资源css和js Not Found,但是依然正常加载,估计是浏览器缓存的原因,但是白天成功骗过了我!因为晚上继续搞nginx就发现,明明nginx服务已经停止, curl localhost 状态都已经是拒绝,但是浏览器依然 welcome to nginx!
接下来以配置文件的形式来管理uwsgi的启动以及后台运行:
官方文档介绍了配置文件可以是 ini文件、xml文件、json文件、yaml文件,自己这里采用xml文件形式,在项目根目录下创建 my_uwsgi.xml
:wq 后尝试启动: uwsgi --xml my_uwsgi.xml
做修改
:wq 后停止 uwsgi :uwsgi --stop uwsgi.pid ,删除之前的pip和log
rm uwsgi.pid
rm uwsgi.log
再重启 uwsgi :uwsgi --xml my_uwsgi.xml
已经后台启动!
配置uwsgi来处理静态资源就不太实际了,接下来把nginx加进来发挥它的功能,安装完成的nginx在conf下有两个配置文件,一样的内容,针对自己的小项目就直接修改nginx.conf了
修改my_uwsgi.xml
重启 uwsgi :uwsgi --reload uwsgi.pid
修改setting并收集静态资源:python manage.py collectstatic
启动nginx:sudo systemctl start nginx
尝试访问站点:
通过系统管理添加一个用户,后台连接数据库查询验证:
ok!至此算是部署完毕,这篇算是部署笔记,太长了,记录了一些问题,再起一篇做下总结,把关键的理清并记录。