Nginx 基础

Nginx中有一个 master 进程和多个 worker 进程,master 进程主要用来管理 worker 进程, worker用于处理网络请求。通过向master发送信号,就可以管理master和worker,如./nginx -s reload就是向master发送了reload信号。

一个连接请求过来,每个进程worker都有可能处理这个连接,怎么做到的呢?Nginx 惊群的原因和解决方案

  • 首先,master会先建立好需要 listen 的 socket(listenfd)之后,然后 fork 出多个 worker 进程。
  • 所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接。
    【注】空闲连接数量小于总连接数量的八分之一时,不去获取 accept_mutex 锁。从而让其他空闲连接数量比较多的进程去接受连接(参考:nginx 是如何分配 worker 进程连接数的)。
  • 当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端。我们可以看到,一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。

参考:https://www.w3cschool.cn/nginx/sd361pdz.html

nginx源码学习可参考:
http://tengine.taobao.org/book/
https://www.w3cschool.cn/nginx/sd361pdz.html
书籍:深入理解Nginx:模块开发与架构解析(第2版)陶辉-著_

其他

参考:Nginx 面试题 40 问

nginx个apache的区别?

Nginx轻量级、高性能、模块化的Web服务器,可以用于反向代理、负载均衡、IP拦截、静态网页等。它使用基于事件的处理机制。
我猜nginx的事件处理机制应该和muduo的差不多,
所谓的事件的处理机制应该就是使用epoll监听文件描述符上的事件,然后通过事件到来时就调用对应的回调函数。

正向代理:代理服务器接收用户请求,代替客户端去目标服务器上请求资源。
反向代理:代理服务器接收用户请求,将请求分发给内部服务器,这个过程一般要实现负载均衡等操作。反向代理可以隐藏源服务器的存在向外提供同一接口。
两者都是起到代理的作用,不过正向代理代理的是客户端,反向代理代理的是服务器端。

cookie 和 session 区别?
cookie数据保存在客户端,session数据保存在服务端。客户端请求中带有cookie,那么服务器会解析这个cookie并找到对应的session对象。

Nginx 配置文件 nginx.conf 有哪些属性模块?
events、http {server{location /{}}}

为什么 Nginx 不使用多线程?
1.主要是保证了nginx的高可用:

  • Nginx 如果使用的是多线程结构的时候,因为线程之间是共享同一个地址空间的,所以当某一个第三方模块引发了一个地址空间导致的段错误时、在地址越界出现时,会导致整个 Nginx 进程全部挂掉。
  • 每个子进程都有自己独立的内存空间,在一个进程中,各个子进程是相互独立的,一个子进程的段错误通常不会导致整个进程崩溃。

2.nginx采用多进程处理连接,进程数已经等于核心数,所以每个进程中使用的是单线程,从而减少cpu的争抢。

nginx和apache的区别?
nginx:nginx更轻量级、apache是同步多进程模型,一个连接对应一个进程,nginx是异步的,多个连接可以对应一个进程。

为什么要做动、静分离?
动态资源需要后台处理,静态资源不需要后台处理。所以直接将静态资源放在本地的 Nginx,或者CDN 服务器。
CDN ,即内容分发网络。将网站的内容发布到最接近用户的网络边缘,使用户可就近取得所需的内容,提高用户访问网站的速度。

Nginx 负载均衡的算法

  • 轮询:多个请求到来时,按顺序一个一个选取后端服务器。
  • 权重:每个后端服务器设置不同的权重,权重高的服务器会分到请求的概率就大。
  • ip_hash( IP绑定):每个IP的请求都固定对应一个后端服务器。每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
    session共享问题:如果Web应用程序运行在多台服务器上,会话数据需要在这些服务器之间共享,以便用户在不同的服务器上访问其会话数据。
  • fair(第三方插件):哪个服务器的响应速度快,就将请求分配到那个服务器上。
  • url_hash(第三方插件):使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。

如何用 Nginx 解决前端跨域问题?
客户端与代理服务器在同一域内,代理服务器将请求发送到目标服务器。

如果需要使用域名访问局域网内的web服务,那么可以向windows本地hosts添加ip地址对应的域名解析;

Nginx限流就是限制用户请求速度,Nginx的限流都是基于漏桶流算法

  • 正常限制访问频率(正常流量):限制单个IP的请求处理频率,比如一个用户一分钟一个请求进来,多余的全部不处理。
  • 突发限制访问频率(突发流量):“正常限制访问频率”中限制了用户短时间内发送了大量请求,但是很经常会发生短时间内发送多个请求的情况。所以nginx就有了burst和nodelay,burst和nodelay的作用是让多余的请求可以先放到队列里,慢慢处理,比如burst=4但是发送6个请求,1个请求被立即处理,4个请求被放到burst队列里,另外一个请求被拒绝(参考:如何使用 Nginx 优雅的限流)。
  • 限制并发连接数:比如单个IP同时并发连接数最多只能10个连接

漏桶流算法和令牌桶算法:

Nginx配置高可用性怎么配置:上游服务器超时未响应,那么就应该轮询到下一台服务器。

Nginx 如何实现上游服务器的健康检查?:利用 nginx_upstream_check_module 模块对后端节点做健康检查。

Nginx -s的含义:发送不同的信号给正在运行的 Nginx 进程,如nginx -s reload、nginx -s stop等。

如何在Nginx服务器上添加模块?:编写config文件指定模块名和模块代码路径,就可以使用configure --add-module=PATH重新编译nginx。

posted @ 2022-08-29 16:43  好人~  阅读(23)  评论(0编辑  收藏  举报