生产环境优雅的重启基于Nginx、Tornado的Web服务进程
Nginx是一个高效的Web服务器及代理服务器,Tornado是一个基于epoll的异步Web开发框架,通常使用Nginx做为Web服务器时,都会以FastCGI模式,而我们从开发、调试、运维的角度考虑,使用了反向代理的模式,同时Nginx可以做一些特殊业务和负载均衡的处理。
其实反向代理模式很简单,Nginx监听在80端口,做为Web服务端口,而Tornado的Web服务进程监听在808*的内部端口(可以启动多个进程),使用supervisor对Nginx、Tornado服务进程进行统一的管理。
首先看supervisor的配置:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# supervisor自己的配置及日志切割等[supervisord]logfile = /opt/logs/supervisord.loglogfile_maxbytes = 200MBlogfile_backups=10loglevel = warnpidfile = /opt/logs/supervisord.pidnodaemon = falseminfds = 1024minprocs = 200umask = 022identifier = supervisordirectory = %(here)snocleanup = truestrip_ansi = false[unix_http_server]file = /opt/logs/supervisord.sock[supervisorctl]serverurl = unix:///opt/logs/supervisord.sock[rpcinterface:supervisor]supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface# 服务进程的启动及多端口[program:MyWeb]command = /opt/bin/python %(here)s/server.py --port=808%(process_num)01dprocess_name = 808%(process_num)01dnumprocs = 4numprocs_start = 1autostart = trueautorestart = trueredirect_stderr = truestdout_logfile = /opt/logs/stdout.logstderr_logfile = /opt/logs/stdout.log# Nginx的管理配置[program:Nginx]command = /opt/sbin/nginx -c %(here)s/nginx.confprocess_name = Nginxnumprocs = 1autostart = trueautorestart = trueredirect_stderr = truestdout_logfile = /opt/logs/nginx_stdout.logstderr_logfile = /opt/logs/nginx_stdout.log |
启动脚本(可以放到start.sh中):
|
1
|
/opt/bin/supervisord /opt/conf/supervisor.conf |
重启脚本(可以放到restart.sh中)
|
1
2
3
4
5
6
7
8
|
#逐个启动MyWeb每个端口进程,不中断服务for i in "8081 8082 8083 8084":do /opt/bin/supervisorctl /opt/conf/supervisor.conf restart MyWeb:$i; done#重新加载nginx的配置/opt/sbin/nginx /opt/conf/nginx.conf -s reload; |
Nginx的部分配置(启动4个服务进程,监听在80端口,并反向代理负载到Tornado的808*端口上):
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
worker_processes 4;daemon off; #nginx不能以daemon模式启动user nobody;http { upstream myweb { server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; server 127.0.0.1:8084; } server { listen 80; server_name localhost; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Scheme $scheme; proxy_read_timeout 300s; proxy_pass http://myweb; } }} |
现在Nginx已经反向代理到Tornado的服务进程监听的端口了,那么MyWeb的服务进程如何构建、并如何优雅的重启呢,略过其他代码,介绍一下主进程采用信号停止服务,并重新启动的方法。主进程的启动参数会指定此进程监听的端口,这样supervisor检测到服务进程结束后,会自动启动对应的服务进程。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import signalimport tornado.ioloopimport tornado.httpserverhttp_server = Nonedef sig_handler(sig, frame): """信号处理函数 """ tornado.ioloop.IOLoop.instance().add_callback(shutdown)def shutdown(): """进程关闭处理 """ # 停止接受Client连接 global http_server http_server.stop() io_loop = tornado.ioloop.IOLoop.instance() deadline = time.time() + 10 #设置最长强制结束时间 def stop_loop(): now = time.time() if now < deadline: io_loop.add_timeout(now + 1, stop_loop) else: io_loop.stop() stop_loop()if __name__ == '__main__': # 等待supervisor发送进程结束信号 signal.signal(signal.SIGTERM, sig_handler) signal.signal(signal.SIGINT, sig_handler) app = Application() http_server = tornado.httpserver.HTTPServer(app, xheaders=True) http_server.listen(tornado.options.options.port) tornado.ioloop.IOLoop.instance().start() |
生产环境优雅的重启基于Nginx、Tornado的Web服务进程的更多相关文章
- Graylog2进阶 打造基于Nginx日志的Web入侵检测分析系统
对于大多数互联网公司,基于日志分析的WEB入侵检测分析是不可或缺的. 那么今天我就给大家讲一讲如何用graylog的extractor来实现这一功能. 首先要找一些能够识别的带有攻击行为的关键字作为匹 ...
- CentOS环境下使用GIT基于Nginx的私服搭建全过程
阅读本文前你必须预先装好CentOS并且已经安装和配置好Nginx了. 安装GIT私服套件 安装centos6.5-centos7.0 安装nginx yum install -y?git gitwe ...
- centos7 使用nginx + tornado + supervisor搭建服务
如何在Linux下部署一个简单的基于Nginx+Tornado+Supervisor的Python web服务. Tornado:官方介绍,是使用Python编写出来的一个极轻量级.高可伸缩性和非阻塞 ...
- 生产环境跑PHP动态程序
Nginx + PHP5(FastCGI)生产环境跑PHP动态程序可超过“700次请求/秒” 我生产环境下的两台Nginx + PHP5(FastCGI)服务器,跑多个一般复杂的纯PHP动态程序, ...
- 2020最新nginx+gunicorn+supervisor部署基于flask开发的项目的生产环境的详细攻略
本攻略基于ubuntu1804的版本,服务器用的华为云的服务器,python3(python2已经在2020彻底停止维护了,所以转到python3是必须的)欢迎加我的QQ6398903,或QQ群讨论相 ...
- ubuntu Django + Uwsgi + Nginx 的生产环境部署
一.概述 使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇 ...
- Windows 环境下基于 nginx 的本地 PyPI 源
Windows 环境下基于 nginx 的本地 PyPI 源的搭建: 1.登录 nginx 官网,下载安装包
- 生产环境使用Nginx+uwsgi部署Django
在本地运行django应用相对来说还是挺方便的,使用自带的runserver启动即可.如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等 在网上找到了不错的部署的教 ...
- Django + Uwsgi + Nginx 的生产环境部署
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...
随机推荐
- 22.doublewrite/ChangeBuffer/AHI/FNP
一. Double Write1 Double Write介绍 • Double Write的目的是为了保证数据写入的可靠性, 避免partial write 的情况 ◦ partial write( ...
- url 组成部分
NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以 ...
- ubuntu18.04中安装和卸载cuDNN
udnn安装注意点: cudnn的安装其实很简单,关键点是一定要安装cuda对应的cudnn包,本机中安装的cuda7.5所以对应的cudnn为v5.1这很重要,我就是安装错了版本,导致后面caffe ...
- NoClassDefFoundError与ClassNOtFoundException的区别
NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该 ...
- Java基础_0310:引用传递
引用传递 引用传递是Java之中最让初学者费解的概念,而在实际的开发之中,引用传递又有着非常重要的作用: 引用传递的核心在于同一块堆内存空间被不同的栈内存所指向: 范例:第一道引用传递范例 class ...
- Python 中的比较:is 与 ==
转载: https://www.cnblogs.com/kiko0o0/p/8135184.html 在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? ...
- 20165234 预备作业2 学习基础和C语言基础调查
学习基础和C语言基础调查 一.技能学习经验及体会 你有什么技能比大多人(超过90%以上)更好? 看到这个问题,我仔细想了想,好像的确没有什么特别出众的技能,但是我想到了许多我个人的爱好. 我从小喜欢五 ...
- openstack Q版部署-----nova服务配置-计算节点(6)
一.服务安装(计算节点) 安装软件: yum install openstack-nova-compute -y 编辑/etc/nova/nova.conf文件并设置如下内容: [DEFAULT] e ...
- Linux 查看系统硬件信息[转]
原文:http://www.cnblogs.com/ggjucheng/archive/2013/01/14/2859613.html linux查看系统的硬件信息,并不像windows那么直观,这里 ...
- 【VMware vSphere】vCenter添加主机失败:无法访问指定主机
背景 前一段时间,给一台服务器安装ESXi系统,安装成功之后,通过vCenter在上面安装了一台VDP系统.结果前几天发现服务器掉线,重新连接时出现问题.问题描述如下: 其中错误堆栈具体内容为:在 v ...