|NO.Z.00065|——————————|LinuxNetwork|——|Linux&Nginx&反向代理.V01|
一、讲在nginx之前
### --- 同步与异步
~~~ 同步与异步的重点在消息通知方式上,也就是调用结果的通知方式不同
~~~ #同步:
~~~ 当一个同步调用发出后,调用者要一直等待调用的结果通知后,才能进行后续的执行
~~~ #异步:
~~~ 当一个异步调用发出去后,调用者不必一直等待调用的结果的返回,异步调用,
~~~ 要想获得结果,
### --- 一般有两种方式:
~~~ 主动轮询异步调用的结果
~~~ 被调用方通过callback(回调通知)来通知调用方调用结果
~~~ #实例解释:
~~~ 同步取快递:小明收到快递将送的的信息,在楼下一直等到快递送达
~~~ 异步取快递:小明收到快递将送到的信息,快递到楼下后,小明再下楼去取。
~~~ 异步取快递,小明知道快递到达楼下的两种方式
~~~ 不停的电话问快递小哥到了没有,即主动轮询
~~~ 快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知
### --- 阻塞与非阻塞:
~~~ 阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,
~~~ 当前进/线程是挂起转态还是非挂起状态
~~~ #阻塞:
~~~ 调用在发出去后,在消息返回之前,当前进/线程会被挂起,知道有消息返回,
~~~ 当前进/线程才会被激活
~~~ #非阻塞:
~~~ 调用在发出去后,不会阻塞当前进/线程,而会立即返回。
~~~ #实例解释
~~~ 阻塞取快递:小明收到快递即将送达的消息后,什么事都不做,一直专门等快递
~~~ 非阻塞取快递:小明收到快递即将送达的信息后,等快递的时候,还一边敲代码一遍刷微信
### --- 注释:
~~~ 同步与异步,重点在于消息通知的方式,阻塞与非阻塞,重点在于等消息时候的行为。
~~~ 所以,就有了下面4中组合方式:
~~~ #同步阻塞:小明收到信息后,啥都不干,等快递
~~~ #同步非阻塞:小明手收到信息后,边刷微博,边等着去快递
~~~ #异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递
~~~ #异步非阻塞:小明收到信息后,边刷微博,边等快递员通知他取快递。
~~~ 大部分程序的I/O模型都是同步阻塞的,单个进程每次只有在一个文件描述符上执行I/O操作,
~~~ 每次I/O系统调用都会阻塞,知道完成数据传输,
~~~ 传统的服务器采用的就是同步阻塞的多进程模型。
~~~ 一个server采用一个进程负责一个request的方式,一个进程负责一个request,
~~~ 知道会话结束,进程数就是并发数,而操作系统支持的进程数是优先的,
~~~ 且进程数越多,调度的开销也越大,因此无法面对高并发。
~~~ nginx采用了异步非阻塞的方式工作,我们先来了解一下I/O多路复用中的epoll模型
### --- epoll模型:
~~~ 当连接I/O时间产生的时候,epoll就会去告诉进程那个连接有I/O事件产生,
~~~ 然后进程就去处理这个事件。
~~~ 例如:小明楼下有一个收发室,每次有快递到了,门卫就先代收并作标记,
~~~ 然后通知小明去取送给小明的快递。
### --- 为什么nginx比其他web服务器并发高(nginx工作原理)
~~~ nginx配置user epool后,以异步非阻塞方式工作。能够轻松处理百万级的并发连接
~~~ #处理过程:
~~~ 没进来一个request,会有一个worker进程去处理,但不是全程处理,
~~~ 处理到可能发生阻塞的地方,比如向后端服务器转发request,并等待请求返回,
~~~ 那么,这个处理的worker不会这么傻等着,它会在发送完请求后,
~~~ 注册一个事件:“如果后端服务器返回了,告诉我一声,我在接着干”。
~~~ 于是他就休息去了,此时,如果再有新的request进来,
~~~ 他就可以很快再按这种方式处理。而一旦后端服务器返回了,
~~~ 就会触发这个事件,worker才会来接手,这个request才会接着往下走,
~~~ 通过这种快速处理。快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。
二、nginx详解
### --- 概述:
~~~ nginx(engine x)是一个高性能HTTP和反向代理web服务器,
~~~ 同时也提供了IMAP/POP3/SMTP服务,
~~~ Nginx是由伊戈尔.塞索耶夫为俄罗斯访问量第二的rambler.ru站点开发的,
~~~ 第一个公开版本0.1.0发布于2004年10月4日。
~~~ nginx是一款轻量级的web服务器/方向代理服务器及电子邮件(IMAP/POP3)代理服务器,
~~~ 在BSD-like协议下发行,其特点是占有内存少,并发能力强。
三、工作模式:nginx工作模式:nginx和PHP的连接方式

连接过程

### --- nginx有两种工作模式:
~~~ master-worker模式和单进程模式。在master-worker模式下,
~~~ 有一个master进程和至少一个worker进程,但进程模式顾名思义只有一个进程。
~~~ 这两种模式有各自的特点和适用场景。
### --- master-worker:
~~~ 该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。
~~~ master进程负责处理系统信号,加载配置,
~~~ 管理worker进程(启动,杀死,监控,发送消息/信号灯)
~~~ worker进程负责处理具体的业务逻辑。
~~~ 管理worker进程(启动,杀死,监控,发送消息/信号等)
~~~ worker进程负责处理具体的业务逻辑,也就是说,对外部来说,
### --- 真正提供服务的是worker进程,生产环境下一般使用这种模式,因为这种模式有以下优点:
~~~ #稳定性强,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务终端的概率
~~~ #配合linux的CPU亲和性配置,可以充分利用多核CPU的优势,提升性能
~~~ #处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)
### --- 单进程模式:
~~~ 单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责,
~~~ 由于只有一个进程,因此可以很方便地利用gdb等工具进行调试,
~~~ 该模式不支持nginx的平滑升级功能,任何的信号处理都肯能造成服务中断,
~~~ 并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。
~~~ 因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用(了解);
~~~ 开发阶段,测试阶段使用,生产环境中不会去使用。
四、配置文件结构
user www www;
#程序运行用户和组
worker_processer auto; // worker_processer开启的进程的数量,auto:指自动指定数量
#启动进程,指定nginx启动的工作进程数量,建议按照CPU数据来指定,一般等于CPU核心数目
error_log /home/wwwlogs/nginx_error.log cirt;
#全局错误日志
pid /usr/local/nginx/logs/nginx.pid;
#主进程PID保存文件
worker_rlimit_nofile 51200;
#文件描述符数量
events
{
use epoll;
#使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
worker_connections 51200; // 一个工作进程能够处理的最大的连接数量。总量:worker_proccsscs乘以worker_connections即可
#工作进程的最大连接数量
}
http{
#网站优化参数
server { // 具体的某一网站的配置信息
listen 80; // 监听端口
root html; // 网页根目录(/usr/local/nginx/html)
server_name www.atyanqi.com; // 服务器域名
index index.html; // 默认加载页面
access_log logs/access.log; // 访问日志保存位置
..............;
location(.*)\.php${
#用正则匹配具体的访问对象;
}
location {
#跳转等规则;
}
}
server {
#虚拟主机;
}
}
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
cdv007-network
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通