生产环境优雅的重启基于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.log

logfile_maxbytes = 200MB

logfile_backups=10

loglevel = warn

pidfile = /opt/logs/supervisord.pid

nodaemon = false

minfds = 1024

minprocs = 200

umask = 022

identifier = supervisor

directory = %(here)s

nocleanup = true

strip_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)01d

process_name = 808%(process_num)01d

numprocs = 4

numprocs_start = 1

autostart = true

autorestart = true

redirect_stderr = true

stdout_logfile = /opt/logs/stdout.log

stderr_logfile = /opt/logs/stdout.log

# Nginx的管理配置

[program:Nginx]

command = /opt/sbin/nginx -c %(here)s/nginx.conf

process_name = Nginx

numprocs = 1

autostart = true

autorestart = true

redirect_stderr = true

stdout_logfile = /opt/logs/nginx_stdout.log

stderr_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 signal

import tornado.ioloop

import tornado.httpserver

http_server = None

def 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()

原文地址:https://www.cnblogs.com/sunsky303/p/9579926.html

时间: 2024-10-18 19:41:07

生产环境优雅的重启基于Nginx、Tornado的Web服务进程的相关文章

linux在非root权限无外网(只有内网的生产环境)情况下安装nginx+mysql+php

虽然说是非root权限,但是编译php所需要的依赖包还是需要root权限的. 安装之前先保证linux有gcc和g++,因为很多东西都需要这两个库,如果没有,运行以下命令 yum install -y gcc gcc-c++ 一般linux里面都会有,如果已经存在,它会报已经存在无法安装 一.安装nginx 1. 安装nginx前,我们需要安装3个依赖包zlib.pcre.openssl(此需要root权限) yum install -y zlib pcre openssl 2. 如果上面没有无

Graylog2进阶 打造基于Nginx日志的Web入侵检测分析系统

对于大多数互联网公司,基于日志分析的WEB入侵检测分析是不可或缺的. 那么今天我就给大家讲一讲如何用graylog的extractor来实现这一功能. 首先要找一些能够识别的带有攻击行为的关键字作为匹配的规则. 由于我不是专门搞安全的,所以在网上找了一些软waf的规则脚本. 剩下来的工作就可以交给Graylog的extractor实现了. 这次介绍一下extractor的Copy input用法. (1)waf规则脚本如下: \.\./ select.+(from|limit) (?:(unio

生产环境跑PHP动态程序

Nginx + PHP5(FastCGI)生产环境跑PHP动态程序可超过“700次请求/秒” 我生产环境下的两台Nginx + PHP5(FastCGI)服务器,跑多个一般复杂的纯PHP动态程序,从Nginx的日志可以统计出,单台Nginx + PHP5(FastCGI)服务器跑PHP动态程序的处理能力已经超过“700次请求/秒”,相当于每天可以承受6000万(700*60*60*24=60480000)的访问量: 服务器①:DELL PowerEdge 1950(两颗 Intel(R) Xeo

Django + Uwsgi + Nginx 的生产环境部署

使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: 1.确保有一个能够用runserver正常启动的django项目 2.项目已上传到linux 3.linux上已部署好python环境,且已安装好项目所需的模块 安装uwsgi uwsgi是python的一个模块,安装u

Flask+Gunicorn+Gevent+Supervisor+Nginx生产环境部署

老毛病了,在用某个新框架或新架构之前,总得花时间谷歌和自己折腾一番,才能知道这个框架和架构的优缺点,才会发现自己最喜欢.用的最顺手的的一种.近期在学习python,这里记录一下自己用的一套python web开发的部署环境. 简介 之所以选择Flask,而没选择用的最多的django,是因为现在这个小项目是一个简单的web工具,提供上传文件.数据处理.并下载的功能.简单小巧,没必要折腾Django.而Flask正好是一个Python实现的Web开发微框架,它基于Werkzeug 和 Jinja2

生产环境使用Nginx+uwsgi部署Django

在本地运行django应用相对来说还是挺方便的,使用自带的runserver启动即可.如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等 在网上找到了不错的部署的教程,讲解的还是很详细的,我就不重新再整理了. 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上) – Django中国社区五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(下) – Django中国社区 但是作为记录,我还是要记录下部署中遇

Tomcat学习总结(8)——Tomcat+Nginx集群解决均衡负载及生产环境热部署

近日,为解决生产环境热部署问题,决定在服务器中增加一个tomcat组成集群,利用集群解决热部署问题. 这样既能解决高并发瓶颈问题,又能解决热部署(不影响用户使用的情况下平滑更新生产服务器)问题. 因为项目是前后端分离的,所以本以为成本很低,没想到遇到了一系列的坑,解决了2天才搞定,发现了很多不是集群而是项目本身的问题. 我是同一个服务器下配置tomcat和nginx等,本文主要面向有一定基础的读者,基本配置就不在本文累述了(基础问题可以留言或者发邮件). 0x0_1 服务器环境 服务器: Cen

Django + Uwsgi + Nginx 实现生产环境部署

一.如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 二.uwsgi介绍 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / uwsgi / uWSGI 这三个概念的区分. WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask

Django 生产环境部署-记录 nginx+uwsgi+Django

这几天一直研究django生产环境的部署,看了很多文章,都写的很好,有些时候只是环境不太一样,配置过程中出现了很多的问题,例如: uwsgi  ---module   一直运行不起来,,加--file参数才可以... ----亲测可以运行----- 1.安装DJANGO,创建工程项目,确保python manage.py runserver 0.0.0.0:8080 能够正常启动 2.安装uwsgi , 在你的机器上写一个test.py # test.pydef application(env,