[Nginx]Nginx凭啥子并发数可以达到3w!( 二 )


④upstream:upstream 模块实现反向代理的功能 , 将真正的请求转发到后端服务器上 , 并从后端服务器上读取响应 , 发回客户端 。
upstream 模块是一种特殊的 handler , 只不过响应内容不是真正由自己产生的 , 而是从后端服务器上读取的 。
⑤load-balancer:负载均衡模块 , 实现特定的算法 , 在众多的后端服务器中 , 选择一个服务器出来作为某个请求的转发服务器 。
常见问题剖析Nginx vs Apache
Nginx:

  • IO 多路复用 , Epoll(freebsd 上是 kqueue)
  • 高性能
  • 高并发
  • 占用系统资源少
Apache:
  • 阻塞+多进程/多线程
  • 更稳定 , Bug 少
  • 模块更丰富
参考文章:
http://www.oschina.net/translate/nginx-vs-apachehttps://www.zhihu.com/question/19571087
Nginx 最大连接数
基础背景:
  • Nginx 是多进程模型 , Worker 进程用于处理请求 。
  • 单个进程的连接数(文件描述符 fd) , 有上限(nofile):ulimit -n 。
  • Nginx 上配置单个 Worker 进程的最大连接数:worker_connections 上限为 nofile 。
  • Nginx 上配置 Worker 进程的数量:worker_processes 。
因此 , Nginx 的最大连接数:
  • Nginx 的最大连接数:Worker 进程数量 x 单个 Worker 进程的最大连接数 。
  • 上面是 Nginx 作为通用服务器时 , 最大的连接数 。
  • Nginx 作为反向代理服务器时 , 能够服务的最大连接数:(Worker 进程数量 x 单个 Worker 进程的最大连接数)/ 2 。
  • Nginx 反向代理时 , 会建立 Client 的连接和后端 Web Server 的连接 , 占用 2 个连接 。
思考:
  • 每打开一个 Socket 占用一个 fd?
  • 为什么 , 一个进程能够打开的 fd 数量有限制?
HTTP 请求和响应
HTTP 请求:
  • 请求行:method、uri、http version
  • 请求头
  • 请求体
HTTP 响应:
  • 响应行:http version、status code
  • 响应头
  • 响应体
IO 模型
处理多个请求时 , 可以采用:IO 多路复用或者阻塞 IO+多线程:
  • IO 多路复用:一个线程 , 跟踪多个 Socket 状态 , 哪个就绪 , 就读写哪个 。
  • 阻塞 IO+多线程:每一个请求 , 新建一个服务线程 。
IO 多路复用和多线程的适用场景?
  • IO 多路复用:单个连接的请求处理速度没有优势 。
  • 大并发量:只使用一个线程 , 处理大量的并发请求 , 降低上下文环境切换损耗 , 也不需要考虑并发问题 , 相对可以处理更多的请求 。
  • 消耗更少的系统资源(不需要线程调度开销) 。
  • 适用于长连接的情况(多线程模式长连接容易造成线程过多 , 造成频繁调度) 。
  • 阻塞 IO +多线程:实现简单 , 可以不依赖系统调用 。
  • 每个线程 , 都需要时间和空间 。
  • 线程数量增长时 , 线程调度开销指数增长 。
select/poll 和 epoll 比较如下:
详细内容 , 参考:
https://www.cnblogs.com/wiessharling/p/4106295.html
select/poll 系统调用:
// select 系统调用int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); // poll 系统调用int poll(struct pollfd fds[], nfds_t nfds, int timeout); select: