上线11

内容回顾

文件存储

之前上传到服务器,放到media文件夹下

使用文件服务器托管文件

1.第三方托管

​ 腾讯云

​ 阿里云

​ 七牛云

2.基于开源文件服务器自己搭建

​ fastdsf 》中小文件

​ minio

​ go-fastdsf :是一个基于http协议的分布式文件系统,它基于大道至简的设计理念,一切从简单设计,使得它的运维及扩展变得更加简单,它具有高性能,高可用,无中心,面维护等优点

搜索功能

前端header.vue 搜索框

搜接口:结果:实战课,轻课,免费》分布式全文检索引擎

前端搜索结果页面

支付宝支付

商户:我们系统》申请商户号,需要营业执照

沙箱环境:测试商户号

买家:测试买家

支付流程:用户在我们系统中点击立即购买》我们后端生成支付链接》返回给前端》打开这个支付地址(支付宝付款页面)》用户扫码输入账户密码付款》支付宝收到用户付款》用户付到支付宝商户上》支付宝会有前端回调地址(get)》调到我们配置的前端回调地址》我们做了个付款成功的页面》后台写了个支付宝回调的地址(post,支付宝用,验证了签名,防止破解)

使用第三方sdk

封装了包

  -__init__
  -settings.py
  -pay.py
  -pem
  -支付宝公钥
  -我们私钥

订单板块结构表

order

orderDetail

下单接口

前端传入的数据

  {courses:[1,],total_amount:99,subject:订单标题}

后端

1取出课程列表,根据课程列表拿到course对象,统计里面的金额与前端对比是否一致

2.生成订单 uuid

3.拿到购买用户request.user中取

4.生成支付链接 放到context中

5.把订单存起来,存到order订单表与orderDetail订单详情表中

6.取出context中的支付链接把支付链接返回前端,前端跳转到支付宝支付页面

前端支付

open函数打开支付链接地址

付款成功回到支付成功页面

两个回调

get回调地址用于给前端查询是否真正付款成功

post回调地址用来给支付宝,当用户支付成功回调的地址,更新用户订单状态

内容详细

上线架构图

服务器,公网ip地址

云服务器:阿里云,腾讯云

上线架构图

上线图

阿里云购买

购买阿里云服务器

ssh客户端

xshell

finalshellhttp://www.hostbuf.com/t/988.html

git Bash命令

配置一下服务器,装一些常用的依赖

  #更新yum工具
  yum update -y
  # 装了一堆开发用的工具,git
  yum -y groupinstall "Development tools"
  # 安装一些可能会用到的工具
  yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel -y

云服务器安装mysql

前往用户根目录

  # 回到家目录/root
  cd ~

下载mysql57

这个版本不需要只需跟着步骤来就行了

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

安装

  yum -y install mysql57-community-release-el7-10.noarch.rpm
  # 真正安装上面选择完毕后这个直接执行
  yum install mysql-community-server --nogpgcheck -y

启动mysql57并查看启动状态

启动mysql

  systemctl start mysqld.service

查看mysql启动状态

  systemctl status mysqld.service

image-20230314192822108

查看默认密码并登录

  grep "password" /var/log/mysqld.log
   
  # 密码 qTPzt<srl5**
   

image-20230314192906943

登录

  mysql -uroot -p
  # 密码 qTPzt<srl5**
   

image-20230314193019068

修改密码

  ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lqz12345?';

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

前往用户跟目录

  cd ~

下载redis-5.0.5

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

解压安装包

  tar -xf redis-5.0.5.tar.gz

进入目标文件

  cd redis-5.0.5

编译环境

  make
  # 在src路径下会有可执行文件:redis-server redis-cli

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

  cp -r ~/redis-5.0.5 /usr/local/redis

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

  vim /usr/local/redis/redis.conf
   
  daemonize yes

完成配置

  esc
  :wq
  回车

建立软连接(因为/usr/local/redis/src)没有加到环境变量

  # /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

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

查看是否正常运行

  ps aux |grep redis

测试redis环境

  redis-cli

image-20230314194116325

关闭redis服务

  pkill -f redis -9

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

linux mac 系统服务是用python写的python2写所以系统中默认带了python2

阿里云的centos自动装了python3.6

云服务器上有python2和python3.6

自己装python3.8

centos快速安装 yum install python 可以快速安装,但是不能指定版本,不能指定安装目录

源码安装 下载指定版本的源码,编译安装

所以linux和mac都自带python2:系统服务,用的python2写的

阿里云的centos默认安装了python3.6

python2 python3.6 python3.8

源码安装python,依赖一些第三方zlib* libffi-devel

  yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel -y

前往用户根目录

  cd ~

下载或上传python3.8.6 到服务器终端

  wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz

解压安装包

  tar -xf Python-3.8.6.tgz

进入目标文件

  cd Python-3.8.6

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

把python3.8.6 编译安装到/usr/local/python38路径下

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

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

  make && make install
  yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel -y

建立软连接/usr/local/python38路径不在环境变量,终端命令 python3,pip3

把/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

机器上有多个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部署,性能高,符合wsgi协议的web服务器

使用uwsgi运行django,不在使用测试阶段的wsgiref来运行dajngo了

uwsgi是符合wsgi协议的web服务器,使用c写的性能高,上线要使用uwsgi

安装步骤

在真实环境安装

  pip3.8 install uwsgi

安装到了python38的安装路径的bin路径下了

建立软链接

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

image-20230314200019952

安装虚拟环境

pip换源

  在root文件夹.pip文件夹pip.conf文件内填写
  # 创建文件
  mkdir .pip
  cd .pip
  vim pip.conf
  下入下面代码
  esc
  :wq
  回车
  退出保存
   
   
  [global]
  index-url = https://mirrors.aliyun.com/pypi/simple
   
  [install]
  trusted-host = mirrors.aliyun.com

安装前先更新一下pip 与setuptools pbr 减少安装模块错误

  # 升级pip版本
  python3.8 -m pip install --upgrade pip
   
  #升级setuptools
  python3.8 -m pip install --upgrade setuptools
   
  pip3.8 install pbr

安装依赖

  pip3.8 install virtualenv
   
   
  pip3.8 install virtualenvwrapper

建立虚拟环境软连接

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

配置虚拟环境:填入下方内容

~/ 表示用户家路径:root用户,就是

在/root/.bash_profile

  vim ~/.bash_profile

退出编辑并保存

  esc
  :wq

更新配置文件内容

  source ~/.bash_profile

image-20230314200908841

虚拟环境默认环境目录~/.virtualenvs

创建虚拟环境

  mkvirtualenv -p python3.8 luffy

image-20230314201400671

  # 退出虚拟环境
  deactivate
  # 查看虚拟环境
  workon
  # 进入虚拟环境
  workon 虚拟环境名

image-20230314201421006

按章nginx(源码安装)

nginx:软件网关软件

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

运行在服务器上,监听某个端口,可以向这个服务器发生http请求

转发http请求,代理静态文件,负载均衡

安装Nginx

前往用户根目录

  cd ~

下载nginx1.13.7

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

解压安装包

  tar -xf nginx-1.13.7.tar.gz

进入目标文件

  cd nginx-1.13.7

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

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

编译并安装

  make && sudo make install

建立软连接:终端命令 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
   

image-20230314202635471

无法访问时记得查看服务器防护墙是否在开启着,如果在开启着需要关闭才能访问

  1、命令行界面输入命令
  systemctl status firewalld.service
  并按下回车键。
   
  2、然后在下方可度以查看得到“active(running)”,此时说明防火墙已经被打开了。
   
  3、在命令行中输入
  systemctl stop firewalld.service
  命令,进行关闭防火墙。
   
  4、然后再使用命令
  systemctl status firewalld.service
  在下方出现disavtive(dead),这权样就说明防火墙已经关闭。
   
  5、再在命令行中输入命令
  systemctl disable firewalld.service
  命令,即可永久关闭防火墙。
   

路飞前端部署

把vue项目编译成存粹的静态文件,把ajax远程链接的地址改成服务器的地址]

settings.js

  export default {
  BASE_URL:'http://127.0.0.1:80/api/v1'
  }

image-20230314203016281

编译前端

  npm run build

image-20230314203305359

编译后打包成zip压缩包,传到云服务上去

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

  yum install -y lrzsz
   
  rz 选择上传就行

解决zip

  yum install unzip -y
   
   
  unzip dist.zip

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

来到Nginx安装目录的conf路径下

  mv nginx.conf nginx.conf.bak
   
  vim nginx.conf #写入
  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问题
  }
  }
  }

image-20230314204505441

把dist下所有内容 cp 到/home/html 注意路径

  cp -r dist /home/html

重启nginx

  ginx -s reload

image-20230314204759703

访问自己云服务器ip就能看到前端页面了

  http://自己的云服务器ip/

路飞后端部署

提交本地代码

把配置文件修改

  Debug模式
  ALLOWED_HOSTS
  点后端地址
  数据库地址
  redis地址

上线配置文件

prov.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
   
  # Build paths inside the project like this: BASE_DIR / 'subdir'.
  BASE_DIR = Path(__file__).resolve().parent.parent
  import sys, os
   
  sys.path.insert(0, str(BASE_DIR))
  sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
   
  # Quick-start development settings - unsuitable for production
  # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
   
  # SECURITY WARNING: keep the secret key used in production secret!
  SECRET_KEY = 'django-insecure-t9pg0*4&7qu29p^yth8u@w8puvp6u6475p=*bt8*6q-gabz530'
   
  # SECURITY WARNING: don't run with debug turned on in production!
  # DEBUG = True
  DEBUG = False
   
  ALLOWED_HOSTS = ['*']
   
  # Application definition
  INSTALLED_APPS = [
  'simpleui.apps.SimpleApp',
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'home',
  'user',
  'rest_framework',
  'rest_framework_jwt',
  'corsheaders',
  'course',
  'django_filters',
  '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_middleware.ResponseMiddlerware',
  'corsheaders.middleware.CorsMiddleware'
  ]
   
  ROOT_URLCONF = 'luffy_api.urls'
   
  TEMPLATES = [
  {
  'BACKEND': 'django.template.backends.django.DjangoTemplates',
  'DIRS': [],
  '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'
   
  # Database
  # https://docs.djangoproject.com/en/3.2/ref/settings/#databases
  name = os.environ.get('luffy_name', 'luffy')
  password = os.environ.get('luffy_password', 'Luffy123?')
   
  DATABASES = {
  # 'default': {
  # 'ENGINE': 'django.db.backends.sqlite3',
  # 'NAME': BASE_DIR / 'db.sqlite3',
  # },
  'default': {
  'ENGINE': 'django.db.backends.mysql',
  'NAME': 'luffy01',
  'HOST': 'localhost',
  'PORT': 3306,
  'USER': name,
  'PASSWORD': password,
  'CHARSET': 'utf8mb4'
  }
  }
   
  # 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 = 'en-us'
  LANGUAGE_CODE = 'zh-hans'
   
  # TIME_ZONE = 'UTC'
  TIME_ZONE = 'Asia/Shanghai'
   
  USE_I18N = True
   
  USE_L10N = True
   
  # USE_TZ = 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'
   
  standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  '[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字
  simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
   
  LOGGING = {
  'version': 1,
  'disable_existing_loggers': False,
  'formatters': {
  'standard': {
  'format': standard_format
  },
  'simple': {
  'format': simple_format
  },
  },
  'filters': {}, # 过滤日志
  'handlers': {
  # 打印到终端的日志
  'console': {
  'level': 'ERROR',
  'class': 'logging.StreamHandler', # 打印到屏幕
  'formatter': 'simple'
  },
  # 打印到文件的日志,收集info及以上的日志
  'default': {
  'level': 'ERROR',
  'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  'formatter': 'standard',
  'filename': os.path.join(os.path.dirname(BASE_DIR), 'log', 'log.log'), # 日志文件
  'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
  'backupCount': 5,
  'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  },
  },
  'loggers': {
  # logging.getLogger(__name__)拿到的logger配置
  'django': {
  'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  'propagate': True, # 向上(更高level的logger)传递
  # 'level': 'DEBUG', # 如果debug等级日志不打印不记录,那么把这个加上都,文件记录日志的就能生效了,但是控制台打印的还是不能生效
  # 正常项目不会用这么低,因为django用的debug日志太多了,对于我们来说也没什么用所有就info就行了
  }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
  # '购物车记录': {
  # 'handlers': ['default','console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  # 'level': 'WARNING',
  # 'propagate': True, # 向上(更高level的logger)传递
  # }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
  },
  }
   
  REST_FRAMEWORK = {
  'EXCEPTION_HANDLER': 'utils.common_exceptions.exception',
  }
  AUTH_USER_MODEL = 'user.User'
   
  MEDIA_URL = '/media/'
  MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
   
  DB_PREFX = 'luffy'
   
  TENG_CLOUD = {
  'SECRET_ID': os.environ.get('SECRET_ID'),
  'SECRET_KEY': os.environ.get('SECRET_KEY'),
  # 短信应用id
  'SMSSDK_APPID': os.environ.get('SMSSDK_APPID'),
  # 签名名称
  'SIGN_NAME': os.environ.get('SIGN_NAME'),
  # 模板id
  'TEMPLATE_ID': os.environ.get('TEMPLATE_ID'),
  }
  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'
  )
   
  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": "123",
  }
  }
  }
   
  BASE_URL = 'http://10.0.0.200:8080'
   
  # 后台基URL
  BACKEND_URL = 'http://10.0.0.200:8080'
  # 前台基URL
  LUFFY_URL = 'http://10.0.0.200:80'
  # 支付宝同步异步回调接口配置
  # 后台异步回调接口
  NOTIFY_URL = BACKEND_URL + "/api/v1/order/success/" # 如果这个接口不对,支付宝永远掉不回来,订单状态永远不会改
  # 前台同步回调接口,没有 / 结尾
  RETURN_URL = LUFFY_URL + "/pay/success"
  import datetime
   
  JWT_AUTH = {
  'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
  }
   

新建一个manage_pro.py在线上使用这个来迁移数据库

wsgi.py配置修改

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

生成项目依赖

  pip freeze >requirements.txt

提交到git上

  git add .
  git commit -m '路飞项目v1上线版'
  git push origin master

image-20230314205908907

部署到服务器上

  mkdir /home/project
  cd /home/project
  git clone https://gitee.com/xuwuw/luffy_api.git

image-20230314210115827

配置luffy数据库

管理员链接数据库

  mysql -uroot -p

创建数据库

  create database luffy default charset=utf8;

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

  grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
   
  grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
   
  # 刷新权限
  flush privileges;

退出msyql

  quit

image-20230314210532130

检查用户

  mysql -uroot -p
  Luffy123?
   
  show databases;

image-20230314210854096

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

在远端,安装项目依赖

进入到虚拟环境,进入到项目路径下,只需

  workon luffy

如果mysqlclient装不上,先把mysqlclient注释

  pip install -r requirements.txt

image-20230314211941966

  yum install mysql-devel -y
  yum install python-devel -y
  rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
  pip install mysqlclient

重点 要在虚拟环境中页安装uwsgi

  pip install uwsgi

迁移的记录文件,要不要提交到git上

官方建议提交

我们自己不推荐:如果多人开发,提交会造成冲突,所有不提交

  需要修prov.py中的数据库名改为由luffy01修改为luffy
  python manage_pro.py makemigrations
  python manage_pro.py migrate

迁移成功

image-20230314213134216

录入数据,由于是测试,把本地的sql导出,导入到远端

image-20230314213346610

使用uwsgi启动django

运行django(老司机经验,现有wsgiref运行起来,再用uwsgi跑)

原来测试阶段,使用wsgiref运行

跑起来,访问测试一下,可能访问不到

原因是:安全组没有开启 8888和8000端口

最后期:只留22,3306,6379,80,8080

上线使用uwsgi

  # 测试使用
  # 监听本机所有ip
  python manage_pro.py runserver 0.0.0.0:8000

image-20230314214547778

使用uwsgi步骤

写一个wusgi的配置文件(ini,[xml]) 我们使用xml

  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>

image-20230314215551535

使用uwsgi启动django

  uwsgi -x ./luffyapi.xml
  ps aux |grep uwsgi
  # 看到有四个进程说明没问题

image-20230314220249280

现在访问8888没有响应

image-20230314220458422

uWSGI:配置文件是socket,说明它只能监听uwsgi协议,浏览器只能发出http协议,他不能响应

只能http请求发送到nginx上,使用nginx把http请求,转发到uwsgi,nginx支持把http协议转成uwsgi

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

  server {
  listen 8080;
  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/;
  }
  }

重启nginx

  nginx -s reload

image-20230314222222866

uwsgi上线成功

image-20230314224849761

路飞后台管理样式处理

访问后台管理http://服务器ip地址:8080/admin

image-20230314225001036

发现没有样式

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

wgisref 既能访问静态资源,又能访问动态资源 测试阶段

上线后,uwsgi为了提高性能,只处理动态请求【动静分离】

静态资源,需要使用nginx代理

使用步骤

第一步:收集静态资源

simpleui的静态资源

drf的静态资源

前后端项目混合,项目的静态资源

media文件夹资源

第二步 创建文件夹

  mkdir /home/project/luffy_api/luffy_api/static

第三步修改配置文件prov.py

  STATIC_URL = '/static/'
  STATIC_ROOT = '/home/project/luffy_api/luffy_api/static'

执行这个命令,把静态文件搜集到STATIC_ROOT对应的文件夹下

  python manage_pro.py collectstatic

image-20230314225820197

修改nginx配置文件

  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问题
  }
  }
  server {
  listen 8000;
  server_name 127.0.0.1; # 改为自己的域名,没域名修改为127.0.0.1:80
  charset utf-8;
  location / {
  include uwsgi_params;
  uwsgi_pass 127.0.0.1:8808; # 端口要和uwsgi里配置的一样
  uwsgi_param UWSGI_SCRIPT luffyapi.wsgi; #wsgi.py所在的目录名+.wsgi
  uwsgi_param UWSGI_CHDIR /home/project/luffyapi/; # 项目路径
  }
  # 新增的配置静态文件
  location /static {
  alias /home/project/luffy_api/luffy_api/static;
  }
  location /static {
  alias /home/project/luffy_api/luffy_api/media;
  }
  }
  }

重启nginx

  nginx -s reload

访问80端口是前端http://服务器ip地址/

访问 8080后端 http://服务器ip地址:8080/admin

image-20230314230645319

以后使用

  python manag_pro.py runserver 0.0.0.0:8888
  # 就运行不了了

补充

域名转发

购买域名》备案》域名解析配置

以后访问域名即可

posted @ 2023-03-15 17:18  可否  阅读(73)  评论(1)    收藏  举报