NGINX代理返回代码499问题分析与处理

一、背景

​ 我们通过nginx作为互联网代理服务器,通过它实现我行内部系统向互联网系统的接口访问及调用;但是在使用过程中,不时的会出现大量返回代码为499的问题(正常访问返回为200),甚至有时候部分系统在报499的错误时,会影响到某一业务的正常使用。此时,我们也会怀疑nginx代理出现了问题,于是重启或者重新加载nginx服务。但是比较奇怪的是,如果nginx整个出现了问题,那么为什么会出现某个业务异常而不是在nginx上的所有服务异常呢?于是,我们则需要对为什么nginx会返回499错误代码展开分析和研究。

二、499代码代表了什么

​ nginx返回499错误,那么我们就到nginx的源码里面看看,是否存在499返回代码的解释呢?通过在nginx的源码进行查找,发现有一段这样的代码:

#define NGX_HTTP_LAST_4XX  430
#define NGX_HTTP_OFF_5XX   (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX)

    ngx_string(ngx_http_error_494_page), /* 494, request header too large */
    ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
    ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
    ngx_string(ngx_http_error_497_page), /* 497, http to https */
    ngx_string(ngx_http_error_404_page), /* 498, canceled */
    ngx_null_string,                     /* 499, client has closed connection */

    ngx_string(ngx_http_error_500_page),
    ngx_string(ngx_http_error_501_page),
    ngx_string(ngx_http_error_502_page),
    ngx_string(ngx_http_error_503_page),
    ngx_string(ngx_http_error_504_page),
    ngx_string(ngx_http_error_505_page),
    ngx_null_string,                     /* 506 */
    ngx_string(ngx_http_error_507_page)

​ 从这里,我们则可以看到ngx_null_string对应的就是499代码,其表示了client has closed connection,即说明了是客户端已经关闭了连接。

​ 那么为什么客户端会主动去关闭连接呢?其实最简单的解释就是因为服务端处理时间过长,然后客户端无法等到服务端处理完成,然后就会去主动关闭连接,然后代理就会为我们返回499错误。

​ 在进行资料查询后,我们可以总结出一般有几种情况,可能造成499错误:

​ 1)客户端在服务端响应前确实主动关闭了连接;

​ 2)客户端在连接服务端进行业务的过程中,网络发生了中断,出现了连接超时;

3)两次提交post过快,nginx会认为是不安全的连接,主动拒绝了客户端的连接(往往是有人故意攻击,消耗服务器资源);

4)php的进程数量不够用,需要调整php的进程数量;

三、如何处理499问题

​ 在nginx的配置中有一个参数为:proxy_ignore_client_abort

​ 该参数的含义是:确定在客户端关闭连接时,是否关闭与代理服务器的连接,而不再等待响应。

​ 该值的默认值为off,此时则代表在发生交易的过程中,如果客户端无论是发生了主动关闭连接、客户端网络中断、访问服务超时、服务器未处理的情况,那么 Nginx 都会记录 499;这样则可能会存在一个问题就是可能无法真实反应客户端服务访问的真实情况。

​ 而该值改为on的时候,则表示客户端主动断掉连接之后,Nginx 会等待后端服务器处理完(或者超时),然后记录“后端的返回信息”到日志。因此,会有几种情况:

1、如果后端返回200,就记录200 ;
2、如果后端返回5XX ,那么就记录 5XX;
3、如果超时(默认60s,可以用 proxy_read_timeout 和proxy_send_timeout设置),Nginx 会主动断开连接,记录504。

这样则可以将访问异常的真实问题反应出来。

​ 因此,我们可以通过在http域、server域、location域内加入:

```
proxy_ignore_client_abort on
```

四、风险

​ 根据上面的分析,其实我们可以发现,其实发生499的问题时候的可能性会很多,而且如果出现客户端在建立连接后主动关闭了连接的情况则会是一种正常的场景。当然,虽然我们可以通过打开proxy_ignore_client_abort的参数来解决499的问题,且可以暴露出客户端到服务端的真实原因。但是打开该设置后也会存在一定风险,即当有大量瞬间断开的请求时,后端会默默地全部处理掉,比较浪费资源,且并发压力比较大时,也有可能造成服务器出现被压垮宕机的可能。

五、结论

​ 结合上述的分析,考虑到风险,我们可以得出以下结论,如果我们的机器只存在单机环境或者无冗余环境的时候,我们尽可能的不要去设置这个参数,从而避免服务器被压垮的风险;当我们有足够的环境做冗余的时候或者在前端有负载均衡对连接进行分发负载的时候,我们则可以考虑打开该参数,从而便于运维人员分析问题异常。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用Nginx作为反向代理服务器,首先需要下载Nginx的安装包。以下是下载Nginx的步骤: 1. 打开Nginx的官方网站(https://nginx.org/)。 2. 在网站的首页,点击"Download"按钮。 3. 在下载页面中,你可以选择下载最新稳定版或者其他版本的Nginx。点击对应的版本号下载。 4. 下载完成后,可以将下载的文件(通常是一个.tar.gz或.zip文件)保存到任意位置。 接下来,你需要安装Nginx。以下是安装Nginx的步骤: 1. 解压下载的文件。如果是.tar.gz文件,可以使用以下命令解压: ```bash tar -zxvf nginx-1.20.1.tar.gz ``` 这将会在当前目录下创建一个名为nginx-1.20.1的文件夹。 2. 进入解压后的文件夹: ```bash cd nginx-1.20.1 ``` 3. 在文件夹中运行配置命令: ```bash ./configure ``` 这将会根据系统环境生成编译配置。如果需要自定义配置,可以通过添加参数来进行。 4. 编译Nginx: ```bash make ``` 5. 编译完成后,安装Nginx: ```bash make install ``` Nginx将会被安装到默认的目录(通常是/usr/local/nginx)。 安装完成后,你可以在Nginx的安装目录中找到Nginx的配置文件(通常是nginx.conf)。你可以根据需要编辑该配置文件,添加反向代理的相关配置。 希望以上回答对你有帮助! ### 回答2: 要从Nginx官方网站下载反向代理代码非常简单。首先,打开Nginx官方网站(https://nginx.org/),找到下载页面。在下载页面,可以找到不同版本的Nginx。我们可以根据自己的需求选择最新版本或者稳定版本的Nginx。 一旦确定了版本,点击相应的链接进入下载页面。在下载页面上,可以找到针对不同操作系统的安装包或源代码。对于大多数用户来说,选择预编译的二进制安装包会更方便。根据自己使用的操作系统选择并下载。如果你对编译和安装有经验,也可以选择源代码进行下载。 下载完成后,解压下载的压缩包。如果你下载的是二进制安装包,解压后会得到一个包含Nginx可执行文件的文件夹。如果你下载的是源代码,解压后会得到一个包含编译和安装所需文件的文件夹。 接下来,根据需要进行配置。打开文件夹中的配置文件,可以根据自己的需求修改反向代理相关的配置选项。例如,你可以指定要代理服务器地址和端口等。 完成配置后,执行Nginx可执行文件,启动Nginx服务。启动后,Nginx将会开始监听指定端口,并将请求转发到配置的代理服务器。 以上就是通过Nginx官方网站下载反向代理代码及其简单使用的过程。希望对你有所帮助! ### 回答3: 要使用nginx作为反向代理,首先需要在服务器上安装nginx软件。安装完成后,可以通过以下步骤进行配置: 1. 打开nginx配置文件,一般位于`/etc/nginx/nginx.conf`或`/etc/nginx/conf.d/default.conf`。 2. 在`http`块内添加以下代码: ``` server { listen 80; server_name your_domain.com; location / { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` 这段代码定义了反向代理的参数,将请求转发到`backend_server`上。 3. 在上述代码中,将`your_domain.com`替换为你的域名,而`backend_server`替换为真实的后端服务器地址。可以使用IP地址或域名作为后端服务器地址。 4. 保存并关闭配置文件。 5. 检查nginx配置是否正确,可以运行`nginx -t`命令进行验证。 6. 如果验证通过,则重新加载nginx配置,可以运行`nginx -s reload`命令。 以上步骤完成后,nginx就可以通过反向代理将请求转发到指定的后端服务器上了。请确保后端服务器能够正常访问,并且端口号与配置文件中相匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值