Nginx基础知识

Nginx基础知识

反向代理服务器
  • 正向代理

​ 由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助VPN来实现,这就是一个简单的正向代理的例子。这里你能够发现,正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。

  • 反向代理

​ 当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。

Nginx的Master-Worker模式
  • master进程

    读取并验证配置文件nginx.conf;管理worker进程;

  • worker进程

    每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。

Nginx热部署

​ 修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置进行处理请求,而且新的请求必须都交给新的worker进程,至于老的worker进程,等把那些以前的请求处理完毕后,kill掉即可。

Nginx高并发

​ Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。

Nginx可靠性

​ Keepalived+Nginx实现高可用。

​ 请求不要直接打到Nginx上,应该先通过Keepalived

Nginx主要应用
  • 动静分离

    Nginx 服务器将接收到的请求分为动态请求静态请求

​ 静态请求直接从 nginx 服务器所设定的根目录路径去取对应的资源,动态请求转发给真实的后台(应用服务器,如Tomcat)去处理。

​ **作用:**减轻应用服务器压力,将后台api接口服务化,可以将前后端代码分开开发部署

  • 反向代理

    Nginx对服务器进行代理,浏览器或者其他终端向Nginx请求,但是具体从哪个服务器获取资源由Nginx调配。

    **作用:**1.保障应用服务器的安全;2.实现负载均衡;3.实现跨域

  • 负载均衡

    在服务器集群中,Nginx可以将收到的客户端请求均匀地分配到集群中所有的服务器上。

    **作用:**分摊服务器集群的压力,服务器心跳检查,保证客户端访问的稳定性。

  • 正向代理

    Nginx对客户端进行代理,服务器处理由Nginx发出的请求,而不知道实际的请求客户端。

Nginx基本处理机制

​ worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供 80 端口的 http 服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 worker 进程。所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。

Nginx变量

  • Nginx 变量的创建和赋值操作发生在全然不同的时间阶段 :Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。

  • Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的 server 配置块。Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰。

  • **Nginx 变量值容器的生命期是与当前正在处理的请求绑定的,而与location无关。**通过echo_exec或rewrite指令发起“内部跳转”,location变化后原来的变量依旧存在。

  • 通过 set 指令隐式创建的 Nginx 变量我们一般称为“用户自定义变量”,或者更简单一些,“用户变量”。既然有“用户自定义变量”,自然也就有由 Nginx 核心和各个 Nginx 模块提供的“预定义变量”,或者说“内建变量”(builtin variables)。

    $uri 可以获取解码后的当前请求URI

    $request_uri 可以获取未经解码的原始请求URI

    $arg_XXX 可以获取请求中名为XXX的参数的值,且不区分大小写

    set_unescape_uri 可以对参数中%XX(%20 空格)进行解码

    除了 a r g X X X 变 量 群 类 似 的 还 有 arg_XXX变量群 类似的还有 argXXXcookie_XXX, $http_XXX, $sent_http_XXX等

  • 许多内建变量是都是只读的,应当避免对其赋值,否则会造成错误。

    a r g s 变 量 是 支 持 改 写 的 , 但 是 args变量是支持改写的,但是 argsargs变量存放在nginx核心中的特定位置,改写 a r g s 的 值 会 同 步 影 响 args的值会同步影响 ar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值