0
点赞
收藏
分享

微信扫一扫

Django Web 项目在Linux环境的部署

前行的跋涉者 2022-04-30 阅读 41

环境介绍:

系统: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了!至此部署完毕!

举报

相关推荐

0 条评论