固执己见的全栈web框架 — Redwood
670 2023-04-03 04:57:15
# 阿里,华为,腾讯云服务器---》按量付费---》用多少花多少钱# 保证阿里云内要大于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
#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-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
# 源码编译安装---》源码# 前往用户根目录>: 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
# 测试阶段使用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
# 前往用户根目录>: 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的配置文件,让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,正式环境也要装# 启动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
# mysql,redis,python,ngixn,部署前端,部署后端# 每次都要这么做# 只要配置完以后,以后换了任何机器都可以直接运行# python版本,第三方模块问题# 统一环境:本地啥样,到服务器就啥样---》docker--》容器技术# docker:统一环境,资源隔离# docker-compose:单机容器编排# docker-compose up -前端已经编译完成---》老的项目在我这编译不了---》node版本很高---》视频播放器报错--》最新代码试---》