项目上线流程

项目上线流程

购买服务器和服务器配置

# 阿里,华为,腾讯云服务器---》按量付费---》用多少花多少钱# 保证阿里云内要大于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:yesyum -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 下载mysql57wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm# 2 安装mysql57yum -y install mysql57-community-release-el7-10.noarch.rpmyum 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*Omysql -uroot -p# 5 修改密码ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lqz12345?';# 远程连接链不上去,在服务器本地连接可以了

安装redis

# 下载redis-5.0.5wget 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.confdaemonize 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-serverln -s /usr/local/redis/src/redis-cli /usr/bin/redis-cli# 后台运行rediscd /usr/local/redisredis-server ./redis.conf &ctrl + c# 查看服务是否启动ps aux |grep redis# 测试redis环境redis-clictrl + c# 关闭redis服务>: pkill -f redis -9

安装python3.8(源码安装)

# 源码编译安装---》源码# 前往用户根目录>: cd ~# 下载 # 服务器终端wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tar.xzwget 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  -ymake &&  make install# 建立软连接:/usr/local/python38路径不在环境变量,终端命令 python3,pip3ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8python      2.x python3      3.6python3.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 pippython3.8 -m pip install --upgrade setuptoolspip3.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/virtualenv3)配置虚拟环境:填入下方内容>: vim ~/.bash_profileVIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8source /usr/local/python38/bin/virtualenvwrapper.sh4退出编辑状态>: esc5保存修改并退出>: :wq6)更新配置文件内容>: source ~/.bash_profile7)虚拟环境默认根目录:~/.virtualenvs8 )创建虚拟环境mkvirtualenv -p python3.8 luffy# 不使用virtualenvwrapper创建和使用虚拟环境用户家路径:mkdir virtualcd virtualln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenvvirtualenv  luffy# 进入到虚拟环境source /root/virtual/luffy/bin/activate# 退出deactivate# 虚拟环境也要装uwsgi

安装nginx

# 前往用户根目录>: cd ~# 下载nginx1.13.7wget 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# 建立软连接:终端命令 nginxln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx# 删除安装包与文件:>: cd ~>: rm -rf nginx-1.13.7>: rm -rf nginx-1.13.7.tar.xz9)测试Nginx环境,服务器运行nginx,本地访问服务器ip>: nginx>: 服务器绑定的域名 或 ip:80        1)启动>: nginx2)关闭nginx>: nginx -s stop3重启nginx>: nginx -s reload4)查看端口,强行关闭>: 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# 服务端要解压zipyum install -y unzip# 移动到某个路径mkdir /home/htmlmv ~/dist /home/html# 修改nginx 的配置去向Nginx配置目录,备份配置,完全更新配置:填入下方内容>: cd /usr/local/nginx/conf>: mv nginx.conf nginx.conf.bak>: vim nginx.conf>: ievents {    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>: :wq6)重启nginx>: nginx -s reload  # 访问:http://101.132.238.3/

上线后端

上线前配置文件

import osimport sysBASE_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 = TrueUSE_L10N = TrueUSE_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 datetimeJWT_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 luffypip install -r requirements.txt  # 很有可能模块装不上,相应的解决# 先把mysqlclient注释掉yum install mysql-develyum install python-develrpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022pip install mysqlclient

uwsgi与nginx后台项目配置

# 编写uwsgi的配置文件,让uwsgi启动django#  创建luffyapi.xmlvim 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:8888chdir = /home/project/luffy_api/wsgi-file = luffy_api/wsgi.pymodule = luffy_api.wsgiprocesses = 4daemonize = 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    # 重启nginxnginx -s reload

数据库创建用户

# 进入数据库mysql -uroot -pLqz123456?# 创建数据库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,正式环境也要装# 启动uwsgiuwsgi -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_DIRSSTATIC_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版本很高---》视频播放器报错--》最新代码试---》

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部