环境介绍:
系统:CentOS 8 64位
工具:Nginx + uWSGI
语言:python
框架:Django
数据库:Mysql
本文记录下所有部署用到的软件均使用源码Tarball安装(极限环境),由于centos 默认不支持NTFS文件系统,如果部署用到的软件及工程文件所在U盘或移动硬盘文件格式是NTFS的在本篇就死了,U盘读不出挂载不上一切部署无从谈起,至于开放环境另当别论在下篇记录(开放环境可以通过下载源码包安装NTFS-3G驱动程序提供对NTFS的支持);centos默认有对FAT32文件格式的支持,但是对于exFAT类型的必须内核版本在5.4以上的才支持,所以如果U盘文件格式是FAT格式,那么系统能自动识别挂载到 /run/media/user 下,自动挂载的有可能因为没指定语系导致挂载U盘名或里面的文件夹名是中文而无法正常显示,可以通过手动挂载带参数 -o iocharset=cp950 来支持,所有部署用到的软件如下:
ok!开始操作,遵循源码安装软件原则将所有的软件包及依赖复制到/usr/local/src 下,家目录下创建项目目录 djangoWebRoot ,将项目包PrescriptionPushSystem-0.1.tar.gz 复制到项目目录下。
看下初始化环境:系统默认安装 python3.6.8
目录:
一 相关软件安装
1 yum update
2 Development Tools
3 安装 python
3.1 安装 python 依赖项
3.2 安装 python
一、相关软件安装
1、安装 yum update 相关,从内层dependency开始安装
[deployer@localhost yum-update]$ sudo rpm -Uvh ./*rpm
2、安装 Development Tools 相关
3、安装 python
3.1 安装python依赖项,依次安装一样从最内层安装
3.2、解压、编译、安装python
[deployer@localhost src]$ sudo tar -xvf Python-3.7.2.tar.xz
按照安装指导文档操作
[deployer@localhost Python-3.7.2]$ sudo ./configure --prefix=/usr/local/python --enable-optimizations
[deployer@localhost Python-3.7.2]$ sudo make
[deployer@localhost Python-3.7.2]$ sudo make test
个人感觉这里的问题好奇怪,之前测试执行完 yum update 更新默认安装的 python 3.6 ,在安装 3.7 编译的时候同样出现ssl的问题,但是安装python3-pyOpenSSL以及 python3-idna后就解决了,现在并未更新 python 3.6, 始终无法解决,python官网找到一点信息如下
ssl — TLS/SSL wrapper for socket objects — Python 3.7.13 documentationhttps://docs.python.org/3.7/library/ssl.html?highlight=tls#ssl.SSLContext.maximum_version
按照这里讲的 OpenSSL 需要1.1.0g以上的才行,但是查看自己现在系统中的版本已经很高了
openssl也是1.1以上:
鉴于python 3.7到明年就停止支持了,18年到现在已经很老了,索性启用今年开始的最新版,安装最新版本python 3.10.4
[deployer@localhost src]$ sudo tar -xvf Python-3.10.4.tar.xz
[deployer@localhost Python-3.10.4]$ sudo ./configure --prefix=/usr/local/python --enable-optimizations
[deployer@localhost Python-3.10.4]$ sudo make
[deployer@localhost Python-3.10.4]$ sudo make test
出现上面的编译错误是由于在外网不通,联网情况下是正常的:
[deployer@localhost Python-3.10.4]$ sudo make install
3.3、根据个人使用习惯设置python 和 pip 的指向或者设置环境变量:由于默认的系统中/usr/bin 下并没有占用 python 和 pip,所以直接创建链接就行
不改变环境变量PATH,直接在 /usr/bin 下创建链接:
[deployer@localhost bin]$ sudo ln -s /usr/local/python3.10.4/bin/python3.10 /usr/bin/python
[deployer@localhost bin]$ sudo ln -s /usr/local/python3.10.4/bin/pip3 /usr/bin/pip
验证一下:
3.4、根据安装python 版本情况升级 pip 及 setuptools 版本。python 3.10.4 默认安装的版本: pip=22.0.4 setuptools=58.1.0
到源码包目录 /usr/local/src/ 下直接运行一下命令进行升级:
[deployer@localhost src]$ sudo python -m pip install --upgrade pip-22.0.4-py3-none-any.whl
[deployer@localhost src]$ sudo python -m pip install --upgrade setuptools-62.1.0-py3-none-any.whl
升级后验证:
python 安装完毕!
4、安装MySQL
4.1、安装mysql依赖项
4.1.1、安装cmake
①、解压cmake 包
②、编译、安装
③、查看安装结果:
可以将 /usr/local/CMake-3.23.1/bin 加入 PATH 或者在 /usr/bin 下面创建链接来使得在任何位置可以执行 cmake
4.1.2、安装 boost
①、安装依赖:
②、安装:将 boost 源码包解压缩并放置到 /usr/local/下面
sudo tar -xvjf boost_1_59_0.tar.bz2
③、使用开源代码(github)安装需要安装 bison 和 m4,源码包安装不需要,不过系统也已经安装了
4.1.3、安装 rpcsvc
①、解压
②、编译、安装:
sudo ./configure --sysconfdir=/etc
sudo make
sudo make install
4.2、解压、编译安装 mysql
4.2.1、解压 并在解压后的源码文件根目录下创建编译目录 mysql_build
4.2.2、进入编译目录 mysql_build ,通过 cmake 编译:
[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 -DMYSQL_DATADIR=/usr/local/mysql/data/mysqldb
4.2.3、make :sudo make VERBOSE=1
(27minutes)
4.2.4、install:sudo make install
4.3、MySQL 初始化:
4.3.1、创建MySQL 运行专有用户 mysql
4.3.2、初始化
创建数据目录data并初始化
sudo mkdir data
sudo bin/mysqld --initialize-insecure --user=mysql
4.3.3、配置mysql服务,启动mysql,测试登录mysql并做安全设置
未启动,没有任何相关的服务, 使用MySQL安装目录下support-files目录里面的mysql.server启动脚本,将该脚本加入系统启动目录 /etc/init.d 下,重命名为 mysql ,赋予可执行权限并加入开机自启动
启动mysql
配置环境变量 vim ~.bashrc
设置密码保护:
服务关闭与再启动测试
MySQL 安装完毕!
5、安装 Nginx
5.1、安装 Nginx 依赖项 pcre-devel
5.2、解压,编译安装nginx
sudo tar -xvzf nginx-1.20.2.tar.gz
sudo ./configure --prefix=/usr/local/nginx-1.20.2
sudo make
sudo make install
5.3、配置nginx 服务,启动nginx并测试
先查看有无相关服务
在 /usr/lib/systemd/system 下创建nginx系统服务文件nginx.service
sudo vim /usr/lib/systemd/system/nginx.service
创建完服务配置文件就可以看到相关服务,如果查询不到注意重载下服务:sudo systemctl daemon-reload
启动 nginx 服务
检测启动情况:
服务停止与再启动:
Nginx 安装完毕!
6、安装 uWSGI
6.1、安装 uWSGI 依赖项 clang
6.2、解压、编译安装 uWSGI:将安装包解压到 /usr/local 下,使用 python 运行 uwsgiconfig.py 安装
sudo tar -xvzf uwsgi-2.0.20.tar.gz -C /usr/local/
sudo python uwsgiconfig.py --build
加入环境变量
二、项目部署
1、解压缩项目包,获取项目依赖,安装项目依赖
2、django默认runserver 启动项目,验证项目能正常启动:python manage.py runserver 0.0.0.0:8008
3、以 uWSGI启动项目:
最简单的以 uWSGI 启动项目和 django 的 runserver 类似:
普通的项目
项目路径下:uwsgi --http :端口 --module 项目名称.wsgi
uwsgi --http :8010 --module PrescriptionPushSystem.wsgi
由于自己的项目涉及线程模块需添加参数
uwsgi --http :8010 --module PrescriptionPushSystem.wsgi --enable-threads
这种启动模式管理起来不方便,为方便管理 uWSGI 的启动以及后台运行,项目根目录下创建配置文件 my_uwsgi.xml
<uwsgi>
<!--Django-related settings-->
<!-- listen port-->
<http>:8008</http>
<!--the base directory (full path)-->
<chdir>/home/deployer/djangoWebRoot/PrescriptionPushSystem-0.1/PrescriptionPushSystem</chdir>
<!--position of python-->
<PATHONHOME>/usr/bin</PYTHONHOME>
<!--Django's wsgi file-->
<module>PrescriptionPushSystem.wsgi</module>
<!--process-related settings-->
<!--master or not-->
<master>True</master>
<!--maxinum number of worker processes-->
<processes>4</processes>
<!--maxinum number of threads-->
<threads>2</threads>
<pidfile>uwsgi.pid</pidfile>
<!--log and back run-->
<daemonize>uwsgi.log</daemonize>
</uwsgi>
启动uwsgi:uwsgi --xml my_uwsgi.xml
停止 uwsgi
4、配置 Nginx 处理静态资源
直接修改默认的配置文件
:wq 后切换 root 身份检查语法错误:
还真搞错了!
5、修改uWSGI配置文件使uwsgi与nginx能够进行通信
6、数据库初始化、sessions迁移、settings生产环境设置、静态资源收集后重新加载 uwsgi 和启动Nginx
检测:
静态资源加载失败,查看nginx 的error.log会发现权限不足
查看权限
nginx 主进程用户是 root 工作进程是 nobody,觉得奇怪:collect_static others 权限是具有可进入读取的权限为啥依然权限不足无法读取,想到SELinux的原因,但是关闭SELinux 后依然权限不足,最终还是决定直接指定 nginx 的工作用户为 deployer
重新加载nginx 服务:systemctl reload nginx.service
ok了!至此部署完毕!