DC's blog DC's blog
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)

DC

愿我一生欢喜,不为世俗所及.
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)
  • BBS

  • 订单平台

    • 单点知识
    • 表结构
    • 用户名登陆
    • 短信登陆
    • 菜单和权限
    • 级别管理
    • 客户管理
    • 分页和搜索
    • 价格策略
    • 交易中心
    • message组件
    • 我的交易列表
    • worker
    • 部署之代码同步
    • 部署之线上运行
      • 服务和环境配置
        • 安装mysql
        • ★mysql总结(简略版)
        • 安装redis
        • 安装python3
        • 虚拟环境
        • 安装
        • 第三方模块
        • 线上配置local_settings
        • 配置文件
        • 收集静态资源
        • 一个思考
      • 运行项目
        • uwsgi
        • 方式一(不建议)
        • 方式二(推荐)
        • nginx
        • 默认的nginx.conf
        • 自己配置nginx.conf
        • shell脚本
        • reboot.sh
        • stop.sh
        • 数据库的交互
      • 域名
      • https
      • ◆ 一些报错记录
    • 张sir的部署
  • CRM

  • flask+layui

  • django+layui

  • 供应链

  • 实战
  • 订单平台
DC
2024-05-09
目录

部署之线上运行


yum是centos操作系统的包管理工具!
阿里云通过centos安装包时,提示信息是英文的. 将其改为中文!!
local -a | grep "zh_CN"
echo $LANG
localectl set-locale LANG=zh_CN.utf8
source /etc/locale.conf
date
1
2
3
4
5
6
7

# 服务和环境配置

ψ(`∇´)ψ

# 安装mysql

在线上服务器安装mysql

命令 作用
yum install mariadb-server -y 安装mysql服务端
yum install mariadb -y 安装mysql客户端
systemctl start mariadb 启动服务端,服务器关机就关闭了
systemctl enable mariadb 设置开机就启动mysql服务端
systemctl stop mariadb 停止mysql服务端

创建用户、创建数据库、为该用户对该数据库授权!

mysql -u root -p   # - 首次登陆无需密码,直接enter回车即可
UPDATE mysql.user SET password=password('root123') WHERE user='root';  # - 给root账户设置密码,下次登陆就需要密码啦!!
flush privileges;  # 让设置生效!!

- 情况1: ■ 限制连接者的ip地址为所有IP (该实验中,我使用的是情况1)
CREATE DATABASE `数据库名` DEFAULT CHARSET utf8 COLLATE utf8_general_ci; # 创建数据库
# 创建用户并设置密码,允许该用户在任意ip下连接mysql/即 (公司一般不会这样允许的!!)
insert into mysql.user(user,host,password) values('dc','%',password('dc123'));
flush privileges;
grant all privileges on `order`.* to 'dc'@'%';  # 给用户分配数据库权限
flush privileges;

- 情况2: ■ 限制连接者的ip地址为服务器IP地址
CREATE DATABASE `数据库名` DEFAULT CHARSET utf8 COLLATE utf8_general_ci; # 创建数据库
# 创建用户并设置密码,只允许该用户在当前主机ip下连接mysql
# 即该用户只能在当前服务器连接服务器上的mysql,在本地通过远程连接服务器上的mysql不行
insert into mysql.user(user,host,password) values('dc','127.0.0.1',password('dc123'));
flush privileges;
grant all privileges on `order`.* to 'dc'@'127.0.0.1';  # 给用户分配数据库权限
flush privileges;

UPDATE mysql.user SET password=password('dc123') WHERE user='dc';  # - 更新用户密码

"""这意味着,服务器上local_settings.py中写入的mysql配置应是这样的: 特别关注数据库名+用户名+密码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'order',
        'USER': 'dc',
        'PASSWORD': 'dc123',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'CHARSET': 'utf8'
    },
}
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

到这一步后,你会发现创建的dc用户,mysql -udc -p无需密码也可以登陆!!这是怎么回事呢?

因为mariadb安装完成后,也就是mysql-server服务端在初始时,就会有一些默认账户,让你无需密码就可在服务器上使用mysql!!
MariaDB [(none)]> select user,host,password from mysql.user;
+------+-------------------------+-------------------------------------------+
| user | host                    | password                                  |
+------+-------------------------+-------------------------------------------+
| root | localhost               | *FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2 |
| root | iz2vcassvhmuty1upbxbeez | *FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2 |
| root | 127.0.0.1               | *FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2 |
| root | ::1                     | *FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2 |
|      | localhost               |                                           |
|      | iz2vcassvhmuty1upbxbeez |                                           |
| dc   | %                       | *9C86AD51F6FA20CFC43029815B9DCAE6D9EE21A6 |
+------+-------------------------+-------------------------------------------+
7 rows in set (0.00 sec)

★你观察上面这张表的第5行,host值为localhost的那一行,其user和password字段的值都为空.
 意味着,在服务器上登陆mysql,随便写一个用户名都是不需要密码的!! 也就解释了为啥前面创建的dc用户无需密码也可以登陆!
 第6行同理!!

>> 解决方案:把那两行数据删除即可!!
delete from mysql.user where host='localhost' and user='';
delete from mysql.user where host='iz2vcassvhmuty1upbxbeez' and user='';
然后停止mysql服务端再启动.
systemctl stop mariadb
systemctl start mariadb
mysql -udc -p  # 这时在服务器上登陆dc用户就需要密码才能登陆啦!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

再思考一个问题:
我们给dc用户限制连接服务器上mysql的IP是所有IP都可以连接!! 那么我们在自己的电脑上可以吗??

数据库允许了,服务器不允许啊!!服务器没开放mysql的3306端口!!ssh服务的端口号22是开放了的!
当服务器在安全组里开放了3306端口后,在自己的电脑上的终端输入命令:
mysql -u dc -h 47.109.154.134 -p  就可以在自己电脑上访问服务器上的mysql啦!!
若服务器没有对外开放3306端口,那么执行该命令后,会一直夯住,一动不动.Hhh
1
2
3
4

image-20240508182041449

# ★mysql总结(简略版)

对安装mysql的步骤做一个归纳总结,便于以后快速操作!!

yum install mariadb-server -y
yum install mariadb -y
systemctl enable mariadb
systemctl start mariadb

mysql -u root -p  # - 首次登陆无需密码,直接enter回车即可
UPDATE mysql.user SET password=password('root123') WHERE user='root';
flush privileges;
exit;

mysql -u root -p  # - 输入密码root123
CREATE DATABASE `order` DEFAULT CHARSET utf8 COLLATE utf8_general_ci;  # 创建数据库order
show databases;  # 检查
insert into mysql.user(user,host,password) values('dc','%',password('dc123'));  # % -> 127.0.0.1
flush privileges;  # 生效
select user,host,password from mysql.user;  # 检查
grant all privileges on `order`.* to 'dc'@'%';  # % -> 127.0.0.1
flush privileges;   # 生效
show grants for 'dc'@'%';  # % -> 127.0.0.1
exit;

mysql -u root -p  # - 输入密码root123
select user,host,password from mysql.user;
delete from mysql.user where host='localhost' and user='';
delete from mysql.user where host='iz2vcassvhmuty1upbxbeez' and user='';  # 这个host值自己观察下表!
exit;
systemctl stop mariadb
systemctl start mariadb

mysql -udc -p  # - 输入密码dc123

"""
服务器安全组开放3306端口 + 服务器上的mysql允许dc用户在任意IP上访问服务器上的mysql
那么在自己电脑上可输入命令 mysql -u dc -h 47.109.154.134 -p 成功访问服务器上的mysql!!
navicat上配置下也可以访问!!
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 安装redis

在线上服务器安装redis

- yum install redis -y
- vim /etc/redis.conf
  1> 在vim页面,输入 ?requirepass 进行查找, 按n跳转下一个 
  2> 按i进入编辑状态 设置密码 requirepass qwe123456
  3> esc + :wq
- systemctl start redis    # 启动redis
  systemctl restart redis  # 重启redis
  systemctl enable redis   # 开机自启redis
  
[root@iZ2vcassvhmuty1upbxbeeZ ~]# systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
[root@iZ2vcassvhmuty1upbxbeeZ ~]# systemctl start redis

"""★★★
目前:只支持本机/本服务器上连接redis
因为,redis目前的配置是
    bind 127.0.0.1
    requirepass qwe123456
想要在任何地方连接服务器上的redis
1> 服务器的安全组开放redis相关的6379端口
2> redis配置文件这样配置
   bind 0.0.0.0
   requirepass qwe123456
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 安装python3

在线上服务器安装python3.9.5

我看了下, 在线上服务器上, 输入python2或python,使用的是Python 2.7.5; 输入python3,使用的是Python 3.6.8.
接下来,我们在线上服务器上安装 python3.9.5 !! 并通过python3.9可使用它!!

# - 安装gcc,用于后续安装Python时编译源码
yum install gcc -y
# - 安装Python3相关依赖
yum install zlib zlib-devel -y
yum install bzip2 bzip2-devel  -y
yum install ncurses ncurses-devel  -y
yum install readline readline-devel  -y
yum install openssl openssl-devel  -y
yum install xz lzma xz-devel  -y
yum install sqlite sqlite-devel  -y
yum install gdbm gdbm-devel  -y
yum install tk tk-devel  -y
yum install mysql-devel -y
yum install python-devel -y
yum install libffi-devel -y
# - 下载python3.9源码  若没有wget,则先安装 `yum install wget`
mkdir /data/
cd /data/
wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz  
# - 编译安装"有一小丢丢久" <命令默认在/usr/local/bin/下!!> 
tar -xvf Python-3.9.5.tgz
cd Python-3.9.5
./configure
make all
make install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

image-20240508191308991

# 虚拟环境

上面安装的python3.9.5是系统环境, 项目不要直接使用它, 而应该基于安装的python3.9.5创建个虚拟环境给项目用!!

阿里云的服务器pip命令默认使用的是阿里源,腾讯云上的默认使用的是腾讯云..
我们也可以配置pip命令使用哪个源: (没必要Hhh)

pip3.9 config set global.index-url https://pypi.douban.com/simple/  # -- 配置使用豆瓣源!
1
# 安装

虚拟环境的安装

pip3.9 install virtualenv
mkdir /envs  # -- 我们约定以后创建的所有虚拟环境都放在/envs目录下
virtualenv /envs/order --python=python3.9  # -- 在envs的order目录下创建了该虚拟环境

To do:在虚拟环境中安装项目依赖的pip包
1
2
3
4
5
# 第三方模块

在虚拟环境中安装项目所需第三方模块

本地上传代码到仓库 & 服务器从仓库下载代码 & 虚拟环境安装第三方模块

step1: 在本地的pycharm中,打开项目,在其绑定的本地的虚拟环境中,执行命令
       pip freeze > requirements.txt 
step2: 将本地项目上传到gitee仓库中
       git add .
       git commit -m '依赖模块'
       git push origin-ssh main 
step3: 线上服务器同步gitee中的项目
       cd order
       git pull origin main
step4: 线上服务器里,在项目根目录下,激活虚拟环境
       # -- !! 一定要在项目根目录下噢!
       source /envs/order/bin/activate  # 激活虚拟环境
       pip install -r requirements.txt  # 在当前虚拟环境里安装了项目所需的所有第三方包!!
 
deactivate 可退出虚拟环境!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

image-20240508195350511

一点小说明:
- 我们通常会在服务器上把拉取的项目放到一个指定的地点 eg: /data/project/ (这两个目录没有就自己创建)
  在上面的示例中,我偷懒直接放到 /root/ 目录下了,Hhh
- 服务器系统根目录下 /envs 我们约定放所有的虚拟环境!!
1
2
3
4

# 线上配置local_settings

在线上服务器中配置local_settings.py

# 配置文件

local_settings.py在项目根目录下创建!!与settings.py文件同级.

import os
from pathlib import Path

# 关于静态资源,后续希望将Django项目中每个app中的所有静态资源都收集到指定目录下!!
# 因为项目部署后,Django找静态文件的效果很差,Nginx不会说按照注册app的顺序去查找静态资源.
# 所以我们需要将静态资源一起放到某一处!!让nginx的静态资源查找指向这一处地址!!
# ★ 此处设置的静态资源STATIC_ROOT的路径与项目根目录同级!!
BASE_BASE_DIR = Path(__file__).resolve().parent.parent.parent
STATIC_ROOT = os.path.join(BASE_BASE_DIR,"allstatic")

# 报错不显示信息
DEBUG = False

# 按理说应该写当前服务器的IP,但部署到多台服务器上的话,比较麻烦. 写*代指允许项目部署在任意地址上/任意服务器IP
ALLOWED_HOSTS = ['*']

# 线上mysql数据库的配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'order',  # !
        'USER': 'dc',  # !
        'PASSWORD': 'dc123',  # !
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'CHARSET': 'utf8'
    },
}

# redis缓存的配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "PASSWORD": "qwe123456",  # !
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 收集静态资源

★ 一定一定要注意噢!! 后续静态资源有变动, 需要重新进行收集!!!

touch local_settings.py
vim local_settings.py
source /envs/order/bin/activate  # -- 激活虚拟环境
python manage.py collectstatic  # -- 收集静态资源
1
2
3
4

image-20240509090209557

# 一个思考

思考一个问题

项目里,新增了local_settings.py; 远程仓库里是没有这个文件的!!
Q: 那么,当我在线上服务器执行 git pull origin main 命令,同步更新项目代码时,会对local_settings.py有影响吗?
A: 不会!!因为线上服务器的项目里也有 .gitignore 文件!! 它说了,local_settings.py不参与版本控制!!!
1
2
3

# 运行项目

线上部署,运行环境 用uwsgi+nginx 来实现!!

python manage.py runserver 只适用于本地做开发,没有什么并发,性能比较差

image-20240509093826759

当我们在浏览器上输入网址,eg: http://47.109.154.134
它就会找到 47.109.154.134 这台服务器上的80端口!服务器里的nginx默认监听80端口,nginx就开始干活啦!
nginx接收到请求后,会做两方面的处理:
1> 若用户访问的url是关于静态资源的,比如 /static/../ ,nginx就会自动找到静态资源并返回!!
   (该静态资源就是前面我们收集的静态资源!!)
2> 若用户访问的url是关于业务请求的. 此时就需要nginx做反向代理!!
   - 将该请求转发给uwsgi,由uwsgi调用相应的业务逻辑代码,执行完后返回结果.
  
Q: 其实,不用nginx,只用uwsgi,可以吗? 
A: 可以,也就是让uwsgi既处理业务逻辑也处理静态资源. 但uwsgi处理静态资源远没有nginx牛皮!!
1
2
3
4
5
6
7
8
9
10

# uwsgi

在python虚拟环境中安装uwsgi

在线上服务器,任意目录下,执行以下两个命令,安装uwsgi:
source /envs/order/bin/activate
pip install uwsgi

注意!! uwsgi无法像nginx、mysql、redis一样设置开机自动启动;
需要借助 supervisor组件来实现uwsgi的开机自启以及该进程挂掉后进程自己重新运行起来!!!

# 方式一(不建议)

让uwsgi处理 业务逻辑+静态资源, 也就没nginx啥事啦!!

◎ 以命令的形式运行:

uwsgi --http :80 --chdir /root/order/ --wsgi-file order/wsgi.py --master --processes 1 --static-map /static=/root/allstatic
1

◎ 以文件的形式运行: (执行起来省事,命令不用写那么多的参数!!)

[uwsgi]
# 支持http协议 这里是0.0.0.0意味着允许任何人在自己电脑上访问服务器上的uwsgi程序!!
# 服务器的安全组也要记得开发80端口噢!!
# 若写成127.0.0.1,那么意味着 只能在线上服务器上访问线上服务器上的uwsgi程序!!
http = 0.0.0.0:80  
# 执行uwsgi命令时先进入该目录
chdir = /root/order/ 
# 找到wsgi.py
wsgi-file = order/wsgi.py 
# 通常会开4个进程,测试阶段可以只开1个,这样杀进程的时候也好杀
processes = 1  
# 让uwsgi处理静态文件
static-map = /static=/root/allstatic  
# 虚拟环境路径
virtualenv = /envs/order  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

我们将该文件 uwsgi_order.ini (自己随便命名)放到了跟项目的同级目录下.
在虚拟环境下,在该文件所在路径下执行命令: uwsgi --ini uwsgi_order.ini

image-20240509112104251

# 方式二(推荐)

只让uwsgi监听socket请求,即nginx的反向代理的业务逻辑; uwsgi不处理静态资源, 静态资源交给nginx!!

uwsgi无需处理静态文件; 监听本服务器上的nginx转发过来的sorket请求,该请求的端口号8001!!

[uwsgi]
# uwsgi接收nginx 转发/反向代理 过来的请求!!nginx的反向代理的是sorket请求!!
# nginx监听80端口,uwsgi监听其他端口(此处我设置的是8001)!! 
# uwsgi允许本机的nginx传过来的sorket请求即可,所以是127.0.0.1 即只有本服务器能找到uwsgi!!
# Ps: 若nginx在其他服务器上,那么这里得写成 0.0.0.0,且uwsgi所在的服务器的安全组得开放8001端口.
#     这样的话,部署在其他服务器上的nginx才能找到这台服务器上的uwsgi!!
socket = 127.0.0.1:8001
# 执行uwsgi命令时先进入该目录
chdir = /root/order/ 
# 找到wsgi.py
wsgi-file = order/wsgi.py 
# 通常会开4个进程,测试阶段可以只开1个,这样杀进程的时候也好杀
processes = 1   
# 虚拟环境路径
virtualenv = /envs/order
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

uwsgi --ini uwsgi_order.ini & 加了个&,让其在后台进程中跑, 就不会在终端页面中一直夯住啦!!

# nginx

在线上服务器安装nginx

命令 作用
yum install nginx -y 安装nginx
systemctl start nginx 启动nginx
systemctl enable nginx 开机自动启动nginx
systemctl stop nginx 停止nginx
systemctl restart nginx 重启nginx

安装好nginx后,在 /etc/nginx 默认会有一个nginx的配置文件! -- nginx.conf

# 默认的nginx.conf

不满足我们的要求!!

image-20240509151811333

# 自己配置nginx.conf

自己来弄nginx的配置文件!! ψ(`∇´)ψ

重新配置好nginx.conf文件后, 重新启动nginx服务 以及 得保证uwsgi服务是启动中!!
systemctl restart nginx
source /envs/order/bin/activate ; cd ~ ; uwsgi --ini uwsgi_order.ini

image-20240509153614555

■ 若nginx配置好重启后, uwsgi是没有启动的, 那么静态文件能访问到, 但访问业务逻辑相关url时, 会报错:

image-20240509165229292

nginx的配置

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
  
    upstream django {
        server 127.0.0.1:8001;
    }

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        # root         /usr/share/nginx/html;

        # include /etc/nginx/default.d/*.conf;
      
        location /static/ {
            alias  /root/allstatic/;
        }

        location / {
            uwsgi_pass  django;
            include     uwsgi_params;
        }

        # error_page 404 /404.html;
        # location = /404.html {
        # }

        # error_page 500 502 503 504 /50x.html;
        # location = /50x.html {
        # }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# shell脚本

当本地代码改变后, 比如我将登录页的标题改了..
我们需要 本地上传代码到仓库 & 服务器从仓库同步代码 ..
因为逻辑代码变了 - uwsgi要重启; 静态资源变了 - 要重新收集静态资源 、也要重新启动nginx服务!!

Q: 基本上每次线上服务器同步代码后, 都要启动下这些程序, 比较麻烦, 怎么办?
A: 可以通过shell脚本来实现!! 以下示例以uwsgi进程的启动和停止为例.

Q: 如何执行脚本?
A:

第一种: sh reboot.sh
第二种:
  若脚本中开头写了`#!/usr/bin/env bash`, 即指定了那个解释器来解释该脚本语言. 那么就执行命令.
  chmod 755 reboot.sh
  ./reboot.sh
1
2
3
4
5

注意: 你看reboot.sh和stop.sh的脚本代码, 不难看出, 需要将这两个脚本与 uwsgi_order.ini 文件放到同一目录下!!
前面为了方便我直接创建了uwsgi_order.ini 文件在/root/目录下, 这样是不规范的!!
我们应该在自己的本地项目中创建shell目录, 在里面创建并编写 reboot.sh、stop.sh、uwsgi_order.ini后,
上传到远程仓库中, 线上服务器再同步, 进而使用里面的脚本!!

image-20240509165813759

# reboot.sh

启动脚本

#!/usr/bin/env bash

# echo相当于python里的print   033[34m..\033[0m是颜色
echo -e "\033[34m--------------------wsgi process--------------------\033[0m"

# 搜索进程中有无叫 uwsgi_order.ini 的进程
ps -ef|grep uwsgi_order.ini | grep -v grep

sleep 0.5
   
echo -e '\n--------------------going to close--------------------'

# 若进程中有叫 uwsgi_order.ini 的进程,那么根据进程号将该进程杀死!!
ps -ef |grep uwsgi_order.ini | grep -v grep | awk '{print $2}' | xargs kill -9

sleep 0.5

echo -e '\n----------check if the kill action is correct----------'

# 通过虚拟环境下的uwsgi命令重新运行一下 uwsgi进程!!
/envs/order/bin/uwsgi  --ini uwsgi_order.ini &  >/dev/null

echo -e '\n\033[42;1m----------------------started...----------------------\033[0m'
sleep 1

ps -ef |grep uwsgi_day06.ini | grep -v grep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# stop.sh

停止脚本

#!/usr/bin/env bash

echo -e "\033[34m--------------------wsgi process--------------------\033[0m"

ps -ef |grep uwsgi_order.ini | grep -v grep

sleep 0.5

echo -e '\n--------------------going to close--------------------'

ps -ef |grep uwsgi_order.ini | grep -v grep | awk '{print $2}' | xargs kill -9

sleep 0.5
1
2
3
4
5
6
7
8
9
10
11
12
13

# 数据库的交互

初始化线上服务器mysql中的数据!!

注意几点:
1> 自己本地的项目的.gitignore中需写上
   # database migrations
   */migrations/*.py
   !*/migrations/_init_.py
2> 本地上传代码到仓库 & 服务器从仓库同步代码 后, 执行两个操作:
   1. 在服务器上进行数据库的迁移工作!! 进入manage.py所在目录,执行以下命令
      python manage.py makemigrations
      python manage.py migrate
   2. 进入服务器的项目,找到初始化用户的python脚本并执行!!
      source /envs/order/bin/activate
      python init_customer.py  # - 创建多个普通用户
      python init_admin.py     # - 创建管理员用户 dc admin1234!
1
2
3
4
5
6
7
8
9
10
11
12
13

# 域名

到目前,以及部署成功了,大家可以通过服务器的ip来进行访问.. 这是不专业的,应该让大家可以通过域名来访问.

二级域名的拥有者可以任意定义三级及三级以上的域名!
比如小米公司花费两千万买下的mi.com这个二级域名后,他就可以根据其产品和业务在这个二级域名基础上无限定义三级域名或更高级的域名.
eg: 小米云服务:i.mi.com ; 小爱开放平台: xiaoai.mi.com; 小米iot开发者平台:iot.mi.com 等等.
1
2
3

image-20240509185818499

实操: 我购买了个域名, 对该域名进行了以下的解析:

image-20240509192836893

意味着:  <解析配置好后,好一会才会生效 我大概等了半个小时Hhh>
`http://order.dconepiece.online/` ; `http://dconepiece.online/` ; `http://www.dconepiece.online/` ; 
这三个url都可以CDN解析到IP地址 47.109.154.134

但因为我没对 dconepiece.online 进行备案,所以 输入上面三个地址时,显示的页面是 叫我备案的页面!!
1
2
3
4
5

# https

当域名进行备案后, 就能正常访问了, 但会说 域名用的http,不安全, 推荐使用 https..
我们就得申请免费的SSL证书!!

大体步骤如下:

- 购买证书(可申请免费的)
- 下载证书 将相关的2个证书文件放到线上服务器中!
- 修改nginx的配置 下方截图举了个小例子!!
- 重新启动nginx!!
1
2
3
4

image-20240509194707623


# ◆ 一些报错记录

记录在部署过程中的一些报错与解决.

1. 在执行uwsgi命令
uwsgi --http :80 --chdir /root/order/ --wsgi-file order/wsgi.py --master --processes 1 --static-map static=/root/allstatic
浏览器访问47.109.154.134,服务器终端启动的uwsgi,报错提示:
ImportError: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2k-fips  26 Jan 2017'. See: https://github.com/urllib3/urllib3/issues/2168
-- 问题缘由:
   你可以看requirements.txt中的urllib3==2.2.1,其版本应该使用的OpenSSL必须在1.1.1+以上
   然后我们在服务器上输入命令 yum list|grep openssl
   可得知服务器上的openssl的版本是1.0.2, urllib3与openssl的版本不匹配!!
-- 解决办法:
   升级openssl的版本到1.1.1+以上 or 在虚拟环境中降低urllib3的版本为1.22 我选择了后者!!后者的方法解决起来较简单!
1
2
3
4
5
6
7
8
9
10

后续

写了两篇博客,完成了最最最最基础的项目部署!! 还有很多需要学. 比如:
1.进程挂了需自动重启,supervisor组件的使用;
2.处理日志(nginx级别、uwsgi级别、项目级别);
3.希望快速的在多台服务器上部署项目 -- dorker的使用;
4.linux服务器上对用户权限的管理;
5.使用nginx、uwsgi这些服务时,配置文件中 进程数、等待连接数 等应该如何更好的设置.
-- 路漫漫其修远兮,吾将上下而求索.
1
2
3
4
5
6
7

部署之代码同步
张sir的部署

← 部署之代码同步 张sir的部署→

最近更新
01
deepseek本地部署+知识库
02-17
02
实操-微信小程序
02-14
03
教学-cursor深度探讨
02-13
更多文章>
Theme by Vdoing | Copyright © 2023-2025 DC | One Piece
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式