web服务部署工具使用介绍

芝兰生于深谷,不以无人而不芳;君子修身养德,不以穷困而改志。

摘要

本文主要介绍服务端部署所用到的几个工具,如nohup, gunicorn, supervisor等。

nohup使用

nuhup

1.用途:不挂断地运行命令。

2.语法:nohup Command [ Arg … ] [ & ]

  • 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

  • 如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

  • 如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

3.退出状态:该命令返回下列出口值:   

  • 126: 可以查找但不能调用 Command 参数指定的命令。   
  • 127: nohup 命令发生错误或不能查找由 Command 参数指定的命令。否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

&

1.用途:在后台运行

一般和nohup一起用

nohup command &

eg:

# 默认将输出写入nohup.out文件
nohup redis-server &
# 自定义将输出写入到log.txt
nohup redis-server > log.txt 2>&1 &

3.退出:

可以使用jobs命令列出所有后台进程。然后使用fg %进程id 来将后台程序调到前台执行。如:

[xxx@localhost server]$ jobs
[1]-  运行中               nohup redis-server >> redis.log 2>&1 &
[2]+  运行中               nohup gunicorn -c runtime/gunicorn.py "wsgi:app" &
[xxxr@localhost server]$ fg %2
nohup gunicorn -c runtime/gunicorn.py "wsgi:app"

这样,便可以通过ctrl+c来停止运行,或者ctrl+z挂起任务。若想继续启动挂起的任务,可用bg %进程id

可参考:Linux 中 fg、bg、jobs 等指令

uwsgi

简介

WSGI(Python Web Server Gateway Interface):Python Web 服务器网关接口,是 Python 语言定义的 Web 服务器和 Web 应用程序之间一种简单通用的接口。WSGI 分为两个部分,一个是“服务器”或“网关”,一个是“应用程序”或“应用框架”,在处理一个请求时,服务器为应用程序提供环境信息及一个回调函数,当应用程序完成处理请求后,通过回调函数将结果回传给服务器。

参考:https://www.cnblogs.com/TM0831/p/11643128.html

gunicorn使用

简介

Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。
和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点.

较为综合的介绍:https://zhuanlan.zhihu.com/p/102716258

配置参数

1.官方文档:https://docs.gunicorn.org/en/stable/settings.html

2.gunicorn 详解(配置案例和部分参数说明): https://www.jianshu.com/p/69e75fc3e08e

3.通过优化 Gunicorn 配置提高性能:https://juejin.im/post/6844903850713825287

部署案例

flask部署案例:https://juejin.im/entry/6844903634115756039#comment

supervisor使用

简介

Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。

1.安装:

pip install supervisor

2.Supervisor安装后会生成三个部分,分别是:

  • supervisord守护进程服务
  • supervisorctl客户端
  • echo_supervisord_conf生成初始配置文件程序

3.supervisorctl相关命令:

$ supervisorctl status # 查看程序状态
$ supervisorctl stop program_name # 关闭 program_name 程序
$ supervisorctl start program_name # 启动 program_name 程序
$ supervisorctl restart program_name # 重启 program_name 程序
$ supervisorctl reread #读取有更新(增加)的配置文件,不会启动新添加的程序,也不会重启任何程序
$ supervisorctl reload # 载入最新的配置文件,停止原有的进程并按照新的配置启动
$ supervisorctl update #重启配置文件修改过的程序,配置没有改动的进程不会收到影响而重启

Supervisor特征

1.可以准确的控制子进程:通常,在Unix进程上,比较难获得准确的进程上下文状态,Pidfiles经常不准确(?)(Pidfiles是linxu中用来进行进程守护的一种机制,简单而言就是要守护的进程PID进入在file中,定时检查),Supervisor会将要监控的进程作为子进程启动,这样Supervisor的父进程就始终知道子进程正在的上下文状态,同时可以很方便的控制该子进程(这就是为什么Supervisor要求要它管理的进程必须由它来启动,而不能管理已启动的进程)

2.Delegation机制 Delegation代表团机制,可以通过配置允许不同权限的用户对相应的监控进程进行启动与管理

3.优先级流程组 Supervisor可以为监控进程设置优先级,以不同的顺序启动进行,当然也可以直接 start all或 restart all

4.高效性 Supervisor的主进程会通过fork/exec的方式启动被监控的进程,但其实不会对子进程进行守护,当被监控进程终止时,操作系统会主动立刻的向Supervisor发出信号,Supervisord接收到信号后,会执行相应的重启逻辑,这与某些依赖于PID文件和定期轮训重启终止进程的方法不同,更为高效。

5.高拓展 Supervisor内有简单的事件通知协议,可以通过任意语言来实现一个监听器来监听事件通知,它还有XML-RPC接口用于扩展

配置参数

1.快速入门(使用 supervisor 管理进程):http://liyangliang.me/posts/2015/06/using-supervisor/

2.官方文档:http://supervisord.org/index.html

部署案例

1.Supervisord管理进程实践:https://thief.one/2018/06/01/1/

存在的缺陷

目前所知缺陷:

1.Supervisor管理的进程必须由supervisord启动,即已启动的程序是无法使用supervisord进行管理的。

2.Supervisor要求管理的程序是非后台式的程序(not daemon program),因为Supervisord会自动帮你将要管理的进程转为后台进程,如果原本就是后台进程就存在问题,比如要使用Supervisor管理nginx,nginx就需要在配置文件中添加daemon off让nginx以非后台运行形式启动。

3.Supervisor不支持windows,只支持类UNIX系统,如Centos、Ubuntu、MacOS

一个类似的监控工具:Monit

Monit可以对系统状态、进程、文件、目录和设备进行监控,适用于Linux平台,可以自动重启已挂掉的程序,比较适合监控系统的关键进程和资源,如nginx、apache、mysql和cpu占有率等。

posted @ 2020-11-12 00:18  煊奕  阅读(676)  评论(0编辑  收藏  举报