项目上线流程

购买服务器和服务器配置

复制代码
# 阿里,华为,腾讯云服务器---》按量付费---》用多少花多少钱

# 保证阿里云内要大于100块才能买,先用后付费

# 项目上线,需要一台服务器---》买的云服务器---》centos7.9
# 创建ecs---》按量付费---》选上海---》选2核4g---》装系统---》centos 7.9---》选硬盘ssd 20g---》分配公网ip(外网,大家都可以访问到)--》按使用量付费--》自定义密码--》


# 远程连接  ssh
    -软件:xshell  mac上没有
  -finalshell:http://www.hostbuf.com/t/988.html
  -git---》右键打开bash,用它也可以连接
# 全是linux命令
    -ls :查看当前目录下的文件和文件夹
  -pwd:查看你所在路径
  
 
  -root  权限最高,linux所有配置都是文件,一切皆文件
  -删除文件:rm -rf /*     文件系统--》从 / 开始有很多文件夹   系统都进不了

  
# 远程连接
    -ssh root@ip地址   连接方式
  -软件自带的连接
  
# 阿里云机器
    -python 2.7     自带 ---》所有linux,mac都自带2.x  --》系统服务 基于python写的
  -python 3.6.8   自带--》阿里云带的
  -自己再装一个python 3.7 
  
  
# 执行一些命令
yum update -y   # 更新软件  yum 安装软件命令  update更新   -y:yes
yum -y groupinstall "Development tools"  # 批量把开发用的软件都装上 git ...
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel  -y # 依赖  --》python可能装不上
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y
复制代码

安装mysql

复制代码
#1 下载mysql57
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm


# 2 安装mysql57
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum install mysql-community-server --nogpgcheck


# 3 启动mysql57并查看启动状态 
systemctl start mysqld.service  # 启动mysql服务
systemctl status mysqld.service # 查看服务

# 4 查看默认密码并登录
grep "password" /var/log/mysqld.log
#lpqv1uv)hE*O
mysql -uroot -p

# 5 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lqz12345?';


# 远程连接链不上去,在服务器本地连接可以了
复制代码

安装redis

复制代码
# 下载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

# 编译环境  src路径下就有可执行文件---》redis-server,redis-cli等。。。
make 

# 复制环境到指定路径完成安装
cp -r ~/redis-5.0.5 /usr/local/redis

# 配置redis可以后台启动:修改下方内容
vim /usr/local/redis/redis.conf

daemonize yes

# 完成配置修改
>: esc
>: :wq

# 建立软连接  redis-server和redis-cli 是在/usr/local/redis/src/这个路径下,它不在环境变量中, 在任意路径敲redis-cli ---》软连接到/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 &

ctrl + c
# 查看服务是否启动
ps aux |grep redis
# 测试redis环境
redis-cli
ctrl + c

# 关闭redis服务
>: pkill -f redis -9
复制代码

安装python3.8(源码安装)

复制代码
# 源码编译安装---》源码

# 前往用户根目录
>: cd ~

# 下载 
# 服务器终端
wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tar.xz
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.8 编译安装到/usr/local/python38路径下
>: ./configure --prefix=/usr/local/python38

# 编译并安装,如果报错,说明缺依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y
make &&  make install

# 建立软连接:/usr/local/python38路径不在环境变量,终端命令 python3,pip3
ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8
ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8
python      2.x 
python3      3.6
python3.8    3.8

# 删除安装包与文件:
>: rm -rf Python-3.8.8
>: rm -rf Python-3.8.8.tar.xz
复制代码

安装uwsgi

# 测试阶段使用wsgiref,性能低,上线使用uwsgi性能高,它用c写的
# 安装
pip3.8 install uwsgi   
# bin路径下就会有uwsgi这个可执行文件,但是这个路径不在环境变量,换到其他路径找不到
2)建立软连接
ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi

配置虚拟环境

复制代码
1)安装依赖
python3.8 -m pip install --upgrade pip
python3.8 -m pip install --upgrade setuptools
pip3.8 install pbr
>: pip3.8 install virtualenv
>: pip3.8 install -U virtualenvwrapper -i https://pypi.douban.com/simple/ 
# virtualenvwrapper 没有workon这个快捷命令
# 不使用虚拟环境了
# 不使用workon快捷指令了
https://www.cnblogs.com/liuqingzheng/p/9508851.html
  
  
2)建立虚拟环境软连接
>: ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv

3)配置虚拟环境:填入下方内容
>: vim ~/.bash_profile

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

4)退出编辑状态
>: esc

5)保存修改并退出
>: :wq

6)更新配置文件内容
>: source ~/.bash_profile

7)虚拟环境默认根目录:~/.virtualenvs

8 )创建虚拟环境
mkvirtualenv -p python3.8 luffy

# 不使用virtualenvwrapper创建和使用虚拟环境
用户家路径:mkdir virtual
cd virtual
ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv
virtualenv  luffy
# 进入到虚拟环境
source /root/virtual/luffy/bin/activate

# 退出
deactivate

# 虚拟环境也要装uwsgi
复制代码

安装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

9)测试Nginx环境,服务器运行nginx,本地访问服务器ip
>: nginx
>: 服务器绑定的域名 或 ip:80
    
    
1)启动
>: nginx

2)关闭nginx
>: nginx -s stop

3)重启nginx
>: nginx -s reload

4)查看端口,强行关闭
>: ps -aux|grep nginx
>: kill <pid:进程编号>
    
    
    
# 注意:跑在80端口上可以访问,默认阿里云把80端口的安全组开放了,如果跑在8080上,需要开安全组
复制代码

上线前端

复制代码
# 把vue项目编译成纯的 html css js
# 修改后端地址
base_url: "http://101.132.238.3:8080/api/v1/"
  
# npm run build    在项目路径下建dist文件夹,下面放着纯静态文件(html,css,js)

# 把dist文件夹压缩,传到服务器上去,使用ngixn搭理


# 从远端想服务器传文件,需要在服务器安装软件
yum install -y lrzsz

# 服务端要解压zip
yum install -y unzip


# 移动到某个路径
mkdir /home/html
mv ~/dist /home/html

# 修改nginx 的配置
去向Nginx配置目录,备份配置,完全更新配置:填入下方内容
>: cd /usr/local/nginx/conf
>: mv nginx.conf nginx.conf.bak
>: vim nginx.conf
>: i

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
            root /home/html/dist;
            index index.html;
            try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
        }
    }
}   

5)退出
>: esc
>: :wq

6)重启nginx
>: nginx -s reload
  
# 访问:http://101.132.238.3/
复制代码

 

上线后端

上线前配置文件

复制代码
import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# print(BASE_DIR) # /Users/liuqingzheng/luffy_api/luffy_api

# 把apps的路径加入到环境变量了
sys.path.append(os.path.join(BASE_DIR, 'apps'))
# 把 小luffy_api也就是BASE_DIR 也加入到环境变量
sys.path.append(BASE_DIR)

# print(sys.path)
SECRET_KEY = ')xdu2e@a(^1p5ohypkgtft19v*5slt(-m_$gd_o637%^a3f^m('

DEBUG = False

# 服务端地址 ,* 表示任意地址都可以
ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'simpleui',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'corsheaders',
    # 'luffy_api.apps.user' # 太长,我们不喜欢
    'user',
    'home',
    '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',
    'corsheaders.middleware.CorsMiddleware',
]

ROOT_URLCONF = 'luffy_api.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(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'

# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

# 在这,用户名和密码都能看到---》万一你的代码泄露了---》数据库的用户名密码就泄露了--》不安全
# django---》监控公司代码是否被传到github,gitee--》
# B站的go源代码泄露---->某个人传到了github
# 拖库---》华住汉庭酒店---》20g开房数据泄露
# 把密码不写死在源文件中,而从环境变量中取
pwd = os.environ.get("PASSWORD", "Luffy123?")
# # 单独有接口,向接口发送请求,获取到密码---》自己做的
# pwd=requests.get().json()['password']
# # 配置中心 Apollo--公司自己搭建的

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',  # 数据库名字
        'USER': 'lqz',  # 用户名
        'PASSWORD': pwd,
        'HOST': '127.0.0.1',
        'PORT': 3306
    }
}
# 这两句话,只要执行即可,放在那里都行---》只要django执行,所有py文件中顶格写的代码都会执行
# 作用是?猴子补丁,动态替换  --->python一切皆对象,可以动态替换对象
# 如果该源码,后期只要使用django,都要改它的源码
# 所以咱们换另一个操作mysql的模块,mysqlclient
# import pymysql
# pymysql.install_as_MySQLdb()


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/2.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/2.2/howto/static-files/

STATIC_URL = '/static/'

# # 日志相关
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': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用ERROR
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.exception.common_exception_handler'  # 再出异常,会执行这个函数
}

# 把扩写了auth的user表注册一下
AUTH_USER_MODEL = 'user.user'

# 配置media文件夹
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# 跨域问题处理
# 允许简单请求,所有地址 相当于CORS_ORIGIN_ALLOW_ALL="*"
CORS_ALLOW_ALL_ORIGINS = True
# 运行的请求
CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'POST',
    'PUT',
)

# 允许的请求头
CORS_ALLOW_HEADERS = (
    'accept-encoding',
    'authorization',  # jwt
    'content-type',  # json
    'origin',
    'user-agent',
    'Pragma',
)

# 导入用户自定义的配置
from .user_settings import *

import datetime

JWT_AUTH = {
    # 过期时间1天
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

# 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": "123",
        }
    },
    "db1": {
        "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",
        }
    }
}
复制代码

导出项目环境

git add .
git commit -m 'v1版本发布了'
git push origin master

服务端下载后端

# 创建存放后台项目的目录
# mkdir /home/project

# 进入后台项目管理目录同步git仓库中的项目
>: cd /home/project
>: git clone https://gitee.com/liuqingzheng/luffy_api.git

安装虚拟环境依赖

复制代码
workon luffy

pip install -r requirements.txt  # 很有可能模块装不上,相应的解决

# 先把mysqlclient注释掉
yum install mysql-devel
yum install python-devel
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
pip install mysqlclient
复制代码

uwsgi与nginx后台项目配置

复制代码
# 编写uwsgi的配置文件,让uwsgi启动django
#  创建luffyapi.xml
vim luffyapi.xml

<uwsgi>    
   <socket>127.0.0.1:8888</socket>
   <chdir>/home/project/luffy_api/</chdir>    
   <module>luffy_api.wsgi</module>
   <processes>4</processes>
   <daemonize>uwsgi.log</daemonize>
</uwsgi>

[uwsgi]
socket = 0.0.0.0:8888
chdir = /home/project/luffy_api/
wsgi-file = luffy_api/wsgi.py
module = luffy_api.wsgi
processes = 4
daemonize = uwsgi.log
# 配置nginx转发
# 新增的server
    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 是转发http请求,但是咱们现在uwsgi启动是以socket启动的,所以uwsgi只能接收uwsgi协议的请求,不能接收http请求,所以nginx中这样配置,把本来http的请求通过nginx转成uwsgi_params---》转发给uwsgi
  
  
# 重启nginx
nginx -s reload
复制代码

数据库创建用户

复制代码
# 进入数据库
mysql -uroot -p
Lqz123456?
# 创建数据库
create database luffy default charset=utf8;

# 设置权限账号密码:账号密码要与项目中配置的一致
grant all privileges on luffy.* to 'lqz'@'%' identified by 'Luffy123?';
grant all privileges on luffy.* to 'lqz'@'localhost' identified by 'Luffy123?';
flush privileges;

# 退出mysql
>: quit;
复制代码

项目的数据迁移

复制代码
# 只有库,没有表,迁移数据
# 必须在luffy环境下
# 数据库迁移
cd /home/project/luffy_api/
python manage_pro.py migrate


# 导入测试数据---》正式库不这样做
把原来本地的数据,导入到正式库中
复制代码

启动uwsgi,重启nginx

复制代码
#######虚拟环境也要装uwsgi,正式环境也要装
# 启动uwsgi
uwsgi -x ./luffyapi.xml

# pkill -9 uwsgi


# 重启nginx
>: nginx -s reload
  
# 还要启动celery的beat和work
复制代码

静态样式收集动静分离

复制代码
# 项目目录下没有 static 文件夹需要新建
mkdir /home/project/luffy_api/luffy_api/static


# 配置文件修改
# 修改static配置,新增STATIC_ROOT、STATICFILES_DIRS
STATIC_URL = '/static/'
STATIC_ROOT = '/home/project/luffy_api/luffy_api/static'  
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
# 完成静态文件迁移
python /home/project/luffy_api/manage_pro.py collectstatic

# nginx 做动静分离
# 新增的配置静态文件
location /static {
     alias /home/project/luffy_api/luffy_api/static;
 }
location /media {
     alias /home/project/luffy_api/luffy_api/media;
 }

# 重启nginx
复制代码

 

docker-compose一键部署

复制代码
# mysql,redis,python,ngixn,部署前端,部署后端
# 每次都要这么做
# 只要配置完以后,以后换了任何机器都可以直接运行
# python版本,第三方模块问题
# 统一环境:本地啥样,到服务器就啥样---》docker--》容器技术
# docker:统一环境,资源隔离
# docker-compose:单机容器编排
# docker-compose up 
    -前端已经编译完成---》老的项目在我这编译不了---》node版本很高---》视频播放器报错--》最新代码试---》
复制代码

 

posted @   椰子皮0oo0  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
1
点击右上角即可分享
微信分享提示