web层部署python程序

注意:本文编写时用到的相关包都放到了这里,你可以从这里拿包来快速按照本文介绍来进行部署。也可以按照本文各个章节介绍的方式去各个地方下载最新的包,但随着开源社区的更新、部署步骤不保证与本文的一模一样

https://gitee.com/egonlin/djagon-uwsgi-deploy

一、查看项目仓库阅读部署文档

源项目仓库地址:https://github.com/liangliangyy/DjangoBlog

阅读Readme文档参照步骤进行安装

二、安装mysql数据库

强调说明:

按照之前所述分层的思想,mysql数据库应该部署到单独的服务器上
没错,确实应该如此
但如果只是试验阶段,你把mysql数据库也部署到web层服务器上也未尝不可,
待你熟悉整体流程之后,再把mysql抽离到他本应该在的数据库层,也只是
换个远程账号,去登录远程mysql的ip地址而已

注意,我们的代码包里依赖的是mysql,而不是marriadb,虽然二者大部分相同,但在依赖库方面可能存在差异
如果你用mariadb而没有安装mysql,你后续pip3.10 install mysqlclient会报错

从这里找到安装yum源的rpm包:https://dev.mysql.com/downloads/repo/yum/

file

# 1、安装源
rpm -ivh mysql80-community-release-el7-11.noarch.rpm # 会配置好一个yum源

# 2、源有了之后,来安装包
yum install mysql-devel mysql-server-* -y

# 3、修改时区设置:写入到配置文件/etc/my.cnf需要重启mysql实例:
[mysqld] 
。。。
default-time-zone=timezone
修改为
default-time-zone = '+8:00'

# 4、系统时区也要正确
date # 看一下
timedatectl set-timezone 'Asia/Shanghai'  # 用这条命令设置

# 5、启动mysql
rm -rf /var/lib/mysql/*
systemctl restart mysqld

6、初始密码在日志里:cat /var/log/mysqld.log

file

7、用初始密码进入后必须设置密码

# 密码要有难度一些,否则也会导致设置不通过
 ALTER USER 'root'@'localhost' IDENTIFIED BY 'egon@123Abc';

8、创建好库,一会应用会注入数据

CREATE DATABASE `djangoblog` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;

三、安装web应用

3.1 安装python环境

1、系统自带openssl为1.0版,python3.10依赖更高版本1.1版,必须先编译安装好1.1版的openssl,才能继续下一步,不能并行编译安装

wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz --no-check-certificate
tar xf openssl-1.1.1n.tar.gz 
cd openssl-1.1.1n
./config --prefix=/usr/local/openssl
make && make install

2、安装python3.10解释器 # 下载的慢,就先用你浏览器下载(前提你本机的网络有特异功能,你懂的),然后拖到服务器里

wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
tar xf Python-3.10.12.tgz
yum install libffi* libffi-devel* -y  # 依赖
./configure --prefix=/usr/local/python3.10.12 --with-openssl=/usr/local/openssl --with-openssl-rpath=auto  
make && make install

vim /etc/profile 添加两行
PATH=/usr/local/python310/bin/:$PATH
export PATH

source /etc/profile

、3.2 下载应用包

下载包

file

mkdir /blog && cd /blog
上传包DjangoBlog-master.zip
unzip DjangoBlog-master.zip
cd DjangoBlog-master

3.3 安装相关python依赖包

# 1、pip换源速度快
# -->linux系统下
mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
EOF
#---> windows系统下
Windows系统:更改 %HOME%\pip\pip.ini 文件,文件内容如上

# 2、安装python依赖库
cd DjangoBlog-master
pip3.10 install -Ur requirements.txt 

# 如果按照mysqlclient==2.2.0失败,可以尝试改用更低版本的
pip3.10 --no-cache-dir install mysqlclient==1.4.4

3.4 修改配置文件

修改djangoblog/setting.py 修改数据库配置,如下所示:

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘djangoblog’,
‘USER’: ‘root’,
‘PASSWORD’: ‘egon@123Abc’,
‘HOST’: ‘host’,
‘PORT’: 3306,
}
}

修改时区

 1 # 修改前
 2 
 3 LANGUAGE_CODE = ‘en-us’
 4 
 5 TIME_ZONE = ‘UTC’
 6 
 7 USE_I18N =True
 8 
 9 USE_L10N =True
10 
11 USE_TZ = True  # 统一全球的时间
12 
13 
14 # 修改后
15 
16 LANGUAGE_CODE =‘zh-hans’   
17 
18 TIME_ZONE =‘Asia/Shanghai’  
19 
20 USE_I18N =True
21 
22 USE_L10N =True
23 
24 USE_TZ =False

3.5 初始化数据库

cd DjangoBlog-master
python3.10 manage.py makemigrations
python3.10 manage.py migrate

python3.10 manage.py createsuperuser

# 生成测试数据
python3.10 manage.py create_testdata

可以收集静态文件

检索各个app下的static目录下的静态文件拷贝到一起
python3.10 manage.py collectstatic --noinput
python3.10 manage.py compress --force

了解知识:
在Django web框架中,静态文件主要指那些没有被Django视图处理的文件,主要包括CSS文件、JavaScript文件以及图片等。在开发过程中,这些文件通常分散在各个应用的static目录中,这样相对分散,不利于部署和服务。
在Django中,有一个叫做 collectstatic 的命令,它的作用主要是将各个应用下的静态文件收集到一起,以便于在部署时使用。
你可以使用以下命令来收集静态文件:
plaintext
python manage.py collectstatic
当你运行这个命令时,Django会在所有的INSTALLED_APPS列表中找到各个应用内部的static目录,然后将找到的所有静态文件复制到一个共同的目录下。这个共同的目录就是你在settings.py中设置的STATIC_ROOT。
在部署时,你只需要将这个STATIC_ROOT目录放到web服务器(如Nginx、Apache)可以找到的地方,配置好相应的URL,就可以通过网络访问这些静态文件了。
在HTML模板中,你可以使用如下语句来引用静态文件:
plaintext
{% load static %}
<img src="{% static "my_app/image.jpg" %}" alt="My image" />
上面的语句中,{% load static %}被用来加载静态文件,{% static "my_app/image.jpg" %}被用来获取静态文件的URL。其中my_app/image.jpg是从STATIC_ROOT目录开始的相对路径,而不是从应用的static目录开始。

可以用内置的web服务先启动有验证一下,验证完了关掉,我们用uwsgi服务来启

python manage.py runserver 0.0.0.0:8999

file

四、按照配置启动uwsgi服务

4.1 安装uwsgi

pip3.10 install uwsgi

安装报错:

uWSGI compiling server core
[gcc -pthread] core/utils.o
gcc: error: unrecognized command line option ‘-Wformat-signedness’

===问题与解决方法
gcc版本过低,。'-Wformat-signedness' 是 GCC 5.0 之后引入的一个编译选项,如果你的 GCC 版本低于 5.0,那么编译器就不认识这个选项,从而导致错误。
查看当前系统中
# gcc -v
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)

# 安装新的
# 安装 devtoolset-7
yum -y install centos-release-scl
yum -y install devtoolset-7

# 激活 devtoolset-7
scl enable devtoolset-7 bash  # 写入/etc/profile文件

# 检查 gcc 版本
gcc --version  # gcc version 7.3.1

还可以编译安装

wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz
cd uwsgi-latest
make && make install

4.2 配置uwsgi

https://docs.djangoproject.com/zh-hans/5.0/howto/deployment/wsgi/uwsgi/

尽量不要在配置后夹注释,可能会导致配置失败

cat > /aaa/uwsgi.ini << EOF
[uwsgi]
# 监听uwsgi的端口
socket = :8080
# 监听的http协议端口:不需要监听http端口
# http = :8080
# 启动后切换到该目录下作为项目根目录
chdir = /aaa/DjangoBlog
# 对应项目目录下的djangolog目录下的wsgi.py内的application实例
module = djangoblog.wsgi:application
# wsgi-file = djangoblog/wsgi.py  # 与上面的配置等价
# 启动的工作进程数量
processes = 4
# 每个进程开启的线程数量
threads = 2
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi.log

EOF

4.3 启动

cd /aaa
uwsgi --ini uwsgi.ini
cat /var/log/uwsgi.log 
netstat -an |grep 8080

五、配置nginx代理uwsgi

yum install nginx -y

配置
vi /etc/nginx/conf.d/default.conf

    server {
        listen 8111;
        server_name localhost;

        location / {
            # 包含uwsgi的请求参数
            include uwsgi_params;
            # 转交请求给uwsgi
            uwsgi_pass 127.0.0.1:8080;  # uwsgi服务器的ip:port
        }
    }

启动

systemctl restart nginx
netstat -an |grep 80

file

六、强调

如果你在nginx里用uwsgi_pass指令,那么uwsgi.init就要开启uwsgi的端口

socket = :8080

如果你在nginx用proxy_pass指令,那么uwsgi.ini里就应该开启http的端口

http = :8080

七、负载均衡

上面的步骤我们部署完了一台web服务器,web服务器通过nginx对外暴漏的是http协议端口
所以负载均衡层如果用的是nginx的话,需要使用指令proxy_pass

八 了解

django+uwsgi+daphne+supervisor生产环境部署
https://egonlin.com/?p=9204

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术