Django Web 项目在Linux环境的部署——笔记


环境介绍:

系统: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盘查看是否读取成功:

 创建载点 /mnt/deployment并挂载:

 报了个错!尝试挂载自己的移动硬盘报一样的错查看文件系统类型:

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

 sudo make 

查看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 clean

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

将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!至此算是部署完毕,这篇算是部署笔记,太长了,记录了一些问题,再起一篇做下总结,把关键的理清并记录。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值