Skip to content

Nginx 汇总

什么是Nginx?

  1. Nginx 是一个高性能的 HTTP 和反向代理服务器, 也是一个 IMAP/POP3/SMTP 服务器;

  2. Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器, 目前使用的最多的 web 服务器或者代理服务器, 像淘宝、新浪、网易、迅雷等都在使用;

Nginx有什么优点?

  1. 跨拼台、配置简单、内存消耗小、节省带宽、稳定性高、三级缓存;
  2. 非阻塞、高平发连接: 处理 2 ~ 3 万并发连接数, 官方检测能支持 5 万并发;
  3. 内置健康检查功能: 如果一个服务器宕机, Nginx 会做一个健康检查, 再发送的请求就不会发送的宕机的服务器;
  4. 异步接收请求: 浏览器把请求发送到 Nginx 服务器, 它先将请求都接受下来, 之后在一次性发送给后端的 web 服务器, 减轻了 web 服务器的压力;
  5. 可搭建集群, 实现负载均衡;
  6. master/worker 结构: 一个 master 进程, 生成一个或多个 worker 进程;

为什么Nginx性能这么高?

  • 得益于 Nginx 的事件机制: 异步非阻塞事件处理机制: 运用了 epoll 模型, 提供了一个队列, 排队解决;

Nginx如何实现高并发?

  1. 在 Nginx 服务启动后, 我们查看后台进程后, 可以看到一个 master 进程和若干个 worker 进程, 这些 worker 进程之间是平等的, 它们都是被 master 进程 fork 过来的;
  2. 在 master 里面, 先建立一个需要 listen 的 socket(listenfd), 然后在 fork 出多个 worker 进程, 当用户请求进入到 Nginx 服务之后, 每个 worker 的 listenfd 就变得可读了, 并且所有的 worker 都会去抢占一个叫 accept_mutex 的东西, 那么这个 accept_mutex 是互斥的, 一旦被一个 worker 获取到之后, 其他的 worker 就没发进行获取了;
  3. 获取到 accept_mutex 的 worker 就会开始 读取请求 -> 解析请求 -> 处理请求, 等待处理完毕, 数据返回到客户端之后, 这个事件就算结束了;
  4. Nginx 就是这种 worker 去抢注用户请求的方式, 以及自身的非阻塞事件处理机制来实现高并发的;

为什么不使用多线程?

因为创建多线程和上下文的切换会非常耗费资源, 线程占用的内存会很大, 上下文切换占用的 cpu 也高, 所以使用 epoll 模型来避免这个缺点;

Nginx如何处理一个请求的?

首先 Nginx 在服务启动的时候, 会解析配置文件, 得到需要监听的端口号和 ip 地址, 然后在 nginx 的 master 进程中, 初始化一个需要进行监听的 socket(创建 socket, 设置 addrreuse 等选项, 然后绑定到制定的 ip 地址端口, 然后在 listen), 之后调用 fork 函数创建出多个 worker 子进程来, 之后 worker 子进程会进行一个 accept_mutex 的竞争, 这个时候客户端就可以进行请求的发送, 当客户端与 Nginx 三次握手获取连接之后, 某一个 worker 子进程就会竞争成功, 得到建立好连接的 socket 对象, 之后 Nginx 在对建立好的连接进行一个封装(ngx_connection_t 结构体), 接着进行读写事件处理函数的设置并且添加读写事件来与客户端进行数据的交互, 最后 Nginx 或客户端来主动关闭掉连接, 至此请求处理完成;

正向代理和反向代理

  1. 正向代理(代理的是客户端): 一个位于客户端和服务端之间的服务器, 客户端为了获取服务端的资源, 让代理服务器向服务端去发送一个请求(客户端向代理发送一个请求并指定目标服务器)获取资源, 代理服务器转交请求给服务端并将获得的内容返回给客户端;
  2. 反向代理(代理的是服务端): 代理服务器来接受网络上的连接请求, 然后将请求发送给内部网络上的服务器, 并从服务器上获取结果返回给网络上请求连接的客户端, 此时代理服务器就是一个反向代理服务器;
  3. 说白了, 区别就是服务对象不一样, 正向代理替客户端工作, 反向代理替服务端工作;

动静分离

  1. 动态资源、静态资源分离就是说让动态网站里的动态网页根据一定的规则把不变的资源和经常进行改变的资源区分出来, 动静分离之后我们就可以根据静态资源的特点进行一个缓存处理(网页静态化的核心思路);
  2. 总结: 动态文件与静态文件的拆分

为什么要动静分离?

  1. 在软件开发中, 有一些请求(如: .jsp、.do、.action)是需要后台进行处理的, 有一些请求(css、html、js、jpg)是不需要后台进行处理的, 这些不需要进行后台处理的叫静态文件, 否则就是动态文件;
  2. 后台忽略不行吗? -> 当然可以, 但是后台的请求次数就增加了, 如果我们对资源的响应速度有要求的时候, 就要采用这种动静分离的策略去解决和处理, 对静态资源应该与后台分开进行部署, 这样来提高用户对静态资源的访问速度, 降低对后台应用的访问;

负载均衡

  1. 负载均衡就是代理服务器将用户的请求均衡的分发到各个服务器上;
  2. 负载均衡能够解决网络堵塞, 提高服务器的响应速度, 服务就近提供, 达到更好的访问质量, 减少后台服务器的并发压力;