路飞:上线架构图、阿里云购买云服务器ECS、云服务器安装mysql、云服务器安装redis(源码安装)、云服务器安装python3.8(源码安装)、安装uwsgi、安装虚拟环境、安装nginx(源码安装)、路飞前端部署、路飞后端部署、路飞后台管理样式处理

一、上线架构图

当我们上线项目的时候,需要把项目上传到服务器上,并且需要在公网ip地址运行项目,这里我们使用云服务器来操作

常见的云服务器:

  • 阿里云
  • 腾讯云

上限架构图

img

基本流程就如图片上描述的,前端和后端项目跑在不同的端口,通过nginx(一个高性能的HTTP和反向代理web服务器)进行反向代理

ps:我把后端路由配置成了8000端口,因此nginx不再是8080端口,而是8000端口

二、阿里云购买云服务器ECS

2.1试用版云服务器ECS获取流程

步骤一

打开阿里云官网后,登陆,然后点击右上角的控制台,如果之前打开过云服务器ECS,控制台处可以看到快捷入口

img

步骤二

如果没有,就点击上方的搜索框,搜索云服务器ECS

img

步骤三

在新出现的窗口中点击管理控制台

img

步骤四

在新出现的另一个窗口中点击创建我的ECS

img

步骤五

这时候就会出现ECS的配置界面,因为是试用,我们选的随便一点,各种配置都选好一点就行了,反正免费

img

img

步骤六

点击下方的免费试用,然后去管理控制台中查看

img

步骤七

这时候就能看到我们的ECS服务器的各种信息了

img

2.2ssh客户端连接远程服务器

ssh:远程连接工具

这里我们介绍三种远程连接工具

  • xshell(只有windows版)
  • finalshell:各个平台都有的远程连接工具
  • Git Bash也可以使用命令连接远程服务器

2.3finalshell连接远程数据库

finalshell下载后一路下一步安装即可

步骤一

打开finalshell,然后根据图片的提示去创建链接

img

步骤二

配置连接的名称和服务器的ip(使用公网ip),以及用户名和密码

img

ps:用户名跟密码可以在阿里云的控制台界面查看

如果不想找,用户名在没有特别设置的情况都是root,密码可以上阿里云的网页去修改

img
img
img

步骤三

点击我们创建的链接快捷方式,就可以进入对应的服务器界面

img

img

2.4远程服务器的准备工作

步骤一

重命名主机名称

打开etc目录下的hostname文件,在该文件中修改后重启,就可以更改主机名称

[root@iZuf6gegyofej6xvami1ibZ ~]# vi /etc/hostname

[root@zzh_luffy ~]# cat /etc/hostname
zzh_luffy
这里我们把hostname文件的内容修改成了zzh_luffy

img

步骤二

执行下方的命令,配置一下服务器,装一些常用的依赖

-yum update -y    yum相当于python中的pip,是安装工具

img

    -yum -y groupinstall "Development tools"
    # 装了一堆开发用的工具,git

img

	-yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
    这是一些别的软件,就跟我们写项目的时候需要用到模块一样的原理

img

img

三、云服务器安装mysql

步骤一

前往用户根目录

>: cd ~  # 回到你家路径  /root

ps:如果是别的用户会回到/home目录下

步骤二

下载MySQL5.7

>: wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

ps1:需要使用别的版本,访问这个路由的前面部分的网址去查找对应的路由即可

ps2:安装后我们可以使用命令ll,查看到mysql5.7版本的安装包已经下载到了当前目录下

img

步骤三

安装MySQL5.7

>: yum -y install mysql57-community-release-el7-10.noarch.rpm
>: yum install mysql-community-server --nogpgcheck -y
这里的的第二条命令的意思是不使用密钥去安装

普通版本的命令如下:
>: yum -y install mysql-community-server

img

img

步骤四

启动mysql57并查看启动状态

[root@zzh_luffy ~]# systemctl start mysqld.service
启动mysql服务
[root@zzh_luffy ~]# systemctl status mysqld.service
查看mysql服务状态

img

步骤五

查看mysql的默认密码并登陆

ps:mysql的默认密码存储在/var/log/mysqld.log文件中

[root@zzh_luffy ~]# grep "password" /var/log/mysqld.log
2023-03-14T09:30:16.602346Z 1 [Note] A temporary password is generated for root@localhost: (hdoehsQi3qz

这里我们可以看到默认密码十分的复杂:(hdoehsQi3qz

使用默认密码登陆mysql查看

[root@zzh_luffy ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.41

步骤六

修改mysql的密码(可选操作)

ps:修改密码的时候是有复杂度要求的,要有大小写字母、数字、以及特殊符号

>: ALTER USER 'root'@'localhost' IDENTIFIED BY '这里添修改后的密码';

img

四、云服务器安装redis(源码安装)

步骤一

前往用户根目录

>: cd ~

步骤二

下载redis-5.0.5

>: wget http://download.redis.io/releases/redis-5.0.5.tar.gz

ps:跟安装mysql一样,可以自行去网站上更换版本

img

步骤三

解压安装包

>: tar -xf redis-5.0.5.tar.gz

img

步骤四

进入解压后的文件夹中

>: cd redis-5.0.5

步骤五

在redis-5.0.5文件夹中运行make命令编译环境

>: make

img

ps:编译后,在src路径下会有可执行文件:redis-server redis-cli(这两个命令比较重要)

步骤六

复制环境到指定路径完成安装

>: cp -r /root/redis-5.0.5 /usr/local/redis

这里是把redis-5.0.5文件夹内的环境文件,复制到usr文件夹下的local文件夹下的redis文件夹中,相当于进行了重命名

ps:推荐使用绝对路径,相对路径容易犯错

img

步骤七

配置redis可以后台启动:修改下方文件的内容

redis.conf就是redis的配置文件

需要修改的配置在第136行,修改后保存退出

[root@zzh_luffy redis]# vim /usr/local/redis/redis.conf

daemonize yes

img

步骤八

给redis-server 和 redis-cli创建软连接,这里的软连接相当于windows中的环境变量,让我们可以在任意路径使用命令

ps1:/usr/bin相当于环境变量目录

ps2:软硬链接的知识点可以自己了解一下,类似深浅拷贝

# /usr/bin/ 在环境变量中,所有以后直接敲redis-server就能找到了
>: ln -s /usr/local/redis/src/redis-server /usr/bin/redis-server
>: ln -s /usr/local/redis/src/redis-cli /usr/bin/redis-cli

步骤九

后台运行redis,需要进入到redis.conf这个配置文件所在的目录下执行命令

ps:&符号是让他在后台运行

>: cd /usr/local/redis
>: redis-server ./redis.conf &

步骤十

查看redis在后台的运行状态

ps aux |grep redis

步骤十一

测试redis环境

>: redis-cli

在内部就可以用set和get设置和查找对应的数据
如果在内部执行了shutdown,会关闭redis服务

五、云服务器安装python3.8(源码安装)

提示

  • linux mac 系统服务是用python写的 python2 写的,所以这俩系统中默认自带了python2,不需要再次安装
  • 阿里云的centos 自动装了python3.6

所以现在我们的云服务器上有python2 和python3.6

因此这里我们在安装python3.8的时候需要配置好多版本共存

yum安装python

yum install python

使用centos的yum可以快速安装python解释器,但是不能指定版本,不能指定安装目录

源码安装python解释器

使用源码安装,可以自行指定解释器版本以及安装路径

步骤一

安装一些第三方插件(源码安装python解释器需要依赖第三方插件),这里可能准备工作中没有装全,建议再执行一次下方的命令

[root@zzh_luffy redis]# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y

img

步骤二

前往用户根目录

>: cd 
或
>: cd ~

步骤三

下载 或 上传 Python3.8.6 到 服务器终端,如果本地有就上传,这里我们采用下载的方式

[root@zzh_luffy ~]# wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz

步骤四

解压安装包

tar -xf Python-3.8.6.tgz

img

步骤五

进入目标文件

cd Python-3.8.6

这里的Python-3.8.6内就是解释器的源码文件

步骤六

配置安装路径:/usr/local/python3

我们要把python3.8.6 编译安装到/usr/local/python38路径下,这里是通过configure文件配置安装路径

>: ./configure --prefix=/usr/local/python38

img

步骤七

编译并安装,如果报错,说明缺依赖

-make &&  make install

如果报错了,就执行下方的命令安装依赖
-yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y

安装成功后结果如图

img

当我们安装成功后可以进入/usr/local/目录下

这里我们可以看到多了一个python38文件夹

img

然后进入python38文件夹后我们可以看到一个bin目录,这里面存有pip3和python3的执行文件

img

步骤八

建立软连接:/usr/local/python38路径不在环境变量

我们在终端执行命令把 python3,pip3添加到环境变量中,并且重命名成pip3.8和python3.8

ps:没有吧/usr/local/python38/bin加入到环境变量

-ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8 -ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8

img

机器上有多个python和pip命令,对应关系如下

python       2.x      
python3      3.6      pip3
python3.8    3.8      pip3.8

步骤九

删除安装包与文件(可选)

>: rm -rf Python-3.8.8
>: rm -rf Python-3.8.8.tar.xz

六、安装uwsgi

django flask项目上线,需要使用uwsgi部署,性能高,符合wsig协议的web服务器

项目上限的时候使用uwsgi运行django,不再使用测试阶段的wsgiref来运行django了

6.1配置pip源:阿里云不用配置,默认配置阿里源

bash

1)创建pip配置路径
>: mkdir ~/.pip

2)进入目录编辑配置文件:填入下方内容
cd ~/.pip && vim pip.conf

[global]
index-url = http://pypi.douban.com/simple
[install]
use-mirrors =true
mirrors =http://pypi.douban.com/simple/
trusted-host =pypi.douban.com

6.2安装步骤

步骤一

进入python38安装路径的bin目录下

[root@zzh_luffy bin]# cd /usr/local/python38/bin

步骤二

使用pip3.8安装uwsgi

pip3.8 install uwsgi

img

步骤三

建立软连接

-ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi

可以在usr的bin目录中找到uwsgi文件了

七、安装虚拟环境

步骤一

安装虚拟环境模块以及依赖

>: pip3.8 install virtualenv
>: pip3.8 install virtualenvwrapper

这里是换源命令
>: pip3.8 install -U virtualenvwrapper -i https://pypi.douban.com/simple/ 


如果装不成功,就执行下方的命令(反正我没成功)
# python3.8 -m pip install --upgrade pip    # 升级pip版本
# python3.8 -m pip install --upgrade setuptools 
#升级setuptools,相当于一个安装工具
# pip3.8 install pbr
# 安装另一个模块

操作截图

img

img

img

img

img

在安装成功后我们可以在/usr/local/python38/bin目录下找到virtualenv等可执行文件

img

步骤二

建立虚拟环境软连接

>: ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv

步骤三

这时候我们在root目录下可以看到多了一个.bash_profile文件

[root@zzh_luffy ~]# ls -al
总用量 25840
dr-xr-x---.  7 root root     4096 3月  14 19:01 .
dr-xr-xr-x. 18 root root     4096 3月  14 14:55 ..
-rw-------   1 root root       42 3月  14 17:03 .bash_history
-rw-r--r--.  1 root root       18 12月 29 2013 .bash_logout
-rw-r--r--.  1 root root      176 12月 29 2013 .bash_profile
-rw-r--r--.  1 root root      176 12月 29 2013 .bashrc
drwx------   3 root root     4096 2月   8 10:35 .cache
-rw-r--r--.  1 root root      100 12月 29 2013 .cshrc
-rw-r--r--   1 root root    25548 4月   7 2017 mysql57-community-release-el7-10.noarch.rpm
-rw-------   1 root root       18 3月  14 17:49 .mysql_history
drwxr-xr-x   2 root root     4096 2月   8 10:35 .pip
-rw-r--r--   1 root root      206 3月  14 14:55 .pydistutils.cfg
drwxr-xr-x  18 1000 1000     4096 3月  14 18:51 Python-3.8.6
-rw-r--r--   1 root root 24377280 1月  27 2022 Python-3.8.6.tgz
-rw-------   1 root root        7 3月  14 19:01 .python_history
drwxrwxr-x   6 root root     4096 5月  16 2019 redis-5.0.5
-rw-r--r--   1 root root  1975750 6月  27 2020 redis-5.0.5.tar.gz
-rw-------   1 root root       23 3月  14 18:25 .rediscli_history
drwx------   2 root root     4096 2月   8 10:36 .ssh
-rw-r--r--.  1 root root      129 12月 29 2013 .tcshrc
-rw-------   1 root root      706 3月  14 18:10 .viminfo

这个文件相当于linux系统的环境变量,我们需要对他进行配置

ps:之前的bin目录相当于用户的环境变量

>: vim ~/.bash_profile

进入编辑模式后我们在原有内容的下方加入下列配置

VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8
source /usr/local/python38/bin/virtualenvwrapper.sh

img

ps:配置中的这些文件都需要存在。路径不一样需要自行更改

编写完成后保存并退出

步骤四

更新配置文件内容

>: source ~/.bash_profile

img

虚拟环境默认根目录

~/.virtualenvs

步骤五

创建虚拟环境

-mkvirtualenv -p python3.8 luffy

ps1:创建成功后会直接进入虚拟环境内

ps2:进入虚拟环境的命令——workon 虚拟环境名称

ps3:退出虚拟环境的命令——deacvite

步骤六

安装django3.2.2模块

(luffy) [root@zzh_luffy ~]# pip3.8 install django==3.2.2

img

安装完成后我们可以进入/root/.virtualenvs/目录中查看我们刚才创建的虚拟环境,相关文件都存在luffy文件夹中

[root@zzh_luffy ~]# cd /root/.virtualenvs/

img

八、安装nginx(源码安装)

8.1nginx软件介绍

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

简单概括,他的作用就是监听端口实现反向代理,然后可以转发http请求,代理静态文件,负载均衡

8.2安装nginx

步骤一

前往用户根目录

>: cd 
或
>: cd ~

步骤二

下载nginx1.13.7

>: wget http://nginx.org/download/nginx-1.13.7.tar.gz

img

步骤三

解压安装包

>: tar -xf nginx-1.13.7.tar.gz

img

步骤四

进入目标文件nginx-1.13.7

>: cd nginx-1.13.7

步骤五

配置安装路径:/usr/local/nginx

>: ./configure --prefix=/usr/local/nginx

img

步骤六

编译并安装

>: make && sudo make install

img

步骤七

建立软连接:终端命令 nginx

>: ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

步骤八

删除安装包与文件(可选)

>: cd ~
>: rm -rf nginx-1.13.7
>: rm -rf nginx-1.13.7.tar.xz

步骤九

测试Nginx环境,服务器运行nginx,本地访问服务器ip

>: nginx
>: 服务器绑定的域名 或 ip:80

查看nginx的运行状态

[root@zzh_luffy nginx-1.13.7]# nginx
[root@zzh_luffy nginx-1.13.7]# ps aux |grep nginx
root     22400  0.0  0.0  20544   604 ?        Ss   20:12   0:00 nginx: master process nginx
nobody   22401  0.0  0.0  20988  1048 ?        S    20:12   0:00 nginx: worker process
root     22797  0.0  0.0 112828   984 pts/2    S+   20:12   0:00 grep --color=auto nginx

img

8.3配置安全组

只有配置了安全组后,我们才能访问到我们的项目

步骤一

打开阿里云控制台,然后进入我们的ECS云服务器

img

步骤二

接着点击上方的安全组,然后点击策略进入

img

步骤三

添加规则,让所有的端口都能访问到我们的云服务器

img

8.4测试nginx

完成上面的所有配置后,在浏览器中访问对应的ip和端口,就可以访问到下方的页面

img

我们在 /usr/local/nginx/html/的文件夹下可以找到一个index.html文件,这就是上面的网页展示用的文件

九、路飞前端部署

步骤一

更改配置文件中的地址,改为远程地址

部署前端项目之前,需要把vue的项目编译成纯粹的静态文件,把ajax远程链接的地址改成服务器的地址

src/assets/js/settings.py

export default {
    BASE_URL:'http://106.14.248.70:8000/api/v1'
}

步骤二

编译前端文件

ps:编译之前需要确认项目可以正常运行,并进入到项目目录下

D:\pythonproject\luffy\luffy_city>npm run build

img

编译成功后会在当前目录下出现一个dist文件夹,这就是编译后的文件

我们要把这个文件夹压缩成zip格式后上传到云服务器中去

步骤三

在云服务器上安装上传下载的软件

yum install -y lrzsz

img

步骤四

进入root目录后

输入命令上传文件

[root@zzh_luffy ~]# rz

img
img

步骤五

安装解压工具,然后解压文件

yum install unzip -y
unzip dist.zip

img

步骤六

修改nginx配置文件,实现代理路飞前端

先进入nginx安装路径的conf文件夹内,这里的nginx.conf就是他的配置文件

[root@zzh_luffy ~]# cd /usr/local/nginx/conf/

复制一份配置文件留作备份

mv nginx.conf nginx.conf.bak

然后对创建一个配置文件进行编辑(vim在打开不存在的文件时会自动创建)

vim nginx.conf

加入下方的配置

ps:千万要把配置信息中的注释删除,容易出现报错

    events {
    worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        server {
            listen 80;
            server_name  127.0.0.1; # 改为自己的域名,没域名修改为127.0.0.1:80
            charset utf-8;
            location / {
                root /home/html; # html访问路径
                index index.html; # html文件名称
                try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
            }
        }
    } 

这里的配置就是把/home/html这个文件夹设置成nginx代理的文件夹,然后下一步我们会把前端项目的内容复制到这个文件夹中

步骤七

把dist下的所有内容,cp到 /home/html # 注意路径(因为拷贝的是一个文件夹,所以需要用-r)

[root@zzh_luffy ~]# cp -r dist /home/html

查看html文件夹中的内容
[root@zzh_luffy html]# ll
总用量 28
drwxr-xr-x 2 root root 4096 3月  14 21:57 css
-rw-r--r-- 1 root root 4286 3月  14 21:57 favicon.ico
drwxr-xr-x 2 root root 4096 3月  14 21:57 fonts
drwxr-xr-x 2 root root 4096 3月  14 21:57 img
-rw-r--r-- 1 root root  668 3月  14 21:57 index.html
drwxr-xr-x 2 root root 4096 3月  14 21:57 js

步骤八

重启ngixn

nginx -s reload

执行这个命令后就可以去重新访问我们的网页,我们会发现他变成了我们的前端项目的页面

http://106.14.248.70/

img

十、路飞后端部署

10.1 提交本地代码到远程仓库

步骤一

把dev.py配置文件中的内容拷贝到prod.py中,并修改相关内容

然后我们要把debug模式改为False

DEBUG = False

修改允许访问的地址为我们云服务器的地址

ALLOWED_HOSTS = ['106.14.248.70']

修改前后端的地址,这里的前端因为是跑在80端口,端口号可以省略

BACKEND_URL = 'http://106.14.248.70:8000'

LUFFY_URL = 'http://106.14.248.70'

先上缓存redis的地址,以及数据库的地址,因为是部署在同一台服务器上,所有用本地ip,不用修改,如果以后部署在不同的服务器,就需要我们对他们做出修改

ps:注释建议也删了

prod.py

"""
Django settings for luffy_api project.

Generated by 'django-admin startproject' using Django 3.2.2.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""

from pathlib import Path
import sys
import os

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

sys.path.insert(0, str(BASE_DIR))

SECRET_KEY = 'django-insecure-7lsa_(z3!-w5k_nz%+z-a986qezf-+0)0%$w#r&*g9(ei=n-o6'

DEBUG = False

ALLOWED_HOSTS = ['106.14.248.70']

# Application definition

INSTALLED_APPS = [
    'simpleui',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'corsheaders',
    'home',
    'user',
    'course',
    'order',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # 'utils.common_middle.CorsMiddleWare',
    'corsheaders.middleware.CorsMiddleware',
]

ROOT_URLCONF = 'luffy_api.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'luffy_api.wsgi.application'

name = os.environ.get('LUFFY_NAME', 'luffy')
password = os.environ.get('LUFFY_PASSWORD', 'Luffy123?')

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',
        'USER': name,
        'PASSWORD': password,
        'HOST': '127.0.0.1',
        'PORT': 3306
    }
}
# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'WARNING',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            'maxBytes': 300 * 1024 * 1024,
            'backupCount': 10,
            'formatter': 'verbose',
            'encoding': 'utf-8'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,
        },
    }
}

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}

AUTH_USER_MODEL = 'user.User'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
    'token',
    'name'
)

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}
        }
    }
}

import datetime

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=3000),
}

BACKEND_URL = 'http://106.14.248.70:8000'

LUFFY_URL = 'http://106.14.248.70'

NOTIFY_URL = BACKEND_URL + "/api/v1/order/success/"  # 如果这个接口不对,支付宝永远掉不回来,订单状态永远不会改

RETURN_URL = LUFFY_URL + "/pay/success"

步骤二

复制manage.py,在他所在的目录下新建一个manage_pro.py,在线上使用这个来迁移数据库,运行项目

步骤三

把manage_pro.py中使用的配置文件修改成prod.py

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.prod')

把wsgi.py使用的配置文件也修改成prod.py

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.prod')

步骤四

把项目需要的文件写入到requirements.txt文件中

pip freeze > requirements.txt

步骤五

把日志的保存文件也上传git(之前我们给他设置了忽略)

我在这里备份了原来的日志文件,上传了一个空的日志文件到git仓库中

img

步骤六

上传项目代码到远程仓库

每个app中的数据库迁移文件都不建议上传,因为在公司中,每个人迁移后的文件名称都是一样的,这就很容易导致冲突

但是有些公司为了记录你的操作跟改动,会要求上传

  • 这里我们可以删了所有的迁移文件,然后上传git
  • 或是上传git后,再远程仓库中删除这个数据库迁移文件
  • 或是在最开始编写的时候,就配置好忽略文件,不要让他被管理
依次执行下列命令上传项目

git add .
git commit -m '上线版本'
git push origin master

执行完成后我们就可以在仓库网页上看到我们的项目了

步骤七

我们回到云服务器,进入/home目录下,创建project文件夹

[root@zzh_luffy ~]# cd /home
[root@zzh_luffy home]# mkdir project
[root@zzh_luffy home]# ll
总用量 8
drwxr-xr-x 6 root root 4096 3月  14 21:59 html
drwxr-xr-x 2 root root 4096 3月  15 15:27 project

步骤八

进入project文件夹中,使用git克隆代码

[root@zzh_luffy home]# cd project/
[root@zzh_luffy project]# git clone https://gitee.com/cengmuduoqing/luffy_api.git

这里查看克隆的路由
img
执行结果如图
img

到此为止我们就部署好了后端项目,还需要对他做一些配置

10.2 配置luffy数据库

因为我们在后端项目中是配置了一个只对luffy库有权限的luffy MySQL账号,所以我们在云服务器中也需要重新配置一遍

步骤一

使用root用户登陆mysql

>: mysql -uroot -p

步骤二

创建数据库luffy

>: create database luffy default charset=utf8;

步骤三

设置权限账号luffy的密码:账号密码要与项目中配置的一致

>: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
>: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
>: flush privileges;

创建成功后退出MySQL

>: quit;

img

步骤四

在navicat中连接远程数据库

打开navicat后在左侧空白区域右键,然后点击新建连接,再选择MySQL连接

在弹出的窗口中配置连接名称和用户名跟密码,测试成功后就可以点击确定

img

10.3 安装项目依赖,迁移数据库

步骤一

进入虚拟环境

[root@zzh_luffy project]# workon luffy

步骤二

进入项目路径后,根据requirements.txt安装项目依赖

(luffy) [root@zzh_luffy project]# ll
总用量 4
drwxr-xr-x 6 root root 4096 3月  15 15:30 luffy_api
(luffy) [root@zzh_luffy project]# cd luffy_api/
(luffy) [root@zzh_luffy luffy_api]# pip install -r requirements.txt

在安装的时候,mysqlclient会出错,我们会发现一个模块安装出错,所有的模块都没安装上
img

这时候我们就需要把安装失败的模块先在requirements.txt中注释,然后查找解决问题的方法,一个个想办法安装
img

注释了mysqlclient后我们成功安装了别的项目模块
img

img

步骤三

为了安装mysqlclient,我们需要两个别的模块:mysql-devel,python-devel

安装mysql-devel

而安装mysql-devel的时候大概率会报错

这里我们通过强大的搜索引擎,找到了解决办法

原文档:https://blog.csdn.net/qq_43408367/article/details/127299840

这里我们要自行下载安装包,再进行安装

(luffy) [root@zzh_luffy luffy_api]# rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

(luffy) [root@zzh_luffy luffy_api]# yum install mysql-devel

安装python-devel

(luffy) [root@zzh_luffy luffy_api]# yum install python-devel -y

步骤四

再安装一个mysql的工具后,就可以成功安装mysqlclient模块了

(luffy) [root@zzh_luffy luffy_api]# rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 (luffy) [root@zzh_luffy luffy_api]# pip install mysqlclient

img

安装成功后就可以使用pip list查看已经安装的模块了

img

步骤五

重点:在虚拟环境中安装uwsgi

因为在项目中,django中有uwsgi,所以这里我们需要自行安装一下

(luffy) [root@zzh_luffy luffy_api]# pip install uwsgi

img

步骤六

进入项目文件夹,迁移数据库

(luffy) [root@zzh_luffy luffy_api]# python manage_pro.py makemigrations
(luffy) [root@zzh_luffy luffy_api]# python manage_pro.py migrate

img

img

步骤七

我们需要录入一些数据,这样才能测试,这里我们偷懒直接把之前本地的数据复制过去了
img

在navicat中把原本的库,右键转储成sql文件,然后再新的库中右键运行sql文件

img

ps:不同于本地库,远程库的文件不存在本地。然后操作的时候也别乱删库

10.3 使用uwsgi启动django

在项目上线的时候我们需要使用uwsgi运行项目

但是建议在使用uwsgi运行项目之前先用wsgiref运行项目,测试一下

跑起来如果访问不到,需要去看看安全组策略配置,这个端口开放的越多越危险

 -跑起来,访问测试一下,你们可能访问不到    -原因是:安全组开启 8000和8080端口    -最后期:只留22,3306,6379,80,8080

端口的使用情况分析

我们把前端以及静态资源使用nginx代理在80端口,这样我们直接输入ip就可以访问到我们的项目

然后再最开始我们提到过,nginx运行在8000端口,因为前后端的项目中的后端路由的端口是8000,而在本地我们把项目运行在8888端口,通过nginx代理把8000端口的请求转发代理到8888端口给后端项目

用wsgiref测试项目

步骤一

在配置好安全组策略后,我们进入项目文件夹去启动项目

(luffy) [root@zzh_luffy home]# cd project/luffy_api/
(luffy) [root@zzh_luffy luffy_api]# python manage_pro.py makemigrations

步骤二

启动后在浏览器访问后台的轮播图接口

http://106.14.248.70:8000/api/v1/home/banner/

结果如图

img

使用uwsgi运行项目

步骤一

在项目的文件夹内,创建一个uwsgi的配置文件luffyapi.xml,在内部编写配置信息

我们直接用vim 命令创建并打开luffyapi.xml文件

(luffy) [root@zzh_luffy luffy_api]# vim luffyapi.xml

步骤二

编写配置信息

配置信息如下,还是老要求,注释空格都别多

<uwsgi>    
   <socket>127.0.0.1:8888</socket> <!-- 内部端口,自定义 -->
   <chdir>/home/project/luffy_api/</chdir> <!-- 项目路径 -->
   <module>luffy_api.wsgi</module>  <!-- luffyapi为wsgi.py所在目录名-->
   <processes>4</processes> <!-- 进程数 -->
   <daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>

img

步骤三

使用uwsgi启动djagno

(luffy) [root@zzh_luffy luffy_api]# uwsgi -x ./luffyapi.xml
[uWSGI] parsing config file ./luffyapi.xml
(luffy) [root@zzh_luffy luffy_api]# ps aux |grep uwsgi

看到有四个进程说明没问题

img

步骤四

这时候我们访问我们的网页,我们可以看到之前的轮播图接口,直接获取不到数据了

img

原因如下:

  • uWSGI:配置文件是socket,说明它只能监听 uwsgi协议,浏览器发出去的是http协议,它不能响应
  • 只能http请求发送到nginx上,使用nginx把http请求,转发到uwsgi,nginx支持把http协议转成uwsgi

步骤五

修改nginx 配置文件,完成对http请求的转发

(luffy) [root@zzh_luffy luffy_api]# cd /usr/local/nginx/conf/
(luffy) [root@zzh_luffy conf]# ll
总用量 72
-rw-r--r-- 1 root root 1077 3月  14 20:10 fastcgi.conf
-rw-r--r-- 1 root root 1077 3月  14 20:10 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 3月  14 20:10 fastcgi_params
-rw-r--r-- 1 root root 1007 3月  14 20:10 fastcgi_params.default
-rw-r--r-- 1 root root 2837 3月  14 20:10 koi-utf
-rw-r--r-- 1 root root 2223 3月  14 20:10 koi-win
-rw-r--r-- 1 root root 5170 3月  14 20:10 mime.types
-rw-r--r-- 1 root root 5170 3月  14 20:10 mime.types.default
-rw-r--r-- 1 root root  446 3月  14 21:53 nginx.conf
-rw-r--r-- 1 root root 2656 3月  14 20:10 nginx.conf.bak
-rw-r--r-- 1 root root 2656 3月  14 20:10 nginx.conf.default
-rw-r--r-- 1 root root  636 3月  14 20:10 scgi_params
-rw-r--r-- 1 root root  636 3月  14 20:10 scgi_params.default
-rw-r--r-- 1 root root  664 3月  14 20:10 uwsgi_params
-rw-r--r-- 1 root root  664 3月  14 20:10 uwsgi_params.default
-rw-r--r-- 1 root root 3610 3月  14 20:10 win-utf
(luffy) [root@zzh_luffy conf]# vim nginx.conf

需要添加的配置信息如下,我们可以在配置文件中看出来,一个server字典就相当于一条转发配置

    server {
        listen 8000;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:8888;
           uwsgi_param UWSGI_SCRIPT luffy_api.wsgi;
           uwsgi_param UWSGI_CHDIR /home/project/luffy_api/;
        }
    }

img

步骤六

重启nginx,生效配置

(luffy) [root@zzh_luffy conf]# nginx -s reload

这时候我们就可以成功访问到项目的前后端了

img

当我们成功上线后,之前支付宝的回调端口才能成功发送回调请求到我们的后端

十一、路飞后台管理样式处理

问题分析

这时候我们登陆项目的后台管理,会发现页面不能成功展示出来

-访问地址是:
http://106.14.248.70:8000/admin/

img
这里需要对uwsgi做一个说明

uwsgi为了提高性能,只负责处理动态请求,静态资源不管

	-测试以及编写阶段,项目使用的是wgisref  既能访问静态资源,又能访问动态  测试阶段
    -上线后,使用的是uwsgi,而uwsgi为了提高性能,只处理动态请求【动静分离】
    -静态资源,需要使用nginx代理

在我们的控制台管理界面,我们可以发现我们的请求是发送到了后端的static目录去获取的

img

因此我们需要把这些静态资源收集起来放到static文件夹中去

前后端项目的静态资源罗列

-simpleui的静态资源
-drf的静态资源
-前后端混合项目,你项目的静态资源
-...

处理流程

步骤一

前往指定目录

创建存放静态资源的文件夹static

(luffy) [root@zzh_luffy conf]# mkdir /home/project/luffy_api/luffy_api/static

查看创建的结果

img

步骤二

进入后端项目的settings文件夹内,编写prod.py文件添加static配置

    STATIC_URL = '/static/'
    STATIC_ROOT = '/home/project/luffy_api/luffy_api/static' 
    
    下面这个配置加了会报错的
    # STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

img

img

步骤三

回退到项目的路径下

执行命令,手机静态文件到上面配置的STATIC_ROOT指定的路径下

(luffy) [root@zzh_luffy luffy_api]# python manage_pro.py collectstatic

img

步骤四

去nginx 的配置文件中添加代理

在8000端口下,接着添加一份location配置,让所有访问 /static的请求都去我们刚才指定的目录获取内容

        server {
                listen 8000;
                server_name  127.0.0.1;
                charset utf-8;
                location / {
                        include uwsgi_params;
                        uwsgi_pass 127.0.0.1:8888;
                        uwsgi_param UWSGI_SCRIPT luffy_api.wsgi;
                        uwsgi_param UWSGI_CHDIR /home/project/luffy_api/;
                 }
                location /static {
                alias /home/project/luffy_api/luffy_api/static;
            }
         }

img

步骤五

重启nginx服务

(luffy) [root@zzh_luffy conf]# nginx -s reload

img

步骤六

这时候我们就可以成功的访问前端以及后台管理界面了

访问:80端口是前端 http://106.14.120.164/
因为不写端口默认访问的就是80,所以可以省略

访问 8000是后端 http://106.14.120.164:8080/admin

img

img

ps1:配置了nginx后,以后使用

python manag_pro.py runserver  0.0.0.0:8888

运行不了了项目了

ps2:当我们购买了域名后,可以给ip配置域名,这样就可以使用域名访问我们的项目了

posted @ 2023-03-17 21:37  wwwxxx123  阅读(97)  评论(0编辑  收藏  举报