[转帖]nginx配置文件中listen后面的backlog配置

nginx,配置文件,listen,后面,backlog,配置 · 浏览次数 : 0

小编点评

**nginx监听端口的backlog参数** nginx中listen端口后面可以添加一个backlog参数来设置服务器监听的端口。backlog参数用于指定连接队列的最大长度,默认值为511。 **backlog参数的作用** backlog参数控制着连接队列中的连接数量。当连接队列满时,新的连接将被排队到backlog队列中,而不是被拒绝。当服务器有空闲连接时,也会从backlog队列中取出连接,以建立新的连接。 **backlog参数的设置** backlog参数可以在nginx配置文件中设置。默认值是511。 **示例** ```nginx listen 80; listen 80 backlog=65533; ``` 这表示,nginx会监听端口80,并允许最多65533个连接连接在该端口上。

正文

http://www.04007.cn/article/323.html

 

    在对nginx的配置时,我们会设置的它的监听端口。比如:Linsten 80;,但在一些配置文件中,会发现这句话后还可以有另外一个配置参数,如:Linsten 80 backlog=65533;这个backlog到底是什么作用呢?

    上面说的listen是配置在nginx配置文件中的listen,实际底层执行时调用的就是底层的一个listen函数,listen函数是网络编程一个基本的函数,backlog就是它的参数。和TCP协议息息相关。

 

#创建一个套接口并监听申请的连接.
#include <sys/socket.h>
int listen( int sockfd, int backlog);
sockfd:用于标识一个已捆绑未连接套接口的描述字。
backlog:等待连接队列的最大长度。 
    listen函数仅由TCP服务器比如我们的nginx调用,如上面调用listen后会使用socket函数创建一个套接口时,它被假设为一个主动套装口,也就是说,它是一个将调用connet发起连接的客户套接口。listen函数把一个未连接的套接口转换成一个被动套接口,指示内核应接受指向该套接口的连接请求。即我们直观地说启用一个80端口,来监听80请求。根据TCP状态转换图,调用listen导致套接口从CLOSED状态转换到LISTEN状态。这个函数的第二个参数backlog规定了内核应该为这个套接口排队的最大连接个数。因此这里内核会为每一个给定的监听套接口维护两个队列:

 

1、SYN_RCVD 未完成连接队列(incomplete connection queue)即握手过程中的队列,每个这样的SYN分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接口处于SYN_RCVD状态。这些套接字处于SYN_RCVD状态的长度由/proc/sys/net/ipv4/tcp_max_syn_backlog设置
2、ESTABLISHED 已完成连接队列(completed connection queue)即已成功握手的队列,每个已完成TCP三路握手过程的客户对应其中一项。这些套接口处于ESTABLISHED状态。
      当来自客户的SYN到达时,TCP在未完成连接队列中创建一个新项,然后响应以三路握手的第二个分节:服务器的SYN响应,其中稍带对客户SYN的ACK(即SYN+ACK)。这一项一直保留在未完成连接队列中,直到三路握手的第三个分节(客户对服务器SYN的ACK)到达或者该项超时为止(曾经源自Berkeley的实现为这些未完成连接的项设置的超时值为75秒)。如果三路握手正常完成,该项就从未完成连接队列移到已完成连接队列的队尾。当进程调用accept时,已完成连接队列中的队头项将返回给进程,或者如果该队列为空,那么进程将被投入睡眠,直到TCP在该队列中放入一项才唤醒它。
上面的描述即是TCP握手的几个阶段:1收到客户端的syn请求 ->2将这个请求放入syn_table中去->3服务器端回复syn-ack->4收到客户端的ack->5放入已经握手成功的队列accept queue中

而这里listen函数里的backlog影响的就是是握手成功的队列的大小(即上面的accept queue队列的大小)。当客户链接请求大于这个个数(缓冲池满),其它的未进入链接缓冲池的客户端在tcp层上tcp模块会自动重新链接,直到超时。 

    注:有说在linux内核2.2版本以前,backlog是已完成队列和未完成连接队列之和(此项不知道)

    nginx在调用底层listen函数时,传递的backlog参数即是在nginx配置文件中listen端口后面给的参数。而nginx定义的NGX_LISTEN_BACKLOG默认为511,系统中的默认值如下图:

    可以使用命令查看当前的配置值大小: cat /proc/sys/net/ipv4/tcp_max_syn_backlog ,即是上图中后面这行的配置值,这个值比nginx的默认配置值大很多,所以nginx的默认配置值会让系统未发挥最大效力,因此以有必要调整这个值。这就是我们看到的在nginx配置文件中linsten 80 后面加上的这个backlog参数,且配置的参数不能超过内核里面设定的数值(超过了也许不生效,不确定是否会出异常)。

与[转帖]nginx配置文件中listen后面的backlog配置相似的内容:

[转帖]nginx配置文件中listen后面的backlog配置

http://www.04007.cn/article/323.html publish:February 25, 2017 -Saturdayby 04007 本站原创文章,转载请注明文章出处:www.04007.cn 在对nginx的配置时,我们会设置的它的监听端口。比如:Linsten 80;

[转帖]浅析nginx的server及server_name的意义详解

https://www.cnblogs.com/goloving/p/7010713.html 一、server_name 详解 当Nginx接到请求后,会匹配其配置中的server模块。匹配方法就是靠请求携带的host和port正好对应其配置中的server_name 和listen。如果做过ip

[转帖]nginx优化 突破十万并发

一、一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。 2. worker_cpu_affinity 00000001 00000010 0000

[转帖]将nginx.conf文件的内容拆分成多个

nginx的如果有多个server模块都配置在同一个nginx.conf文件会显得比较臃肿,后续维护起来也会比较困难,所以可以将内容写入到多个配置文件中然后在nginx.conf文件中通过include命令引入。 1.nginx.conf配置文件内容 user nginx; worker_proce

[转帖]Nginx更改日志格式为json

https://www.cnblogs.com/lizexiong/p/14989934.html 这里只是简单记录一下主配置文件中的format格式,因为在配置过程中一直不生效,最后发现是因为配置尾部没有加 ; 号导致,所以这里简单做一个记录。 #/etc/nginx/nginx.confuser

[转帖]查看请求在nginx中消耗的时间

需求:查看请求在nginx中消耗的时间,不包括程序响应时间。 1.声明日志的格式,在nginx配置文件nginx.conf里的http下添加如下内容: log_format test '$remote_addr - $remote_user [$time_local] "$request" ' '$

[转帖]Nginx 禁止直接访问目录或文件的操作方法

https://www.jb51.net/article/266355.htm 前言 Nginx 默认是不允许列出整个目录的。 如需此功能,打开 nginx.conf 文件或你要启用目录浏览虚拟主机的配置文件,在 location server 或 http 段中加入 1 autoindex on;

[转帖]Nginx中的Rewrite的重定向配置与实践

https://www.cnblogs.com/tugenhua0707/p/10798762.html 阅读目录 一:理解地址重写 与 地址转发的含义。 二:理解 Rewrite指令 使用 三:理解if指令 四:理解防盗链及nginx配置 简介:Rewrite是Nginx服务器提供的一个重要的功能

[转帖]nginx的proxy_next_upstream使用中的一个坑

https://zhuanlan.zhihu.com/p/35803906 今天线上系统出了点问题,机房的电信出口突然不通了,原本以为能自动切换的nginx配置,居然没有生效,导致了业务告警,手工紧急处理了才解决了。 当时的设想是,如果这个服务的访问,出现了500或者超时的情况,会自动重试到下一个服

[转帖]nginx 白名单处理

Nginx如何配置根据cookie或header自定义字段进行跳转 一、根据cookie中的值来判断跳转 $http_cookie这个关键词是读取cookie的全部信息,那么我们是需要判断cookie中包含的某个字段的值,比如我设置openid=5,我该如何获取那么,我们可以通过$cookie_op