Nginx基础详解2(首页解析过程、进程模型、处理Web请求机制、nginx.conf语法结构)

news2024/11/19 20:25:15

续:Nginx基础详解1(单体部署与集群部署、负载均衡、正反代理、nginx安装)-CSDN博客

目录

4.Nginx默认首页的过程解析

5.Nginx进程模型的详解

5.1启动nginx后的关于nginx的进程查看

5.2master进程与process进程

5.3Nginx进程图解

5.4worker进程的数量控制

5.5nginx分成master进程和worker进程的好处

6.Nginx处理Web请求机制的详解

6.1worker的抢占模式

6.2图解Work的抢占模式

6.3传统服务器抢占模式

6.4Nginx对于传统抢占模式的优化

6.4.1epoll

6.4.1.1epoll概念

6.4.1.2epoll的特点

6.4.1.3epoll的工作流程:

6.5设定最大的连接数

7.ngin.confx配置的结构与语法结构

7.1全局配置main模块

7.2配置工作模式和连接数event模块

7.3http模块

7.4server模块

7.5location模块

7.6upstream服务器集群模块


        我们从上一次验证完的nginx网页之后开始学习!

4.Nginx默认首页的过程解析

        整个流程都是在HTTP协议的支持下进行的,所以客户机浏览器输入的http://可以省略,直接输入IP地址也是可以的。

        客户端浏览器输入服务器的域名或IP地址,交付给Nginx反向代理服务器进行处理,Nginx默认监听80端口,这也是http协议的默认端口。而服务器大概率并不是一台构成而是以集群为单位进行客户机请求报文的接收工作,根据算法找到一台最优的服务器处理客户机的一部分请求(注意不不是客户机全部的请求),找到相对应的server服务器之后将服务器上的页面**.html反馈给Nginx反向代理服务器,Nginx接收到该界面进行接收和转发相应给客户机浏览器,这就完成的用户点击界面到界面给你完整的反馈的整个过程。

        需要注意的是:Nginx根据配置的负载均衡算法将请求分配给集群中的一台服务器。这个过程是自动的,用户不需要了解背后的复杂逻辑。

5.Nginx进程模型的详解

5.1启动nginx后的关于nginx的进程查看

        我们在/usr/local/nginx/sbin目录下直接输入./nginx或nginx启动nginx这个软件之后,查看关于nginx的进程(如下图)

ps aux |grep nginx

        我们发现关于nginx的进程共有两个,一个是master process进程,另一个则是worker process进程,而master进程的所有者为root、worker进程的所有者为nobody。

5.2master进程与process进程

        master进程:是nginx的主进程,仅能存在一个。也是 Nginx 架构中的管理者,它负责启动整个 Nginx 服务,加载配置文件,并创建 worker 进程。Master 进程不直接处理客户端请求,而是作为守护进程运行在后台负责监控和管理工作进程。当接收到外部信号,如重启或关闭服务的命令时,Master 进程会相应地管理 worker 进程,确保服务的平滑过渡。此外,Master 进程还负责记录关键的日志信息,以便监控服务的运行状态。

常见的nginx的信号有一下几种:

        ./nginx -s stop

        ./nginx -s reload

        ./nginx -s quit

        ./nginx -t

        worker进程:是nginx的工作进程,可以手动进行设置,可以有多个,它们是处理客户端请求的实体。Worker 进程的数量通常设置为与服务器的 CPU 核心数相同,以充分利用多核优势。这些进程之间会共享相同的内存空间,但各自独立运行,从而实现高效的请求处理。当有新的请求到达时,Nginx 的事件模型会自动将请求分配给其中一个 worker 进程进行处理,确保了服务的高并发和高性能。

        需要注意的是nginx的工作进程worker需要结合实际的硬件条件设置数量,如果硬件条件不是很好的前提下还是不建议设置多个worker工作进程的。如果需要考虑在云服务器上配置nginx的worker的数量,而且云服务器还开启了Redies、zookeeper等相关的占用cpu性能的服务,那么worker的数量我建议为:

cpu的核数-1

5.3Nginx进程图解

           如果上述的master进程和worker进程大家还是不理解,我从网上找了一张图片,下面我给大家用比喻的维度去理解。

       

        想象一下,Nginx就像一个大型的快递分拣中心。在这个中心,有一个总指挥(master进程),他的工作是确保整个分拣流程的顺利进行。他负责监督整个中心的运作,包括招聘和培训分拣员(worker进程),以及处理突发事件。

        分拣员(worker进程)是实际处理快递包裹的人。他们每个人都可以同时处理多个包裹(客户端连接),将它们分拣到正确的运输车辆上。当一个新的包裹(客户端请求)到达时,总指挥会将这个任务分配给一个空闲的分拣员(master将信号分给闲置的worker)。

        快递分拣中心的目的是尽可能高效地处理大量的包裹,这就需要分拣员之间进行平衡的工作分配,以确保没有人过于忙碌或过于清闲。这就是负载均衡的概念。

        如果一个分拣员突然生病了(一个worker进程崩溃),总指挥会立即安排一个新的分拣员来接替他的工作,以确保分拣流程不会中断。

        有时候,分拣中心需要更新分拣规则(更新配置),总指挥可以在不影响整个分拣流程的情况下,指导分拣员逐步适应新的规则。

        通过这个比喻,我们可以理解Nginx的进程模型是如何工作的:总指挥(master进程)负责整个中心的管理和调度,分拣员(worker进程)负责实际的处理工作,而快递包裹(客户端连接)则是需要被处理的对象。

5.4worker进程的数量控制

        通过5.2我们了解了master进程和worker进程的概念,我们知道了worker进程可以存在多个,那么在Nginx的配置界面如何更改worker的数量呢?

        答案就藏在nginx.conf这个默认配置文件中!我之前也说过我们后续的大部分学习都是围绕着nginx.conf这个默认的配置文件展开。

打开nginx.conf

vim /usr/local/nginx/conf/nginx.conf

找到下方代码:

#user nobody:定义worker进程的属主,默认也是nobody,如果想要更改进程的属主需要

        第一步:去掉‘#’号

        第二步:更改nobody的值,可以改成超管root或者其他的普通账户的用户名

worker_process 1:决定了nginx会生成多少个worker进程数量,默认为1

我们做出如下更改并进行验证:

验证方法:

ps -ef |grep nginx

我们发现worker进程的属主没有变成root,数量并没有变成3个,这是为什么呢?

注意:

        只要更改了nginx.conf的配置,都需要重新加载nginx程序!只要更改了nginx.conf的配置,都需要重新加载nginx程序!只要更改了nginx.conf的配置,都需要重新加载nginx程序!重要的话说三遍!!!!!

        原因就是我们没有重新加载nginx的配置,所以导致的nginx还是原来的配置,新的配置没有记录到nginx中!

        解决方法:

  • 第一步:回到nginx的可执行目录 sbin下

cd /usr/local/nginx/sbin

  • 第二步:简称配置文件是否出错

./nginx -t

        只有出现nginx.conf test is successful才表示成功

  • 第三步:重新加载nginx的配置文件

./nginx -s reload

        配置完成这些我们再来看nginx的进程文件的worker的属主和数量(属主成功变成了root,数量成功变成了3个!试验成功)

5.5nginx分成master进程和worker进程的好处

        Nginx的master-worker模型在多个方面提供了显著的优势,包括稳定性、资源隔离、易于管理、负载均衡、多核CPU利用、灵活性、资源限制、简化调试、平滑重启、减少内存占用、提高响应速度、容错性、隔离性、快速恢复、限制攻击影响、资源限制、安全策略和日志记录。以下是这些优势的整合概述:

  1. 稳定性与容错性

    • Master进程负责管理worker进程,确保服务的持续可用性。如果一个worker进程崩溃,master进程可以迅速重启新的worker进程,最小化服务中断时间,提高整个系统的容错性。
  2. 资源隔离与限制

    • Master进程和worker进程之间的隔离有助于保护Nginx的核心功能,即使在worker进程崩溃的情况下,Nginx也能继续运行。通过限制worker进程的资源使用量,可以防止单个worker进程占用过多资源,从而影响其他进程。
  3. 易于管理

    • Master进程可以轻松地管理多个worker进程,包括平滑重启和升级,而不需要停止整个服务。这使得Nginx可以在不中断服务的情况下进行维护。
  4. 负载均衡与利用多核CPU

    • 多个worker进程可以并行处理请求,Nginx通过内部机制将请求分配给不同的worker进程,从而实现负载均衡。同时,Nginx可以配置多个worker进程来充分利用多核CPU的计算能力,提高处理请求的效率。
  5. 灵活性

    • Master进程可以动态地调整worker进程的数量,以适应不同的负载需求。
  6. 简化调试

    • 在开发和测试阶段,可以设置单个worker进程来简化调试过程。
  7. 平滑重启

    • Master进程可以控制worker进程的启动和关闭,实现平滑重启,这意味着在更新配置或代码时,不需要停止服务。
  8. 减少内存占用

    • 由于worker进程是轻量级的,它们可以快速启动和关闭,这有助于减少内存占用。
  9. 提高响应速度

    • 多个worker进程可以同时处理多个请求,这样可以提高响应速度和吞吐量。
  10. 隔离性

    • 每个worker进程是相互隔离的,这意味着如果一个worker进程被黑客攻陷,其他worker进程和master进程不受影响,可以继续正常工作。
  11. 限制攻击影响

    • 由于worker进程通常拥有较低的权限,即使被攻陷,攻击者也很难通过一个worker进程获取到服务器的控制权或敏感信息。
  12. 安全策略

    • Nginx可以配置各种安全策略,如限制请求频率、过滤恶意请求等,这些措施可以在worker层面上提供额外的安全防护。
  13. 日志记录

    • 所有worker进程的访问和错误日志都会记录在文件中,master进程可以监控这些日志,及时发现异常行为。

6.Nginx处理Web请求机制的详解

6.1worker的抢占模式

        在Nginx中因为master进程可以fork多个Worker进程(fork:nginx的一种原语进程之间是如何进行fork的“第五篇:Linux进程的相关知识总结(1)-CSDN博客”这篇文章我已经讲解过了),这些Worker进程之间是并行执行的,简单来说默认的并行Worker对于新来的client请求是需要去“抢”的,更具体地来讲,每一个客户端都对应了一个accept_mutex互斥锁(防止出现多个Worker进程同时处理一个请求的情况),生成的全部的Worker进程都是去抢锁从而就相当于抢到了客户端的请求。

6.2图解Work的抢占模式

        和上面讲的一样,我们假设有三个Worker进程,但是仅传来一个client的请求,且请求上附着着accrpt_mutex互斥锁,假设worker1抢到了这把互斥锁,那么worker1就和client建立了连接(worker2和3暂时闲置等到再来client继续执行上述的抢占行为),连接建立完成之后由worker1断开连接,而不是客户端来断开这个连接。

6.3传统服务器抢占模式

       传统的服务器仅存在一个worker进程和一个master进程,就和我们未配置worker进程时的nginx一样,这时传来一个client请求worker就直接处理了,但是如果该请求比较复杂,worker进程处理的事件较长,等到后面client2、client3……都来了之后client的请求还没处理完,这样就造成了阻塞,master继续使用fork命令新建一个worker进程来处理client2、client3……这样一个worker进程仅处理一个client。

        上述看似一对一的处理,实际上加重了处理器的负担(因为现实情况时服务器每秒会有成千上万的客户机发出请求,而一个客户机又不一定发出一个请求,所以请求的数量是成倍数上涨的),这也是早期服务器经常会遇到的瓶颈问题,也是nginx为什么逐渐称为最受欢迎的反向代理服务器的原因,Nginx生成的多个worker进行抢占避免了这种情况的发生。

6.4Nginx对于传统抢占模式的优化

        我们一开始还是默认的一个master进程和一个worker进程,如果多个客户机问询一个worker进程,发生了阻塞之后(不一定仅阻塞一个client,可能会有连续的多个client发生了阻塞),Nginx会使用默认的事件处理机制epoll(语法为use epull;)跳过阻塞的client客户端请求,一直继续向下找未阻塞的client请求,直到找到一个未阻塞的client请求即可截至并建立连接。这样一个worker进程使用该种处理机制可以处理6-8万的client请求,大大提高了工作效率。

6.4.1epoll

6.4.1.1epoll概念

        epoll 是 Linux 操作系统下的一种 I/O 事件通知机制,它是 selectpoll 的高效替代方案。epoll 在处理大量并发 socket 连接时表现出色,因为它在内核和用户空间之间提供了更高效的通信方式。

6.4.1.2epoll的特点
  1. 轻量级

    • epoll 使用更少的资源,因为它不需要像 select 和 poll 那样在每次调用时都传递和复制整个文件描述符集合。
  2. 无限制

    • epoll 没有 select 所具有的文件描述符数量限制(通常是 1024),它仅受限于操作系统的内存和进程的地址空间。
  3. 水平触发与边缘触发

    • epoll 支持水平触发(Level Triggered, LT)和边缘触发(Edge Triggered, ET)两种模式。
      • 水平触发:只要文件描述符仍然有事件待处理,就会一直通知。
      • 边缘触发:仅在状态发生变化时通知一次。
  4. 高效的事件通知

    • epoll 通过维护一个事件列表来减少不必要的唤醒和处理,从而提高效率。
  5. 内核态与用户态共享数据

    • epoll 通过内核与用户空间共享数据结构,减少了数据复制的开销。
6.4.1.3epoll的工作流程:
  1. 创建 epoll 实例

    • 使用 epoll_create() 系统调用创建一个 epoll 实例。
  2. 添加文件描述符

    • 使用 epoll_ctl() 将需要监听的文件描述符注册到 epoll 实例。
  3. 等待事件

    • 使用 epoll_wait() 等待事件发生,该调用会阻塞直到至少有一个监控的文件描述符上有事件发生。
  4. 处理事件

    • 当 epoll_wait() 返回时,应用程序可以处理这些事件。
  5. 关闭 epoll 实例

    • 使用 close() 系统调用关闭 epoll 实例。
  • Linux:推荐使用 epoll
  • Windows:推荐使用 IOCP。
  • macOS:推荐使用 kqueue
6.4.1.4配置epoll的方法

第一步:进入nginx的配置界面

vim /usr/local/nginx/conf/nginx.conf

第二步:找到event模块,输入如图配置,并ESC->:wq报错后退出

第三步:回到nginx的sbin目录下检查nginx的配置文件是否出错

./nginx -t

第四步:重新加载nginx的配置文件

./nginx -s reload

        上面的epoll讲解的还是太过“官方”了,如果实在感觉晦涩难懂的话大家就记住上面那张图片吧~

6.5设定最大的连接数

        我们6.4学过了Linux的处理机制,如果发现未阻塞的client就建立连接,那么如何定义最大的连接呢(注意:该连接为最大的同时连接数)?

        还是在nginx.conf这个文件中!我们基础操作离不开nginx的默认配置文件(在event块下的work_connections决定了每个worker进程的最大连接数!

vim /usr/local/nginx/conf/nginx.conf

7.ngin.confx配置的结构与语法结构

上一篇我们配置了nginx的目录(配置在了/usr/local/nginx目录下)

        我们进入内部的配置文件进行查看默认的配置

cat /usr/local/nginx/conf/nginx.conf

 
#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    #access_log  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
    server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
 
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
 
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
 
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
 
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
 
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
}

        默认的nginx.conf应该如上代码所示,而nginx.conf的配置界面也是存在语法结构的,我们后期也是会详细地解释每一个结构(如下图)

7.1全局配置main模块

  • 这是Nginx配置文件中最顶层的配置部分,它影响整个Nginx服务器的全局行为。在这里可以设置用户、用户组、工作目录、PID文件路径等。
  • 你可以这样理解为:只要打开了nginx.conf的配置文件,就是进入了main的全局配置模块,因为nginx是俄罗斯的公司设计的,底层的语言仍然使用的是C语言,这就相当与C语言的主函数main,而C语言的主函数的作用是作为程序的入口来使用。即:你进入了nginx.conf这个文件,就是进入了nginx默认配置的入口。
  • main 模块是 Nginx 配置的根基,它为整个服务器的运行提供了基础环境和全局参数。

7.2配置工作模式和连接数event模块

  • event模块定义了Nginx如何处理连接的接收和关闭。这里可以设置工作模式(如单线程或多线程)、连接数上限等

7.3http模块

  • HTTP模块用于配置与HTTP协议相关的参数,如保持连接的超时时间、日志文件的位置、HTTP头部的设置等。HTTP模块可以嵌套server块。
  • http模块也是我认为Nginx的精髓所在,是Nginx配置的核心部分!

7.4server模块

  • server块定义了虚拟主机的配置。每个server块可以有自己的监听端口、日志文件、location块等。server块是HTTP模块的子模块。

7.5location模块

  • location块定义了请求的路由规则,可以根据请求的URI来匹配特定的location块。在这里可以设置代理、重定向、静态文件服务等。

7.6upstream服务器集群模块

  • upstream块定义了一个服务器组,通常用于负载均衡。在这里可以配置一组后端服务器,Nginx会根据定义的策略将请求分发到这些服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【已解决】【Hadoop】【./bin的使用】bash: ./bin/hdfs: 没有那个文件或目录

在 Hadoop 环境中,决定何时在命令前添加 ./bin 和如何处理路径 /home/hadoop 与 /usr/local/hadoop 的问题,主要取决于你的当前工作目录和环境变量的设置。以下是一些指导原则: 何时使用 ./bin: 当前目录是 Hadoop 安装目录&…

【分类|回归】深度学习中的分类和回归?离散数据or连续数值?

【分类|回归】深度学习中的分类和回归?离散数据or连续数值? 【分类|回归】深度学习中的分类和回归?离散数据or连续数值? 文章目录 【分类|回归】深度学习中的分类和回归?离散数据or连续数值?前言1.分类问题…

帆软通过JavaScript注入sql,实现数据动态查询

将sql语句设置为参数 新建数据库查询 设置数据库查询的sql语句 添加控件 JavaScript实现sql注入 添加事件 编写JavaScript代码 //获取评价人id var pjrid this.options.form.getWidgetByName("id").getValue();//显示评价人id alert("评价人:&…

单片机串口AT指令操作SIM800、900拨打电话

文章目录 一、前言1.1 功能简介1.2 拨打电话功能的应用场景1.3 SIM900A与SIM800C模块介绍1.4 原理图 三、模块调试3.1 工具软件下载3.2 准备好模块3.3 串口调试助手的设置3.4 初始化配置3.5 拨打电话的测试流程 四、代码实现4.1 底层的命令发送接口4.2 底层数据接收接口4.3 检测…

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接:https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码:frkb 点击第一个进行安装,按步骤来即可。 2.汉化 (1)复制chinese.ptl文件 (2&…

四元组问题

目录 问题描述 输入格式 输出格式 样例输入 样例输出 说明 评测数据规模 运行限制 原题链接 代码思路 问题描述 从小学开始,小明就是一个非常喜欢数学的孩子。他喜欢用数学的方式解决各种问题。在他的高中时期,他遇到了一个非常有趣的问题&…

【Unity服务】如何使用Unity Version Control

Unity上的线上服务有很多,我们接触到的第一个一般就是Version Control,用于对项目资源的版本管理。 本文介绍如何为项目添加Version Control,并如何使用,以及如何将项目与Version Control断开链接。 其实如果仅仅是对项目资源进…

华盈伯乐 | Bio-Plex多重细胞因子检测技术培训及研讨会现场回顾

精彩华盈现场回顾 迎着朝霞,与会的伙伴们一早踏上了旅程,参与华盈生物与伯乐生命科学联合举办的Bio-Plex多重细胞因子检测技术培训及研讨会活动。随着活动的序幕缓缓拉开,我们迎来了一段充实而富有成效的学习之旅。 精彩开幕 华盈生物的副总…

SpringMVC4-SpringMVC获取请求参数

test_param.html&#xff1a; <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>测试请求参数</title> </head> <body> <h1>测…

解决Pymysql has no attribute ‘escape_string‘ 并且无法引入该模块

打印出的pymysql版本是1.4.6 需要import这个module&#xff0c;并且根据pymysql的版本import的方式还不同 import pymysqlif pymysql.__version__ >1.0.0:from pymysql.converters import escape_string else:escape_string lambda x: pymysql.escape_string(x)然而&am…

如何借助Java批量操作Excel文件?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中&#xff0c;通常会有一些针对Excel的批量操作&#xff0c;批量的意思一般有两种&#xff1a; 对批量的Excel文件进行操作。如导入多个Excel文件…

鸿蒙OpenHarmony【小型系统基础内核(虚实映射)】子系统开发

虚实映射 基本概念 虚实映射是指系统通过内存管理单元&#xff08;MMU&#xff0c;Memory Management Unit&#xff09;将进程空间的虚拟地址与实际的物理地址做映射&#xff0c;并指定相应的访问权限、缓存属性等。程序执行时&#xff0c;CPU访问的是虚拟内存&#xff0c;通…

实现微信小程序中点击单词显示在input的交互功能指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

卷积神经网络-学习率

文章目录 一、学习率的定义二、学习率的作用三、学习率的调整方法1.有序调整(1).有序调整StepLR(等间隔调整学习率&#xff09;(2).有序调整MultiStepLR(多间隔调整学习率)(3).有序调整ExponentialLR (指数衰减调整学习率)(4).有序调整CosineAnnealing (余弦退火函数调整学习率…

TypeScript 设计模式之【单例模式】

文章目录 **单例模式**: 独一无二的特工我们为什么需要这样的特工?单例模式的秘密&#xff1a;如何培养这样的特工?特工的利与害代码实现单例模式的主要优点单例模式的主要缺点单例模式的适用场景总结 单例模式: 独一无二的特工 单例模式就像是一个秘密组织里的特殊特工。这…

Java介绍及JDK 21详细安装教程

文章目录 1. 文章简介2. Java和JDK的介绍与关系2.1 Java2.2 JDK 3. Java版本的发展历程4. Java 21安装步骤 1. 文章简介 本文介绍如何Java、JDK、Java的发展及如何快速安装JDK 21。内容详细充实&#xff0c;旨在帮助您快速了解并使用Java。 2. Java和JDK的介绍与关系 2.1 Jav…

828华为云征文|华为云Flexus云服务器X实例——部署EduSoho网校系统、二次开发对接华为云视频点播实现CDN加速播放

EduSoho 是一款功能强大的网校系统&#xff0c;能够帮助教育机构快速搭建在线学习平台。本文将详细介绍如何在华为云服务器上安装和部署 EduSoho 网校系统&#xff0c;以及二次开发对接华为云视频点播VOD来实现CDN加速播放。 edusoho本地存储的视频播放存在诸多弊端。一方面&a…

「C++系列」命名空间

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、命名空间1. 定义命名空间2. 使用命名空间中的成员3. 命名空间的…

SAP 利润分配-未分配利润的年初余额和年末余额不一致的问题

SAP OB53 本年利润科目的年初余额和年末余额不一致的问题 关于OB53科目的问题 OB53维护的本年利润科目 现象&#xff1a;为何去年年末的本年利润金额和今年年初的本年利润金额不一致。 解释原因&#xff1a; 本年利润科目的这种现象归根结底是“表结法”产生的&#xff0c;换…

QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红

问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…