用tornado ,Supervisord ,nginx架网站

2023-10-27

最近使用 Tornado 重写了博客,于是查看了很多关于部署基于 Tornado 开发的网站的资料,比较成熟的方案就是使用 Nginx 来做反向代理,使用 Supervisord 来作为进程管理工具。至于什么叫反向代理,为什么 Tornado 需要使用 Supervisord 来进行进程管理,可以自己 Google 一下。现在主要介绍一下配置和其中遇到的一些问题。

Nginx 的配置文件可以参考 Tornado 的文档最后面的例子,基本上就那样了,需要说明的是,Tornado 使用 Nginx 来处理静态文件,所以在 nginx.conf 中有这样一段:

location ^~ /static/ {
    root /home/blog/app; # static 文件夹所在的目录
    if ($query_string) {
        expires max;
    }
}

和后面 Supervisord 配置有关的主要还是负载均衡的这段配置:

upstream http {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
}

这个博客我开了两个 Tornado 进程,端口号分别是8000和8001,现在开始来看 supervisord.conf的配置,其它配置可以自行 Google,这里主要讲和这两个端口有关的故事,话说需要开两个 Tornado 进程,需要使用 Supervisord 来进行管理,于是和这个有关的配置如下:

[program:blog-8000]
command=python /home/blog/app/app.py --port=8000
autostart=true                ; supervisord守护程序启动时自动启动tornado
autorestart=true              ; supervisord守护程序重启时自动重启tornado
redirect_stderr=true          ; 将stderr重定向到stdout
stdout_logfile = /home/blog/blog-8000.log

[program:blog-8001]
command=python /home/blog/app/app.py --port=8001
autostart=true                ; supervisord守护程序启动时自动启动tornado
autorestart=true              ; supervisord守护程序重启时自动重启tornado
redirect_stderr=true          ; 将stderr重定向到stdout
stdout_logfile = /home/blog/blog-8001.log

使用 Tornado 都知道,在 Tornado 中 main 函数都是这样的写法:

http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(port)
tornado.ioloop.IOLoop.instance().start()

[以下方法太丑陋,请看下面更新]其中必须指定 port ,这样怎么同一个文件指定两个端口呢?当然就像上面的 supervisord.conf 的配置那样,使用 --port=xxxx 来指定端口了,于是app.py 中可以写:

if __name__ == "__main__":
    import sys
    port = int(sys.argv[1].split('=')[1])
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(port)
    tornado.ioloop.IOLoop.instance().start()

这样就解决了。现在就可以通过 Supervisord 来启动 Tornado 进程了,即使 Tornado 进程不小心退出,Supervisord 也可以让它再次运行。不过 Supervisord 自己也完蛋了呢?比如服务器重启了,怎么办?当然是让它开机自启动了,Linux 中的开机自启动有很多方法,这里介绍一个比较传统的方法,就是把 Supervisord 加入 /etc/init.d 中, 把这个脚本保存为 supervisord ,然后加入到 /etc/init.d 文件夹中,再以 root 权限执行如下命令:

chmod +x /etc/init.d/supervisord
update-rc.d supervisord defaults

这样即使重启服务器后,Supervisord 也会自动运行,当然它也会运行它管理的进程,最后在安装 Nginx 时,如果自己不需要加入一些第三方模块,建议直接使用官方源进行安装,这样升级等非常方便,而且也是开机自启动,这样一下来,即使重启服务器,什么都不用做,网站也会原地满血复活。

最后注意:启动脚本 supervisord 中的 PIDFILE=/tmp/$NAME.pid 这个设置一定要和supervisord.conf 中的配置相同。(顺便吐槽一下这个程序的名字,太长了,不过写完这篇文章,我居然就背着了)

一些参考资料

  1. 用Supervisord管理Python进程
  2. Tornado + Supervisor 在生产环境下的部署方法

更新

2012.06.27:在启动指定端口时,可以使用 Tornado 自带的命令行工具,如下:

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

这样就默认为8888端口,这样__main__就可以如下:

import tornado.options
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

启动时就可以指定端口了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用tornado ,Supervisord ,nginx架网站 的相关文章

  • Nginx反向代理(proxy_pass)不传递子文件夹

    我想在子文件夹配置中运行应用程序 Mattermost 例如 https www example com mattermost https www example com mattermost location mattermost gzi
  • 通过PHP从网站上传文件到Amazon EC2服务器

    我有一个网站 bedatify com 我想创建一个页面 人们可以在其中将图像上传到我的亚马逊 EC2 服务器 我检查了类似的问题 例如无法在 Amazon EC2 上上传文件 php https stackoverflow com que
  • MVVM 中的事件而不是命令?

    在MVVM的各种教程中经常会指出 MVVM的目标不是消除代码隐藏 并且代码隐藏中的一些事件处理可能仍然是必要的 在什么场景下您需要在代码隐藏中编写事件而不是在视图模型中使用命令 一般来说 如果您的代码与 UI 逻辑相关 请将其保留在视图的
  • 如何将多个域路由到多个节点应用程序?

    我习惯了典型的 Lamp Web 托管环境 您只需单击 cpanel 中的几个按钮 您的域就会被分区并映射到 htdocs 中的文件夹 我经常使用 Node js 但做同样的事情似乎并不那么简单 如果我有多个节点应用程序 并且我想将doma
  • NGinx 域名重定向

    假设我有一个名为 xyz co 的网站 我还有其他具有相同前缀的域名 例如 xyz com xyz it xyz co it 现在 nginx 与端口 80 的 nginx conf 中的 server name xyz co 配合得很好
  • 使用 FastCGI 运行 Lua 脚本

    我目前正在尝试找出使用 FastCGI 与 lighttpd 或 Nginx 一起运行 Lua 脚本的方法 我唯一能挖到的是WSAPI http keplerproject github com wsapi 开普勒计划的一部分 但我想知道是
  • PHP 扩展 mysqli 和 nd_mysqli 之间的区别[重复]

    这个问题在这里已经有答案了 Mysqli 准备好的语句 如下所示 在以下情况下会抛出以下错误 get result 叫做 stmt connection gt prepare select column from table where i
  • Nginx 中 uwsgi_pass 和 proxy_pass 的区别?

    我在 Nginx 后面运行 uWSGI 并一直在使用proxy pass让 Nginx 访问 uWSGI 切换到有什么好处吗uwsgi pass 如果是这样 那是什么 uwsgi pass使用一个uwsgi协议 proxy pass使用普通
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • nginx docker 容器:502 错误网关响应

    我有一个服务监听 8080 端口 这不是一个容器 然后 我使用官方镜像创建了一个 nginx 容器 docker run name nginx d v root nginx conf etc nginx conf d p 443 443 p
  • nginx 匹配位置中的特定单词

    我在匹配 nginx request body 变量中的特定单词时遇到问题 如果正文请求中有特殊单词 我想代理传递 所以我的方法是这样的 location php if request body proxy pass http test p
  • Django + uwsgi + ngnix + 调试关闭 = 服务器错误(500)

    我正在尝试设置一个由 Django uwsgi Nginx 组成的生产服务器 我正在关注的教程位于此处http www panta info blog 3 how to install and configure nginx uwsgi a
  • nginx server_name 在流块内可能吗?

    目前设置如下 stream server listen 9987 udp server name subdomain EXAMPLE com this line is resulting in an error proxy pass loc
  • 为什么 opcache 没有刷新?

    我用guzzlehttp guzzle封装在拉拉维尔 8 升级到后PHP 8 I get Symfony Component ErrorHandler Error FatalError Invalid opcode 117 2 0 in f
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • Nginx 是否也缓冲来自客户端的 http 请求?

    我知道 Nginx 可以缓冲来自上游服务器的响应 我的问题是 Nginx 是否也缓冲来自客户端的 http 请求 我的意思是 如果 Nginx 从客户端收到 http 请求 它是否立即与上游服务器建立连接 或者它会在收到整个http请求后创
  • Laravel Vue js spa 应用程序

    1 我想知道为什么人们使用两台服务器用 laravel 制作 vuejs SPA 我想我们可以用另一种方式 制定这样的路线 Route get any function return view index gt where any 并让 v
  • IIS 如何识别请求的是哪个站点?

    如果我在一台服务器上托管多个站点 并且 dns 服务器将不同的域名解析到同一地址 这是服务器的名称 那么 IIS 如何知道最终请求的是哪个站点 因此 客户端输入我的 1 站点地址 gt myrandomsite mydomain com 然
  • 连接被拒绝:当uwsgi和nginx在不同容器中时

    我正在尝试设置两个 docker 容器 是的 无需 docker compose 分开 一个带有 nginx 另一个带有带有基本 Flask 应用程序的 uwsgi 我在 docker 内的同一网络中运行容器我的 nginx 配置已添加 链
  • Nginx docker容器代理传递到另一个端口

    我想在 docker 容器中运行 Nginx 它监听端口 80 并且当 url 以 word 开头时 我希望它 proxy pass 到端口 8080api 我有一些网络应用程序侦听端口 8080 这在没有 docker 的情况下对我来说一

随机推荐

  • 顺序表,你真的知道吗[SQL]

    好看的目录 前言 一 顺序表是什么 概念及结构 二 顺序表的实现 顺序表的缺点 几道练手题 总结 前言 线性表是n个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使用的数据结构 常见的线性表 顺序表 链表 栈 队列 字符串 线性
  • 实现弧形切角两种方式

    1 css 的 radial gradient
  • springboot服务端接口外网远程调试,并实现HTTP服务监听 - 内网穿透

    文章目录 前言 1 本地环境搭建 1 1 环境参数 1 2 搭建springboot服务项目 2 内网穿透 2 1 安装配置cpolar内网穿透 2 1 1 windows系统 2 1 2 linux系统 2 2 创建隧道映射本地端口 2
  • C语言版通讯录操作系统

    通讯录操作系统 目录 通讯录操作系统 一 通讯录的简介 三 各部分代码实现 1 首先在主函数中编写项目的整体框架 2 优化菜单界面 menu函数 3 封装属性 4 创建通讯录的结构变量 在main函数中 5 函数声明 头文件中实现 6 函数
  • Effective C++学习笔记——宁以传引用替换传值

    目录 一 传值效率可能会很低 二 传值可能发生割裂问题 三 适用于传值的情况和注意事项 相关博客 C 引用知识归纳 一 传值效率可能会很低 我们假设有这样两个类 class Human public string name string s
  • ajax中包含哪些技术,AJAX是什么?都包含那些技术?

    AJAX全称为 Asynchronous JavaScript and XML 异步JavaScript和XML 是指一种创建交互式网页应用的网页开发技术 主要包含了以下几种技术 Ajax Asynchronous JavaScript X
  • Apinto 网关: Go语言实现 HTTP 转 gRPC

    gRPC 是由 Google 开发的一个高性能 通用的开源RPC框架 主要面向移动应用开发且基于 HTTP 2 协议标准而设计 同时支持大多数流行的编程语言 gRPC 基于 HTTP 2 协议传输 HTTP 2 相比 HTTP1 x有以下优
  • 麦克风阵列原理

    1 麦克风阵列 麦克风阵列 是一组位于空间不同位置的全向麦克风按一定的形状规则布置形成的阵列 是对空间传播声音信号进行空间采样的一种装置 采集到的信号包含了其空间位置信息 根据声源和麦克风阵列之间距离的远近 可将阵列分为近场模型和远场模型
  • 【平衡车】TB6612+编码器电机的使用

    一 编码器电机的使用 1 电线 电机 用于控制电机正 反转 2 编码器5V GND 使编码器工作 3 编码器A B相 连接在单片机 用于反馈电机运动状态 用于输出角度 速度数据 stm32的定时器有具备输入捕获功能 从而读取脉冲 获得速度值
  • selenium对元素进行操作(二):点击&输入

    1分钟了解一个测开小知识 selenium对元素进行操作 二 其他常规操作 鼠标单击 click 在定位的元素后 使用增加 click 即对该元素进行点击操作 例如 driver find element by Xpath id s xma
  • 启用已签名的 kubelet 服务证书

    默认情况下 kubeadm 所部署的 kubelet 服务证书是自签名 Self Signed 这意味着从 metrics server 这类外部服务发起向 kubelet 的链接时无法使用 TLS 来完成保护 要在新的 kubeadm 集
  • Window查看apache的版本

    我使用的是xampp进入shell命令界面的 1 点击shell 进入 2 直接输入命令 httpd v 就可以看到你电脑平时使用的Apache版本了
  • 在线Qt查看源码网站

    Woboq Code Browser Explore C code on the web
  • Tomcat Manager 账号密码设置

    Windows版本 下载https tomcat apache org 我选择Tomcat9 可以查看包信息 详细信息介绍 所以Windows版本下载 我这里先下载了9 0 37 所以没有下载 解压以后 启动bin startup bat
  • 3-排序算法

    冒泡排序 冒泡排序的思路是将每两个数据之间进行大小比对 将大的数据后移 反复比对移动数据 直至数组排列整齐 include
  • Vosviewer+Pajek实现知网社交网络(解决中文乱码问题)

    Vosviewer Pajek实现知网社交网络 一 软件准备 Vosviewer安装 下载地址https www vosviewer com download 安装JDKhttps www oracle com java technolog
  • Python+Selenium_UI自动化操作(3)——刷新页面

    UI自动化 刷新页面 语法 refresh class TestRefreshWeb unittest TestCase def setUp self setUp是一个初始化方法 为test案例做数据准备 当前方法的数据准备动作是 启动ch
  • MQTT通讯协议简介和测试 [MQTT.fx]

    一 介绍 1 MQTT简介 MQTT Message Queuing Telemetry Transport 消息队列遥测传输 是IBM开发的一个即时通讯协议 有可能成为物联网的重要组成部分 该协议支持所有平台 几乎可以把所有联网物品和外部
  • 使用 POI创建一个简单的 Excel 文件

    初级程序员一枚 看到公司大佬写的生成Excel文件 做下记录 同时也分享给大家参考 实现原理是用workBook 然后还有OutputStream 首先是一个ExcelDataBean 这个实体类 用来 声明 Excel的最大行数 最大列数
  • 用tornado ,Supervisord ,nginx架网站

    最近使用 Tornado 重写了博客 于是查看了很多关于部署基于 Tornado 开发的网站的资料 比较成熟的方案就是使用 Nginx 来做反向代理 使用 Supervisord 来作为进程管理工具 至于什么叫反向代理 为什么 Tornad