一、配置开发环境
1.1 新配置文件
-
准备配置文件目录
- 新建包,包名为
settings
,作为配置文件目录。
- 新建包,包名为
-
准备开发和生产环境配置
- 在配置包
settings
, 新建开发和生产环境配置文件。
- 在配置包
-
准备开发环境配置内容。
- 讲默认的配置文件
settings.py
中内容拷贝至dev.py
- 讲默认的配置文件
1.2 指定开发环境配置文件
1.3 工程日志
1.3.1 配置工程日志
# settings/dev.py
# 日志:将运行出错时,记录在日志中,方便后续修改
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用logger,建议设置为False
'formatters': { # 日志格式,提供给handler使用,非必须,如果不设置格式,默认只会打印消息体
'verbose': { # 格式名称
# INFO 2018-04-25 15:43:27,586 views 8756 123145350217728 这是一个日志
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
# INFO 这是一个日志
'format': '%(levelname)s %(message)s'
},
'standard': {
# 2018-04-25 16:40:00,195 [Thread-7:123145575223296] [myapp.log:282] [views:user_query_json_get] [INFO]-
# 这是一个日志
'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'
},
},
'filters': { # 过滤器,提供给handler使用,非必须
'require_debug_true': { # 要求DEBUG=True时才打印日志
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': { # 处理器,设置日志记录方式,必须
'console': { # 处理器名称
'level': 'INFO', # 设置级别
'filters': ['require_debug_true'], # 设置过滤器,多个用逗号分割
'class': 'logging.StreamHandler', # 处理器,这里是控制台打印
'formatter': 'verbose' # 设置日志格式
},
'file': {
'level': 'INFO',
'class': 'logging.FileHandler', # 记录到文件
'filename': os.path.join(os.path.dirname(BASE_DIR), 'logs/dadablog.log'),
'formatter': 'verbose'
},
},
'loggers': { # 日志记录器
'dadablog': {
'handlers': ['console',"file"],
'propagate': True,
'level': "INFO", # 只有设置DEBUG = True时,该配置才会打印sql信息
}
},
}
1.3.2 准备日志文件目录
创建 logs文件夹
1.3.3 日志记录器的使用
# views.py
import logging # python 自带的
# 创建日志记录器
logger = logging.getLogger('dadablog') # settings.py 中最后的日志器
# 输出日志
logger.debug('测试logging模块debug')
logger.info('测试logging模块info')
logger.error('测试logging模块error')
1.3.4 Git记录工程日志
提示:
- 开发过程中,产生的日志信息不需要代码仓库进行管理和记录。
配置完成后:运行程序,测试结果。
1.3.5 知识要点
-
本项目最低日志等级设置为:INFO
-
创建日志记录器的方式:
logger = logging.getLogger('django')
-
日志记录器的使用:
logger.info('测试logging模块info')
-
在日志
loggers
选项中可以指定多个日志记录器
1.4 创建虚拟环境
- 创建项目的虚拟环境
1.5 数据库配置
# 1. 创建数据库
# 2. 新建mysql 用户
# 3. 授权 新用户 访问 dadablog 数据库
# 4. 授权结束后刷新权限
# 5. 更改项目 mysql 配置
二、Celery
2.1 定义
Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统
它是一个专注于实时处理的任务队列,同时也支持任务调度
中文官网:http://docs.jinkan.org/docs/celery/
在线安装 sudo pip3 install -U Celery
离线安装
tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python3 setup.py build
python3 setup.py install
名词解释:
broker 消息传输的中间件,生产者一旦有消息发送,将发至broker;【RQ,redis】
backend 用于存储消息/任务结果,如果需要跟踪和查询任务状态,则需添加要配置相关
worker - 工作者 - 消费/执行broker中消息/任务的进程
2.2 使用Celery
2.2.1 创建worker(消费者)
#创建 tasks.py 文件
from celery import Celery
#初始化celery, 指定broker
app = Celery('guoxiaonao', broker='redis://:password@127.0.0.1:6379/1')
#若redis无密码,password可省略
#app = Celery('guoxiaonao', broker='redis://:@127.0.0.1:6379/1')
# 创建任务函数
@app.task
def task_test():
print("task is running....")
#Ubuntu 终端中, tasks.py文件同级目录下 执行
celery -A tasks worker --loglevel=info
#执行后终端显示如下,证明成功!
2.2.2 创建生产者 - 推送任务
在tasks.py文件的同级目录进入 ipython3 执行 如下代码
from tasks import task_test
task_test.delay()
#执行后,worker终端中现如如下
2.2.3 存储执行结果
Celery提供存储任务执行结果的方案,需借助 redis 或 mysql 或Memcached 等
详情可见 http://docs.celeryproject.org/en/latest/reference/celery.result.html#module-celery.result
#创建 tasks_result.py
from celery import Celery
app = Celery('demo',
broker='redis://@127.0.0.1:6379/1',
backend='redis://@127.0.0.1:6379/2',
)
# 创建任务函数
@app.task
def task_test(a, b):
print("task is running")
return a + b
tasks_result.py 同级目录终端中-启动celery worker
celery -A tasks_result worker --loglevel=info
在相同目录下 打开终端创建生产者 - 同【上步】;执行成功后,可调用如下方法取得执行结果
from tasks_result import task_test
s = task_test.delay(10,100)
s.result
2.3 Django + Celery
1,创建项目+应用
#常规命令
django-admin startproject test_celery
python manage.py startapp user
2,创建celery.py
在settings.py同级目录下 创建 celery.py文件
文件内容如下:
from celery import Celery
from django.conf import settings
import os
# 为celery设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_celery.settings')
# 创建应用
app = Celery("test_celery")
# 配置应用
app.conf.update(BROKER_URL='redis://:@127.0.0.1:6379/1',)# 配置broker
app.autodiscover_tasks(settings.INSTALLED_APPS) # 设置app自动加载任务
3, 在应用模块【user目录下】创建tasks.py文件
文件内容如下:
from test_celery.celery import app
import time
@app.task
def task_test():
print("task begin....")
time.sleep(10)
print("task over....")
4, 应用视图编写;内容如下:
from django.http import HttpResponse
from .tasks import task_test
import datetime
def test_celery(request):
task_test.delay()
now = datetime.datetime.now()
html = "return at %s"%(now.strftime('%H:%M:%S'))
return HttpResponse(html)
5, 分布式路由下添加 test_celery函数对应路由,此过程略
6, 启动django python3 manage.py runserver
7, 创建 celery worker
在项目路径下,即test_celery 下 执行如下
celery -A test_celery worker -l info
8,浏览器中执行对应url
worker终端中显示
2.4 生产环境 启动
1,并发模式切换
默认并发采用 - prefork
推荐采用 - gevent 模式 - 协程模式
celery -A proj worker -P gevent -c 1000
# P POOL Pool implementation: 支持 perfork or eventlet or gevent
# C CONCURRENCY 并发数
2,后台启动命令
nohup celery -A proj worker -P gevent -c 1000 > celery.log 2>&1 &
1,nohup: 忽略所有挂断(SIGHUP)信号
2,标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。
标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。
3,&符号:代表将命令在后台执行
华为云-ubuntu18.04 部署指南
购买地址
https://www.huaweicloud.com/pricing.html?shareListId=Tv8u38og8Dv8NQaBO8#/ecs
SSH-工具-FinalShell下载
http://www.hostbuf.com/t/988.html
apt更换国内源
mv /etc/apt/sources.list /etc/apt/sourses.list.bak
cd /etc/apt/
vim sources.list
#输入如下内容后保存退出
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
最后执行 apt-get update 更新最新源
系统组件安装
nginx 1.14.0
sudo apt-get install nginx
安装完毕后 执行 nginx -v
mysql-server 5.7 安装
apt-cache madison mysql-server - 查看mysql在线安装版本
sudo apt-get install mysql-server
安装完毕后 查看 cat /etc/mysql/debian.cnf
根据文件中的用户名和密码进入mysql
修改root用户密码
1)更新密码和验证方式
update mysql.user set authentication_string=password('123456'),plugin="mysql_native_password" where user='root' and Host ='localhost';
2)刷新权限
flush privileges;
redis 4.0.9 安装
1,下载安装包
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
2,解压
tar zxvf redis-4.0.9.tar.gz
3,安装
cd redis-4.0.9
make
make install
4,修改配置文件
cd redis-4.0.9
vim redis.conf
配置1 - 后台启动
daemonize yes
配置2 - 日志
logfile "/var/log/redis/redis.log"
注意:日志路径需要提前创建 终端 mkdir /var/log/redis
5,复制配置文件
mkdir /etc/redis
cp redis.conf /etc/redis/redis.conf
6,配置启动脚本
cp redis-4.0.9/utils/redis_init_script /etc/init.d/redis-server
Python环境相关
pip3安装
sudo apt-get install python3-pip
mkdir ~/.pip
vim ~/.pip/pip.conf
# 然后将下面这两行复制进去
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
国内其他pip源
清华:https://pypi.tuna.tsinghua.edu.cn/simple
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
第三方py库安装
pip3 install django==2.2.12
pip3 install django-cors-headers==3.0.2
pip3 install django-redis==4.10.0
pip3 install PyMySQL==0.9.3
pip3 install celery==4.3.0
pip3 install PyJWT==1.7.1
pip3 install uWSGI==2.0.18
pip3 install python-alipay-sdk==2.0.1
pip3 install Pillow
pip3 install gevent
pip3 install psutil
#mysqlclient安装
sudo apt-get install default-libmysqlclient-dev
pip3 install mysqlclient
前端部署
前端html和静态文件直接交由 nginx 处理
1)修改nginx启动 用户
vim /etc/nginx/nginx.conf
user root; #修改nginx启动用户
2)修改nginx 80的默认配置
vim /etc/nginx/sites-enabled/default
root /root/blog_client/templates; # 指定全局静态路径地址
location /static {
root /root/blog_client;
}
location / { # 路由设定
rewrite ^/(\w+)$ /$1.html break;
rewrite ^/(\w+)/info$ /about.html break;
rewrite ^/(\w+)/change_info$ /change_info.html break;
rewrite ^/(\w+)/topic/release$ /release.html break;
rewrite ^/(\w+)/topics$ /list.html break;
rewrite ^/(\w+)/topics/detail/(\d+)$ /detail.html break;
try_files $uri $uri/ =404;
}
注意:前端页面里的ajax 的url需要改为公网地址
后端部署
1) 可先以python3 manage.py runserver 0.0.0.0:8000 进行测试,保证前端没问题后,配置后端服务
注意:settings.py中 跨域白名单需开启,allowed_host需要开启,debug模式关闭
2)uwsgi配置添加
[uwsgi]
#http=0.0.0.0:8002
socket=127.0.0.1:8000
# 项目当前工作目录
chdir=/root/ddblog
# 项目中wsgi.py文件的目录,相对于当前工作目录
wsgi-file=ddblog/wsgi.py
# 进程个数process=1# 每个进程的线程个数
threads=2
#服务的pid记录文件
pidfile=uwsgi.pid
#服务的日志文件位置
daemonize=uwsgi.log
启动uwsgi
进入到项目settings.py所在目录执行如下命令
命令: uwsgi --ini uwsgi.ini
3)nginx配置添加
新建nginx日志目录 ddblog
mkdir -p /var/log/ddblog/
cd /etc/nginx/conf.d
touch ddblog.conf
server {
listen 8001;
server_name _;
access_log /var/log/ddblog/access.log;
error_log /var/log/ddblog/error.log;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8002;
}
location /static {
root /root/blog_static;
}
location /media {
root /root/ddblog;
}
}
修改前端ajax中的url - 如下命令慎用
sed -i "s/http:\/\/127.0.0.1:8000/http:\/\/122.9.35.178:8001/g" `grep http://127.0.0.1 -rl templates`
三、nginx
3.1 nginx配置