User-Profile-Image
hankin
  • 5
  • centos7
  • docker
  • mysql
  • PostgreSQL
  • git/gitlab
  • ELK
  • python
    • python-Tornado
    • python-django
  • redis
  • nginx
  • kvm
  • proxmox
  • mongo
  • kubernetes
  • prometheus
  • GlusterFs
  • nfs
  • freeswitch
  • httpd
  • shell脚本
  • linux
  • fastdfs
  • nextcloud
  • openssl
  • openvpn
  • rabbitmq
  • sqlite
  • svn
  • java
  • ubuntu
  • vue2
  • wordpress
  • php
  • IOT物联网
  • 项目
  • 故障处理
  • 树莓派
  • 博客存档
  • 未分类
  • 杂项
  • #1742(无标题)
  • 新视野
  • 分类
    • 项目
    • 树莓派
    • 杂项
    • 未分类
    • 新视野
    • 故障处理
    • 博客存档
    • 交换机
    • wordpress
    • vue2
    • ubuntu
    • svn
    • sqlite
    • shell脚本
    • redis
    • rabbitmq
    • python-django
    • python
    • proxmox
    • prometheus
    • PostgreSQL
    • php
    • openvpn
    • openssl
    • nginx
    • nfs
    • nextcloud
    • mysql
    • mongo
    • linux
    • kvm
    • kubernetes
    • java
    • IOT物联网
    • httpd
    • GlusterFs
    • git/gitlab
    • freeswitch
    • fastdfs
    • ELK
    • docker
    • centos7
  • 页面
    • #1742(无标题)
  • 友链
      请到[后台->主题设置->友情链接]中设置。
Help?

Please contact us on our email for need any support

Support
    首页   ›   nginx   ›   正文
nginx

nginx相关随记(无参考意义)

2022-11-07 23:47:56
846  0 0
nginx流程判断
  一、if语句中的判断条件(nginx)                                   
        1、正则表达式匹配:                          
              ==:等值比较;                      
              与指定正则表达式模式匹配时返回“真”,                       区分字符大小写;
              与指定正则表达式模式匹配时返回“真”,                       不区分字符大小写;
              与指定正则表达式模式不匹配时返回“真”,                      区分字符大小写;
              与指定正则表达式模式不匹配时返回“真”,                      不区分字符大小写;

        2、文件及目录匹配判断:                              
              -f, !-f     判断指定的路径是否为存在且为文件;             
              -d, !-d     判断指定的路径是否为存在且为目录;             
              -e, !-e     判断指定的路径是否存在,文件或目录均可;                
              -x, !-x     判断指定路径的文件是否存在且可执行;                  

  示例                                  

  location = /                                    
        #匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配                          

  location ^~ /images/ {                                
        # ^~ 标识符 匹配任何已/images/开头的任何查询并且停止搜索。任何正则表达式将不会被测试。                            

  location ~* .(gif|jpg|jpeg)$ {                                    
        # 匹配任何已.gif、.jpg 或 .jpeg 结尾的请求                              

  注意,这3个标识符后面不能跟正则表达式,虽然配置文件检查会通过,而且没有任何警告,但是他们并不会进行匹配                                
  1     ^~ 标识符后面跟一个字符串。Nginx将在这个字符串匹配后停止进行正则表达式的匹配                              
  2     = 表示精确的查找地址,如location = /它只会匹配uri为/的请求                            
  3     @ 表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,                              
           只能用于Nginx产生的子请求,主要为error_page和try_files                              
域名称 域类型 域说明
main    全局域 Nginx的根级别指令区域。该区域的配置指令是全局有效的,该指令名为隐性显示,
        nginx.conf的整个文件内容都写在该指令域中
events  指令域 Nginx事件驱动相关的配置指令城
http    指令域 Nginx HTTP核心配置指令域,包含客户端完整HTTP请求过程中每个过程的处理方法的配置指令
upstream    指令域 用于定义被代理服务器组的指令区域,也称“上游服务器”
server  指令域 Nginx用来定义服务IP、绑定端口及服务相关的指令区域
location    指令域 对用户URI进行访问路由处理的指令区域
stream  指令域 Nginx对TCP协议实现代理的配置指令域
types   指令域 定义被请求文件扩展名与MIME类型映射表的指令区域
if  指令域 按照选择条件判断为真时使用的配置指令域

##########进程核心配置指令

  daemon on;                          #以守护进程的方式运行Nginx              
  pid logs/nginx.pid;                             #主进程ID记录在1ogs/nginx.pid中                  
  user nobody nobody;                             #工作进程运行用户为nobody              
  load_ module "modules/ngx_ http_ xslt_ filter_ module.so                            #加载动态模块ngx_http_xslt_filter_module.so                 
  error_ 1og logs/error .1og debug;                           #错误日志输出级别为debug               
  pcre_ jit on;                             #启用pcre_jit技术                 
  thread_ pool default threads=32 max_ queue=65536;                             #线程池的线程数为32,等待队列中的最大任务数为65536             
  timer_ resolution 100ms ;                             #定时器周期为100毫秒                  
  worker_ priority -5;                            #工作进程系统优先级为-5                 
  worker_ processes auto;                         #工作进程数由Nginx自动调整              
  worker_ Cpu_ affinity auto;                           #工作进程的CPU绑定由Nginx自动调整               
  worker_ rlimit_ nofile 65535;                         #所有工作进程的最大连接数是65535                 
  worker_ shutdown_ timeout 10s ;                             #工作进程关闭等待时间是10秒               
  1ock_ file logs/nginx. lock;                          #互斥锁文件的位置是1ogs/nginx.lock                 
  working_ directory logs                         #工作进程工作目录是logs                
  debug_ points stop;                             #调试点模式为stop             
  worker_ rlimit_ core 800m;                            #崩溃文件大小为800MB                 

  events {                                              
        worker_ connections 65535;                      #每个工作进程的最大连接数是65535                 
        use epoll;                    #指定事件模型为epoll                 
        accept mutex on;                    #启用互斥锁模式的进程调度                 
        accept mutex delay 300ms;                       #互斥锁模式下进程等待时间为300毫秒                 
        multi accept on;                    #启用支持多连接                
        worker aio_ requests 128;                       #完成异步操作最大数为128                
        debug connection 192.0.2.0/24                   #调试指定连接的IP地址和墙口是192.0.2.0/24              
  }                                               
reload原理

第一步在修改好 nginx 的配置文件 nginx.conf 后,向 master 进程发送 HUP 信号,这实际上和我们在命令行执行 nginx -s reload 命令效果是一样的。   
那么 master 进程在收到 HUP 信号以后,会在第二步检查我们的配置文件语法是否正确,也就是说我们并不一定非要在 nginx -s reload 前执行 nginx -t 检验下语法是否正确,因为在第二步 nginx 的 master 进程一定会执行这个步骤。   
在 nginx 的配置语法全部正确以后,master 进程会打开新的监听端口,为什么要在 master 进程中打开新的监听端口?因为我们可能在 nginx.conf 中会引入新的例如 443 或者之前我们没有打开的的监听端口,而所有 worker 进程是 master 进程 的子进程,子进程会继承父进程所有已经打开的端口,这是 linux 操作系统定义的,所以第三步,我们 master 进程打开了可能引入的新的监听端口。    
接下来 mster 进程会用新的 nginx.conf 配置文件来启动新的 worker 子进程,那么老的 worker 子进程会怎么样呢?  
我们会在第五步在启动新的 worker 子进程以后,由 master 进程再向老 worker 子进程发送 QUIT 信号,QUIT 信号和 TERM,INT 信号是不一样的,QUIT 信号是请优雅地关闭子进程,这时候需要关注顺序,因为 nginx 需要保证平滑,所以要先启动新的 worker 子进程,再向老的 worker 子进程发送 QUIT 信号。  
那么老的 master 子进程收到 QUIT 信号后,首先关闭监听句柄,也就是说这个时候新的连接只会到新的 worker 子进程,所以虽然他们之间有时间差,但是时间是非常快速的,那么关闭监听句柄后,处理完当前连接后就结束进程。   
下面看 reload 不停机载入新配置的图示。 

  master 进程上原先有四个绿色的 worker 子进程,它们使用了老的配置,当我们更改了 nginx.conf 配置文件后,向 master 发送 SIGHUP 信号或者执行 reload 命令, 然后 master 会用新的配置文件启动四个新的黄色 worker 子进程,此时是四个老的绿色 worker 子进程和四个新的黄色的 worker 子进程是并存的。那么老的 worker 子进程在正常的情况下会在处理已经建立好的连接上的请求之后关闭这个连接,哪怕这个连接是 keeplive 请求也会正常关闭。  
  但是异常情况,如果有一些请求出现问题,客户端长时间无法处理,那么就会导致这个请求长时间停留在这个 worker 子进程当中,那么这个 worker 子进程会长时间存在,因为新的连接已经跑在黄色的 worker 子进程中,所以影响并不会很大,唯一会影响的就是绿色的 worker 子进程会长时间存在,但也只影响已存在的连接,不会影响新的连接。    
  我们有什么办法处理呢?在新版本中提供了一个新的配置 worker_shutdown_timeout,也就是说最长等待多长时间,这样 master 进程启动新的黄色 worker 进程之后,如果老的 worker 进程一直没有退出,时间到了之后会强制把老的 worker 进程退出掉。   
优雅的关闭worker进程
  1.设置定时器worker_shutdown_timeout (在配置文件中设置) 
  2.关闭监听句柄(保证worker进程不会再处理新的连接) 
  3.关闭空闲连接    
  4.在循环中等待全部连接关闭(不是主动的立刻关闭,每当发现一个请求处理完毕,会把这个请求处理的连接关掉。在循环中等待全部连接关闭, 
    可能会超过我们设置的时间,那之后即使请求没有处理完,进行强制关闭。优雅的关闭可能只完成部分,其他的是强制关闭)   
  5.退出进程      

为什么要优雅的关闭?  
    如果直接进行关闭,那么此时正在访问的用户将收到不友好的错误信息
 worker进程可以识别出当前的连接没有正在处理请求,此时将连接关闭  
对于有些请求Nginx做不到(比如说当Nginx代理web socket协议,在web socket协议后进行通讯的frame帧里,      
Nginx是不解析它的帧的,此时是没有办法的。Nginx做TCP,UDP反向代理的时候,也无法识别需要经历多少报文才算结束) 对于Http请求可以做到,所以优雅的关闭是针对于Http请求      
在 location的 内部 直接存在return时 会直接允许return 其他语句不会执行
例如 如下的if 和prox 都不执行 ,直接返回901;
        location / {
                if ($request_method != POST) {
                        return 800;
                }
                if ($content_type = "application/x-www-form-urlencoded"){
                        proxy_pass http://192.168.0.137:8080;
                }
                proxy_pass http://www.baidu.com;
                access_log logs/past.log dm;

                return 901;
        }
评论 (0)

点击这里取消回复。

欢迎您 游客  

Copyright © 2025 网站备案号 : 蜀ICP备2022017747号
smarty_hankin 主题. Designed by hankin
主页
页面
  • #1742(无标题)
博主
tang.show
tang.show 管理员
linux、centos、docker 、k8s、mysql等技术相关的总结文档
213 文章 2 评论 201589 浏览
测试
测试