Nginx运行原理与基本配置文件讲解

news2024/11/17 0:02:35

文章目录

    • Nginx基本运行原理
    • Nginx的基本配置文件
      • server
      • location
      • root 与 alias 的区别
      • server 和 location 中的 root
      • nginx欢迎页
    • 本文参考文章
    • Nginx相关文章

Nginx基本运行原理

image-20220429201217315

Nginx的进程是使用经典的「Master-Worker」模型,Nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。worker进程主要处理基本的网络事件,多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

Nginx的基本配置文件

Nginx 的默认配置文件可以总体归纳为三个模块 全局块、 events块、 http块。

# 全局模块
events {
    # events模块
}
http {
   # http全局模块
   server {
        # server全局模块
        location [PATTERN]{
           # location模块
        }
   }
}

全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

server块:配置虚拟主机的相关参数,一个http中可以有多个server。

location块:配置请求的路由,以及各种页面的处理情况。

Nginx的默认配置文件nginx/conf/nginx.conf是去掉注释的简单版如下

worker_processes  1; # 允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个

events {
    #单个进程最大连接数(最大连接数 = 连接数 * 进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
    worker_connections  1024;
}


http {
    #文件扩展名与文件类型映射表(是conf目录下的一个文件)
    include       mime.types;
    #默认文件类型,如果mime.types预先定义的类型没匹配上,默认使用二进制流的方式传输
    default_type  application/octet-stream;

    #sendfile指令指定nginx是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度。
    sendfile        on;
    
     #长连接超时时间,单位是秒
    keepalive_timeout  65;

 #虚拟主机的配置
    server {
    #监听端口
        listen       80;
        #域名,可以有多个,用空格隔开
        server_name  localhost;

	#配置根目录以及默认页面
        location / {
            root   html;
            index  index.html index.htm;
        }

	#出错页面配置
        error_page   500 502 503 504  /50x.html;
        #/50x.html文件所在位置
        location = /50x.html {
            root   html;
        }   
    }
}

include代表导入一个配置文件我们不仅可以导入types类型的文件,也可以导入conf文件,例如将server虚拟主机配置封装为一个单独的配置文件导入。浏览器向Nginx服务器请求静态资源时浏览器无法通过后缀名得知这是一个什么样的文件只能通过响应的ContextType 识别例如text/html, text/css等,所以需要此文件来告诉浏览器渲染成什么样的文件。

mime.types 文件如下

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;
}

server

最重要的是server虚拟机主机

在这里插入图片描述
虚拟主机,就是将一台物理服务器虚拟为多个服务器来使用,从而实现在一台服务器上配置多个站点,即可以在一台物理主机上配置多个域名。Nginx 中,一个 server 标签就是一台虚拟主机,配置多个 server 标签就虚拟出了多台主机。Nginx 虚拟主机的实现方式有两种:域名虚拟方式与端口虚拟方式。域名虚拟方式是指不同的虚拟机使用不同的域名,通过不同的域名虚拟出不同的主机;端口虚拟方式是指不同的虚拟机使用相同的域名不同的端口号,通过不同的端口号虚拟出不同的主机。基于端口的虚拟方式不常用。

server_name表示当前 nginx的地址或者域名,域名需要进行购买,或者配置host文件

location就相当于url路由,Nginx根据location的配置来决定究竟如何处理一个请求。

location

location具体语法:

location [ = | ~ | ~* | ^~ ] uri { ... }

重点看方括号中的 [ = | ~ | ~* | ^~ ],其中 | 分隔的内容表示你可能会用到的语法,其中:

= 表示精确匹配:

location = /test {
    return 200 "hello";
}

例如:

/test              ok
/test/             not ok
/test2             not ok
/test/2            not ok

~ 表示区分大小写的正则匹配:

location ~ ^/test$ {
    [configuration] 
}

例如:

/test              ok
/Test              not ok
/test/             not ok
/test2             not ok

~* 表示不区分大小写的正则匹配:

location ~* ^/test$ {     
    [configuration] 
}

例如:

/test               ok
/Test               ok
/test/              not ok
/test2              not ok

^~ 表示 uri 以某个字符串开头:

location ^~ /images/ {    
    [configuration] 
}

例如:

/images/1.gif        ok

/ 表示通用匹配:

location / {     
    [configuration] 
}

例如:

/index.html           ok
location /test {
    [configuration] 
}

例如:

/test                 ok
/test2                ok
/test/                ok

Location的定义分为两种:

前缀字符串(prefix string)

正则表达式(regular expression),具体为前面带 ~* 和 ~ 修饰符的

当存在多个 Location 的时候,匹配的顺序为:

检查使用前缀字符串的 locations,在使用前缀字符串的 locations 中选择最长匹配的,并将结果进行储存;

如果符合带有 = 修饰符的URI,则立刻停止匹配;

如果符合带有 ^~ 修饰符的URI,则也立刻停止匹配;

然后按照定义文件的顺序,检查正则表达式,匹配到就停止;

当正则表达式匹配不到的时候,使用之前储存的前缀字符串;

总结:

  • 顺序上

    • 前缀字符串顺序不重要,按照匹配长度来确定

    • 正则表达式按照定义顺序

  • 优先级上

    • = 修饰符最高,^~ 次之,再者是正则,最后是前缀字符串匹配。

我们举几个简单的例子进行说明

请求URI如下:

/document

示例一:

配置:

server {
    location /doc {
        [ configuration A ] 
    }
    location /docu {
        [ configuration B ] 
    }
}

匹配结果:

configuration B

注:虽然 /doc 也能匹配到,但 在顺序上,前缀字符串顺序不重要,按照匹配长度来确定

示例二:

server {
    location ~ ^/doc {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

匹配结果:

configuration A

示例三:

server {
    location ^~ /doc {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

匹配结果:

configuration A

注:虽然 ~ ^/docu 也能匹配到,但 ^~优先级更高

示例四:

server {
    location /document {
        [ configuration A ] 
    }
    location ~ ^/docu {
        [ configuration B ] 
    }
}

匹配结果:

configuration B

root 与 alias 的区别

当我们这样设置 root 的时候:

location /i/ {
    root /data/w3;
}

当请求 /i/top.gif/data/w3/i/top.gif 会被返回。

当我们这样设置 alias 的时候:

location /i/ {
    alias /data/w3/images/;
}

当请求 /i/top.gif/data/w3/images/top.gif 会被返回。

两者的区别:

  • root 是直接拼接 root + location

  • alias 是用 alias 替换 location

server 和 location 中的 root

server 和 location 中都可以使用 root,举个例子:

server {
    listen 80;
    server_name 10.0.7.115;
        root /data/app/;
        location / {
          root /data/web/;
          index index.html;
    }
}

如果两者都出现,是怎样的优先级呢?

简单的来说,就是 就近原则,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,当 location 中匹配不到的时候,则使用 server 中的 root 配置。

nginx欢迎页

我们从默认配置文件可以看到Nginx的默认监听80端口,浏览器访问不加端口号默认访问的为80端口,所以当访问 http://ip 或者 http://ip:80 的时候,返回的是 /html/index.html 欢迎页。

本文参考文章

Nginx的的目录结构,基本运行原理及基本配置文件
Nginx Location配置详解

Nginx相关文章

1 初学Nginx要掌握哪些概念

2 Linux安装Nginx详细教程

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

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

相关文章

docker-compose编排容器

系列文章目录 文章目录 系列文章目录一、docker-compose1.Docker Compose2.YAML 文件格式及编写注意事项3.安装docker-compose4.Docker Compose配置常用字段 二、创建compose1.准备依赖文件2. 总结 一、docker-compose 1.Docker Compose 如果需要定义多个容器就需要服务编排。…

priority_queue的模拟实现

前言 优先级队列听名字好像与队列有关,但是实际上,与队列没有很多关系,它也是容器适配器,是通过vector来适配的,但是里面又加入了堆的调整算法。跟栈和队列又有一些不同,了解它的实现对于我们更好的掌握它是…

新手上路,安全驾驶,做行车安全的第一责任人

目录 一、生活与汽车二、树立安全意识三、掌握驾驶经验四、参考材料 道路千万条,安全第一条,行车不规范,亲人两行泪。 ——《流浪地球》 一、生活与汽车 开车是为了节省在路途上花费的时间,片面的追求交通效率会引发交通安全问题&…

day8 栈顶的种类与应用

目录 多寄存器访问指令与寻址方式 多寄存器内存访问指令 多寄存器内存访问指令的寻址方式 ​编辑 栈的种类与使用 栈的概念 栈的分类 栈的应用举例 叶子函数的调用过程举例 多寄存器访问指令与寻址方式 多寄存器内存访问指令 MOV R1, #1 MOV R2, #2 MOV R3, #3 MOV R…

Redis 持久化存储机制:RDB 和 AOF

Redis(Remote Dictionary Server)是一个高性能的键值存储系统,它可以将数据存储在内存中以实现快速访问。为了保持数据的持久性,Redis 提供了两种数据持久化方法:RDB 和 AOF。 RDB(Redis Database&#xff…

spring源码-代码的特殊写法

spring源码-代码的特殊写法 前言 在阅读spring源码中,可能会有很多种代码写法在工作中都没遇见过,阅读起来有一定的难度,在本文中,我会把我认为有难度的代码写法拿出来,并举例子说明清楚,方便大家阅读并理…

股价暴涨59%后,美股二手车平台Carvana在短期内还会进一步上涨?

来源:猛兽财经 作者:猛兽财经 Carvana(CVNA)股票在财报发布近一个月后又重新开始出现了上涨。 仅6月9日就上涨了59%。 相对于纳斯达克综合指数的上涨幅度,Carvana今年迄今为止的上涨幅度已经比纳斯达克综合指数高出了约400%。 Carvana最…

RabbitMQ - 死信队列,延时队列

Time-To-Live and Expiration — RabbitMQ 一、死信队列 Dead Letter Exchanges — RabbitMQ 死信队列: DLX 全称(Dead-Letter-Exchange),称之为死信交换器,当消息变成一个死信之后,如果这个消息所在的队列存在x-d…

全球、全国遥感土地利用数据产品下载(1m、10m、30m分辨率,内含链接与详细教程)

土地利用/覆被数据能够获取地表覆被信息,同时也是地球系统科学学科的基础数据(如生态、水文、地质等)吗,目前,基于遥感生成的土地利用/覆被数据产品比较多样,本文整理了目前应用比较多的7种数据产品进行介绍…

Hazel游戏引擎(007)Premake

文中若有代码、术语等错误,欢迎指正 文章目录 前言操作步骤premake写lua脚本文件执行premake.exe文件效果 前言 此节目的 由于之前配置VS项目各项属性需要根据不同平台手动一个一个设置,很麻烦,缺乏灵活性。 用lua脚本配置项目属性&#xff0…

基于Java+SpringBoot的鞋类商品购物商城系统设计与实现

博主介绍:✌擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案…

业务部门的通病:想搞了大而全的软件

业务部门的通病:想搞个大而全的软件 怎么样评价软件功能的价值重要性? 软件的消耗成本是惊人的 中小企业一定要约束需求 做SaaS的香港上市公司有赞(做商城软件) 10年了还在亏损 趣讲大白话:大而全的功能是陷阱 【趣讲信…

Geek-PC项目 文档

一款后台管理项目 - React-geek-PC 项目介绍 ● 项目功能演示 - 登录、退出 - 首页 - 内容(文章)管理:文章列表、发布文章、修改文章● 技术 - React 官方脚手架 create-react-app - react hooks - 状态管理:mobx - UI 组件库…

ESP32网络应用 -- ESP32-S3在STA模式下创建TCP-CLIENT应用程序

在ESP32-S3初始化为Station模式并且成功获取IP地址后,说明ESP32-S3芯片的底层设施已经具备Wi-Fi网络通信能力,但在实际的应用场景里面,仅仅建立数据链路层,还是不能够满足应用程序的数据通信需求。 TCP/IP是一种使用广泛的网络传输协议,网络上并不缺乏关于TCP/IP的具体原…

Atcoder Beginner Contest 304——A-D题讲解

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提! Hello, 大家好哇!本初中生蒟蒻讲解一下AtCoder Beginner Contest 304这场比赛的A-D题! A - First Player 题目描述 Problem Statement There are N N N people nu…

sequence2sequence

1. 基本模型 所谓的Seq2seq模型从字面上理解很简单,就是由一个序列到另一个序列的过程(比如翻译、语音等方面的应用): 那么既然是序列模型,就需要搭建一个RNN模型(神经单元可以是GRU模型或者是LSTM模型) 下面两篇文章提出了这样的seq2seq的模…

NVM安装教程

我是小荣,给个赞鼓励下吧! NVM安装教程 简介 nvm 是node.js的版本管理器,设计为按用户安装,并按 shell 调用。nvm适用于任何符合 POSIX 的 shell(sh、dash、ksh、zsh、bash),特别是在这些平台…

ChatGPT 五个写论文的神技巧,让你的老师对你刮目相看!

导读:ChatGPT这款AI工具在推出两个月内就累积了超过1亿用户。我们向您展示如何使用ChatGPT进行写作辅助,以及其他一些有用的写作技巧。 本文字数:2000,阅读时长大约:12分钟 ChatGPT这款AI工具在推出两个月内就累积了超…

【Java|golang】2460. 对数组执行操作

给你一个下标从 0 开始的数组 nums ,数组大小为 n ,且由 非负 整数组成。 你需要对数组执行 n - 1 步操作,其中第 i 步操作(从 0 开始计数)要求对 nums 中第 i 个元素执行下述指令: 如果 nums[i] nums[i…

物联网Lora模块从入门到精通(三)按键的读取与使用

一、前言 在Lora例程中,为我们提供了三个按键标志位,我们不需要手动再次初始化按键,即可完成按键的读取。 二、代码实现 首先,我们一起来阅读hal_key.c中的代码: /* Includes -------------------------------------…