supervisor+Tornado+nginx配置
目的:实现反向代理+tornado高性能web的服务器
下面是所有应用下载之后默认的配置文件路径:
supervisor配置文件:
1.配置文件:/etc/supervisord/supervisord.conf
2.unix_http_server file: /tmp/supervisor.sock
3.supervisord logfile:/tmp/supervisord.log
4.supervisord pidfile :/tmp/supervisord.pid
nginx配置文件路径:/etc/nginx/nginx.conf
实施步骤
Nginx简介以及配置:
- 通过Nginx实现反向代理以及负载均衡
- 常用命令参数:
nginx -s +参数 reload重新启动
命令 | 作用 |
---|---|
-c | 制定配置文件 |
-t | 不运行仅仅只是测试配置文件 |
-v | 显示版本 |
WINCH | 升级可执行程序 |
HUP | 重新加载配置 |
- 常用命令:
+. 启动:nginx (也可以指定启动文件 nginx -s 配置文件路径)
+. nginx从容停止命令,等所有请求结束后关闭服务:kill -QUIT nginx主进程号
+. nginx 快速停止命令,立刻关闭nginx进程:kill -TERM nginx主进程号
可以直接kill -信号类型(HUP|TERM|QUIT) cat /usr/local/nginx/nginx.pid
- 负载均衡以及反向代理配置:
Nginx可使用的负载均衡策略有:轮询(默认)、权重、ip_hash、url_hash(第三方)、fair(第三方)
http{
#进行负载均衡配置
upstream 自定义名{
server supervisor控制的域名;
}
#进行反向代理
server {
listen 监听端口;
location 正则表达式{
proxy_pass http://自定义名
}
}
}
nginx配置文件常用配置:
- worker_prcesses auth; 制定工作衍生进程数
- events{connections 数量;} 允许连接数量
- http{iclude }
Tornado简介以及配置:
tornado是一个异步的框架,但并不基于wsgi,并且通常每一个进程只运行一个线程
在通常情况下tornado线程是不安全的,只有一种方法能够使得tornado的线程安全 IOLoop.add_callback,也可以使用IOLoop.run_in_executor在另一个线程上异步运行阻塞函数,但是注意,传递给run_in_executor的函数应该避免引用任何Tornado对象。run_in_executor是与阻塞代码交互的推荐方法。
-
tornado下载:
pip3 install tornado -
tornado基本设置:
导入模块:import tornado.httpclient import tornado.httpserver#底层处理 import tornado.web import tornado.options#配置全局配置 import tornado.ioloop#核心io循环模块,封装linux的epoll和BSD的kqueue, tornado高性能处理的核心。 from tornado.options import define,options #定义变量,定义port默认端口 tornado.options.define('port',default=8000,type=int,help="this is the port >for application") #定义处理类型,RequestHandler:封装对请求处理的所有信息和处理方法 class IndexHandler(tornado.web.RequestHandler): #添加一个处理get请求方式的方法,或者post方法 def get(self,api=''): #向响应中,添加数据,可添加类型bytes,int,string if api == '': self.write('你好') elif api== '首页': self.write('欢迎进入首页') if __name__ == '__main__': #创建一个应用对象,.*表示前端发送的所有url参数都会传递给定义的class应用中函数参数 app = tornado.web.Application([(r'/',IndexHandler), (r'/.*'),IndexHandler]) #绑定一个监听端口 #启动web程序,开始监听端口的连接 tornado.httpserver.HTTPServer(app) httpserver.listen(port) #current()返回当前线程的IOLoop实例对象 #start()启动IOLoop实力对象的IO循环,开启监听 tornado.ioloop.IOLoop.current().start()
常用方法和参数
1.利用tornado.options模块进行全局参数的定义
define():用来定义options选项变量的方法
参数
name:选项变量名,须保证全局唯一性
default:选项变量的默认值,如不传默认为None
type:选项变量的类型。可以是str、float、int、
datetime、timedelta中的某个。
multiple:选项变量的值是否可以为多个,默认值为False
multiple为True,那么选项变量是一个list列表值与值之间用逗号分隔。
2.httpserver实现多进程操作
tornado.httpserver.HTTPServer(app)
httpserver.bind(port)
httpserver.start(0/None/<0/num)
3.配置文件
#即在当前py文件目录创建config文件,并在py代码中加入以下代码,
tornado.options.parse_config_file("./config")
4.application配置
-
程序调试之debug配置
#自动重启+取消缓存模板+取消缓存静态文件+提供追踪信息 tornado.web.Application([(..)], debug=True) #开发之初可以设置debug=True方便调试,开发完毕改为False
-
路由信息初始化参配置
tonado.web.Application([(r””, Handler, {k:v})])' def initialize(self, k)
-
路由名称设置及反解析
#名称设置 tornado.web.Application([ url(r””, handler, {k,v}, name=“”) ]) #反解析操作 reverse_url(name) ``
- 参数传递
#get方式传递参数 get_query_arguments(name,default=_ARG_DEFAULT,strip=True) get_query_argument(name ,strip=True) #psot方式传递 get_body_arguments(name, default=_ARG_DEFAULT,strip=True) get_body_argument(name ,strip=True)
- header
1. .add_header() .set_header() .set_default_headers()
设置响应HTTP头, 前两者的不同点在于多次设置同一个项时, .add_header()会叠加参数, 而.set_header()则以最后一次为准.
2. .set_default_headers()比较特殊, 是一个空方法, 可根据需要重写, 作用是在每次请求初始化RequestHandler时设置默认headers.
3. .clear_header()清除指定的headers,而.clear()清除.set_default_headers()以外所有的headers设置.
- 参数传递
supervisor简介以及初始配置:
- 作用为管理进程,通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动.当子进程出现异常的时候会自动重新启动,以及获得子进程异常中断的信息.
注意:supervisor只适用2.4以上版本,不支持python3
- 安装supervisor:
- ‘python setup.py install supervisor’ 或者’pip install supervisor’
supervisor基本命令
命令 | 作用 |
---|---|
supervisord -c 配置文件路径 | 通过制定配置文件启动supervisor |
supervisorctl命令
- supervisorctl相当于supervisor客户端,对被管理进程进行一系列操作。
常用命令 | 作用 |
---|---|
update 进程名 | 当配置文件修改的时候需要更新 |
restart 进程名 | 重新启动某子进程 |
status 进程名 | 查看状态 |
tail 进程名 | 进程状态等详细信息 |
stop 进程名 | 停止某个进程的运行 |
shutdown | 停止启动supervisor |
reload | 重新加载 |
supervisor配置
-
配置设置:
+. 安装下载完成之后需要设置默认文件,以及配置文件这里配置文件注释以;表示,需要与内容间隔一个空格间隙
- 配置supervisor配置文件
echo_supervisord_conf > /etc/supervisord/supervisord.conf
supervisor 默认会在/etc/supervisor进行搜索默认配置文件
2.修改配置文件:
信息|参数|作用|是否需要开启|备注 :-|:-:|:-:|:-:|:- [unix_http_server]|file:指向UNIX domain socket|设置Http服务器监听的 . UNIX domain socket|是|需要修改指定file默认文件会被删除 touch /var/run/supervisor.sock , chomd 777 /var/run/supervisor.sock |'' | chmod:启动时改变supervisor.sock的权限||| |[supervisord]|logfile指定进程log文件路径|与supervisord有关的全局配置|是| |[inet_http_server]|port=ip:port |通过port管理子进程|是| |[supervisorctl]|file需要于unix_http_server中file路径相同|开启servisorctl|是
3.在配置文件中添加程序,或添加一个程序路径
vim /etc/supervisord/supervisord.conf [program:项目名] command=python3 app.py -port=8001 ; 运行命令,与手动命令行启动的命令是一样的,注意如果有home,这里home不可以用~替代 autostart=true ; 在supervisor启动时自动启动 startsecs=5 ;启动5 秒后没有异常退出,就当作已经正常启动了 autorestart=true ; 程序异常退出后自动重启 startretries=3 ; 启动失败自动重试次数,默认是 3 user=root ; 用哪个系统用户启动 redirect_stderr=true ; 把 stderr 重定向到 stdout,默认 false stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数 #stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件) stdout_logfile = /tmp/tornado_app_8001.log loglevel=info ; 日志输出等级 ;numprocs=1 ;启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置默认为1非必须设置 ;directory=/tmp ; 进程运行前,会前切换到这个目录
--------------------------------------------------
若要重新定义一份文件
1. vim /etc/supervisord/supervisord.conf文件尾添加:
[include]
files=/etc/supervisord/conf.d ;需要添加项目文件路径
2. vim /etc/supervisord/conf.d
[group:自定义]
programs=自定义,自定义 ;分别定义几个进程的配置
[program:自定义进程名]
与上述配置文件相同定义.....
- 当配置完成之后启动supervisor,当访问网站时候supervisorctl子进程有状态输出即成功
- supervisor -c 配置文件路径
- supervisorctl 进入之后可以查看当前子进程情况
supervisor详细配置以及参数在上一篇文章中