Nginx错误日志出现大量502--no live upsteams错误的原因及

如果nginx出现502 Bad GateWay错误,我们优先想到的是可能程序出问题,或者响应慢。不过有时也是Nginx本身有问题,比如nginx重启之后一段时间内的访问都是502错误,error log中大量的no live upstream日志。

原来是我们对check upstream module这个模块的误用。先来看下我的配置。

主配置文件,nignx.conf:

worker_processes 4;
pid logs/nginx.pid;
error_log /tmp/logs/error.log;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type  application/octet-stream;
    # 省略部分配置

    include upstreamA.conf;

    server {
        listen 8889;
        server_name localhost;
        access_log  /tmp/logs/m-access.log  main;
        error_log /tmp/logs/m-error.log;

        location ~ / {
            proxy_pass http://tornado_servers;
        }

    }
}

然后是upstreamA.conf:

upstream tornado_servers {
    server 127.0.0.1:29100 weight=100;
    server 127.0.0.1:29101 weight=100;
    check interval=30000 rise=3 fall=3 timeout=30000 type=tcp;
}

然后是upstreamB.conf:

upstream tornado_servers {
    server 127.0.0.1:29110 weight=100;
    server 127.0.0.1:29111 weight=100;
    check interval=30000 rise=3 fall=3 timeout=30000 type=tcp;
}

有兴趣的可以用我的这个配置测试下,nginx需要有nginx_upstream_check_module插件。

我们上线应用的流程是这样,假设现在线上用的是upstreamA,那么我们发布Python程序的时候,就把端口监听在upstreamB设置的端口上,发布成功之后,把Nginx配置中的upstreamA改为upstreamB,然后reload,从而达到新程序上线的目的。

而这时出现的问题就是,reload之后,立马出现 no live upstream的error,并且所有访问都是502。

原因之前已经说过了,是对check模块的误用导致的,来看下check模块的使用说明就清楚了.

Syntax: check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]
Default: 如果没有配置参数,默认值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp
Context: upstream

各项说明:

该指令可以打开后端服务器的健康检查功能。
指令后面的参数意义是:
interval:向后端发送的健康检查包的间隔。
fall(fall_count): 如果连续失败次数达到fall_count,服务器就被认为是down。
rise(rise_count): 如果连续成功次数达到rise_count,服务器就被认为是up。
timeout: 后端健康请求的超时时间。

【default_down】: 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。

type:健康检查包的类型,现在支持以下多种类型
tcp:简单的tcp连接,如果连接成功,就说明后端正常。
ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包。
http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活。
mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活。
ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活。
port: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一样。该选项出现于Tengine-1.4.0。

如果没有仔细考虑这个问题,直接使用默认的配置,然后通过切换upstream文件来上线新系统,就会出这种错误问题了。

时间: 2024-10-13 09:38:32

Nginx错误日志出现大量502--no live upsteams错误的原因及的相关文章

SQL Server 错误日志收缩(ERRORLOG)

一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文件中.默认保留有7个 SQL Server 错误日志文件,分别是:ErrorLog,Errorlog.1-Errorlog.6 ,当前的错误日志(文件ErrorLog)没有扩展名.每当启动 SQL Server 实例时,将创建新的错误日志ErrorLog,并将之前的ErrorLog更名为ErrorL

SQL Server数据库状态监控 - 错误日志

无论是操作系统 (Unix 或者Windows),还是应用程序 (Web 服务,数据库系统等等) ,通常都有自身的日志机制,以便故障时追溯现场及原因.Windows Event Log和 SQL Server Error Log就是这样的日志, PS: SQL Server 中的错误日志 (Error Log) 类似于 Oracle中的alert 文件. 一. 错误日志简介 1. Windows事件日志与SQL Server 错误日志 Windows事件日志中,应用程序里的SQL Server和

2. SQL Server数据库状态监控 - 错误日志

原文:2. SQL Server数据库状态监控 - 错误日志 无论是操作系统 (Unix 或者Windows),还是应用程序 (Web 服务,数据库系统等等) ,通常都有自身的日志机制,以便故障时追溯现场及原因.Windows Event Log和 SQL Server Error Log就是这样的日志, PS: SQL Server 中的错误日志 (Error Log) 类似于 Oracle中的alert 文件. 一. 错误日志简介 1. Windows事件日志与SQL Server 错误日志

设置SQLSERVER的错误日志数量与查找SQLSERVER安装错误日志

查找SQLSERVER安装错误的日志 如果我们能够把把日志贴到论坛上那么问题应该很快就能解决,下面说一下SQLSERVER安装日志存放的地方 我的SQLSERVER安装在C盘: C:Program FilesMicrosoft SQL Server90Setup BootstrapLOGFiles 大家的路径可能跟我的不一样 这个文件夹下包含了SQLSERVER安装过程中各个模块组件的详细安装日志情况 如果在安装的某个过程中卡住了,那么你可以点击某一个项,SQL就会弹出相应的日志文件,实际上那个

PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子_php技巧

在PHP程序运行过程中如果有错误发生,在浏览器上是否显示错误信息,以及显示错误信息的级别是我们在程序开发.调试.运营过程中需要控制的.下面就通过设置php.ini,控制PHP错误信息(errors)的屏蔽和显示作如下说明:1.错误信息是否显示     复制代码 代码如下: 显示错误 display_errors = On     屏蔽错误 display_errors = Off (缺省值) 2.显示错误信息的级别     复制代码 代码如下: error_reporting = E_ALL (

PHP配置把错误日志以邮件方式发送方法(Windows系统)_php实例

当系统发生了很严重的问题,需要立刻发送给管理员.可以通过 error_log() 将错误以邮件形式发送到邮箱. 在 php.ini 中设置: 复制代码 代码如下: sendmail_from = 472323087@qq.com 然后设置: 复制代码 代码如下: sendmail_path = "G:\sendmail\sendmail.exe -t" 其中:G:\sendmail\sendmail.exe 是邮件客户端的地址.  代码: 复制代码 代码如下: <?php //关

Nginx错误日志与优化专题

一.Nginx配置和内核优化 实现突破十万并发 二.一次Nignx的502页面的错误记录 (1)错误页面显示   错误日志: 2017/07/17 17:32:57 [error] 29071#0: *96 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 101.226.125.118, server: live.baidu.com, reques

ELK Stack权威指南(第2版)》一3.2 Nginx错误日志

3.2 Nginx错误日志 Nginx错误日志是运维人员最常见但又极其容易忽略的日志类型之一.本节介绍对Nginx错误日志的处理方式,并推荐读者在性能优化中对此多加关注.Nginx错误日志既没有统一明确的分隔符,也没有特别方便的正则模式,但通过Logstash不同插件的组合,还是可以轻松进行数据处理的. 值得注意的是,Nginx错误日志中有一类数据是接收过大请求体时的报错,默认信息会把请求体的具体字节数记录下来.每次请求的字节数基本都是在变化的,这意味着常用的topN等聚合函数对该字段没有明显效

nginx error_log 错误日志配置说明

nginx error_log 错误日志配置说明: nginx的error_log错误日志类型有六种: [ debug | info | notice | warn | error | crit ] 例如:error_log logs/nginx_error.log crit; 这六种类型区别,自左至右,所记录的信息越来越少,debug记录更详细,crit记录的最少,如果不记录的话可以这么写:error_log /dev/null;

nginx 错误日志经常记录这些东西

问题描述 nginx 错误日志经常记录这些东西 2016/05/20 11:46:13 [error] 32602#0: *792251 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 5.178.86.75, server: localhost, request: "POST http://check.best-prox