Nginx——基础配置
和大多数软件一样,Nginx也有自己的配置文件,但它又有很多与众不同的地方,本帖就来揭开Nginx基础配置的面纱。
1、Nginx指令和指令块
了解指令和指令块有助于大家了解配置的上下文,下面是一个配置模板示例:

在这个配置模板中主要包含两种指令:
- 简单指令:由名称和参数组成,以空格分隔,以分号结尾。上述示例中的Main 1、Main 2、Main 3就是简单指令。
- 指令块:由名称和大括号{}内的附加指令组成,不以分号结尾。
在前面的配置示例中,http块是全局参数,对整体产生影响;server块是虚拟主机,主要对指定的主机和端口进行配置;location块在虚拟主机下根据请求URI(Uniform Resource Identifier,统一资源标识符)进行配置,URI即去掉参数后的URL。
简单指令在指令块中的配置存在一定的区段。有些简单指令不能在某些指令块中使用;而有些简单指令既可以在http块也可以在server块中配置,甚至可以在location块中配置。当某个变量同时出现在多个指令块中时,最终会以在最小指令块中的赋值为准。
例如,如果在location中设置expires为1m,那么expires就会使用location中的设置;如果没有在location中设置expires,那么expires的值则会使用http块中的1d。这有点类似于编程语言里的变量。

2、Nginx基本配置说明
对指令和指令块有了初步了解之后,下面将根据前面的配置示例,对Nginx的指令块进行逐一说明,以帮助大家理解每个指令块的作用。
2.1、main配置
在http块之前的配置是全局参数,如前面配置示例中的Main 1,全局参数对整个Nginx块都产生作用。下面是一个简单示例:

2.2、与客户端有关的配置
与客户端有关的配置主要在http块中设置,如前面配置中的指令Main 1和server块之间的Main 2就是对客户端进行的配置,其作用是处理与客户端相关的信息。客户端配置常用的指令见下表:

很多指令都可以在多个Main中配置,但不是所有的指令都可以出现在2.1节的配置中的Main 1、Main 2和Main 3里面。例如client_body_timeout可以在http、server、location块中设置,但server_names_hash_bucket_size却只能出现在http块中。
上表中的指令和客户端的请求操作有直接关系,熟悉这些指令对配置和优化Nginx有很大的帮助。
2.3、server块
server块即虚拟主机部分,如果请求中的Host头和server_name相匹配,则将请求指向对应的server块,示例如下:

server_name支持使用通配符正则表达式,支持配置多域名、服务名称。当有多个server块时,会存在匹配的优先级问题,优先级顺序如下:
1.精确的名字;
2.以开头的最长通配符名称,如.testnginx.com;
3.以结尾的最长通配符名称,如testnginx.;
4.按照文件顺序,第1个匹配到的正则表达式;
5.如果没有匹配到对应的server_name,则会访问default_server。
2.4、location块
location块在server块中使用,它的作用是根据客户端请求URL去定位不同的应用。即当服务器接收到客户端请求之后,需要在服务器端指定目录中去寻找客户端所请求的资源,这就需要使用请求URL匹配对应的location指令。下表是URL在location块中的匹配规则说明:

上表中匹配的优先级顺序为如下:
“=”优先级最高,如果“=”匹配不到,会和“^~”进行匹配;继而是“~”,如果有多个“~”,则按照在文件里的先后顺序进行匹配;如果还匹配不到,则与“/uri”进行匹配;通用匹配“/”的优先级最低,如果找不到其他配置,就会进行通用匹配;“@”表示命名空间的位置,通常在重定向时进行匹配,且不会改变URL的原始请求。
建议:打开Debug模式并观察日志,会看到每个请求的执行过程,包括匹配到对应location的操作。
location块也支持嵌套配置:

有些指令只能在location块中执行,主要有如下3个:
- internal:表示该location块只支持Nginx内部的请求访问,如支持rewrite、error_page等重定向,但不能通过外部的HTTP直接访问。
- limit_except:限定该location块可以执行的HTTP方法,如GET。
- alias:定义指定位置的替换,如可以使用以下配置。

上述配置表示如果匹配到/a/test.json的请求,在进入 location块后,会将请求变成/c/x/a/test.json。
3、include的使用
include用来指定主配置文件包含的其他扩展配置文件。扩展文件的内容也要符合Nginx的格式规范。include可以简化主配置文件,使之更易于读取。include可以出现在全局参数、location块、server块等任何一个位置。
include支持通配符,例如下面的配置会将后缀是.conf的所有文件都加载到Nginx配置中:

因此,可以将Nginx配置成多个文件,并提取出相同的数据,从而精简配置,方便管理。
4、常见配置
前面的介绍了Nginx中的main指令、server块、location块、include,以及与客户端相关的一些配置知识,本节将进一步介绍Nginx常见的配置及其实战技巧。
4.1、常见配置注解


4.2、常见配置实战技巧
学完常见配置的注解,相信大家已经对Nginx配置有了基本的认识。但在实际应用中,Nginx配置可以通过巧妙的变化实现不同的功能,下面将会讲解在实战中应如何进行合理的配置。
- user:默认是nobody,但如果使用nobody,会导致没有权限执行写硬盘等操作。所以一般会选择低于root级别的用户,如www,并在Linux系统下禁止用户通过SSH(Secure Shell,远程连接工具)登录服务器,以提高安全性。
- worker_processes:代表worker的进程数,一般情况下建议和服务器的CPU(Central Processing Unit,中央处理器)核数相同;也可以配置worker_processes auto(用于Nginx 1.2.5版本之后),它会自动根据CPU核数启动进程。但在实际应用中,可能除Nginx外服务器还会同时运行其他多个服务,所以需要考虑服务器资源在不同服务上的分配,避免因进程启动过多导致过多的上下文切换。
- worker_cpu_affinity auto:这是在Nginx 1.9.10版本中添加的功能,表示可以根据服务器的CPU核数自动设置CPU亲缘性,以提升Nginx的性能。
- error_log & access_log:关于日志记录的配置。如果将error_log配置为error级别,可以减少不必要的日志记录;如果是测试环境可以设置为info级别。配置日志记录需要考虑硬盘的独立性,不要使用Linux的根分区,以避免出现大量的I/O影响Linux服务器的吞吐能力;要单独挂载到一个磁盘上,使用独立的I/O。另外,需要注意硬盘的使用寿命,关注message的日志,定期检查硬盘(Nginx在记录日志时是异步处理的,因此不会因为硬盘问题导致请求异常,但会影响日志的记录)。
- worker_priority:配置Nginx在Linux服务器上使用资源的优先级,作为反向代理服务,Nginx应该拥有极高的优先级,因此建议配置为-10。
- gzip_comp_level:配置压缩等级,等级最高为9,等级越高压缩后的文件越小,但是消耗的CPU资源,也会越多。经测试,文件压缩等级为7和等级为9时,在文件大小上只有细微的差别,一般用5~7的等级就可以了。
- upstream块:配置后端服务器,可以结合 proxy_next_upstream等指令进行大量的优化。
- error_page:对错误进行重定向,在捕获后端服务器错误的状态码后,将请求重定向到其他位置,如友好提示页面。
- location & root:通过root路径可以读取静态文件,在Nginx 1.7.11版本之前,当Nginx读取硬盘文件时,都是进行阻塞型操作;后来引入了线程池,为读取硬盘文件提供了非阻塞型的操作,极大地提升了硬盘I/O的读/写速度,也提升了proxy_cache的缓存能力。
Nginx的常见配置在使用中有着不同的变化,熟悉Nginx的官方Wiki是发挥其巨大作用的前提。
5、内置变量
在客户端请求过程中,Nginx提供了内置变量来获取HTTP或TCP的信息。充分了解这些内置变量,才能够对应用场景中的业务进行合理的配置,下面先来熟悉一下常见的内置变量。
注意:Nginx 1.9之后的版本开始支持TCP代理,这使Nginx的功能更为丰富(后面会有单独的介绍和案例示范)。本书默认以HTTP代理为例进行讲解,中间涉及TCP的地方会有特别说明。
5.1、常见内置变量


注意:随着Nginx版本的不断更新,会出现更多新的指令,更多与Nginx内置变量有关的解释可参考Nginx 官方Wiki。
5.2、常见内置变量实战技巧
Nginx的内置变量主要用于日志记录和分析,以及业务逻辑的处理。下面将介绍一些常用内置变量的配置方式。
1、$arg_name:

上述代码的请求默认路径是http://a,如果URL中的参数是at=5,则路径变为http://b。
2、 $body_bytes_sent和$bytes_sent:
这两个变量的值之差就是HTTP 响应头的大小。如果两个值相差悬殊,那么响应头就很大,需要确保proxy_buffer设置了合适的大小,因为如果超过proxy_buffer设置的值,error.log就会显示如下内容:

3、$realip_remote_addr:
在Nginx 1.9.7版本以后加入ngx_http_realip_module的变量,此变量可以获取用户的IP地址(如常见的代理或CDN的节点IP地址)。
4、$request_time和$upstream_response_time:
$upstream_response_time指的是在Nginx启用了upstream的情况下,从Nginx与后端建立连接开始到接收完数据然后关闭连接为止的时间。$request_time指从接收到用户请求到发送完响应数据的时间,包括接收请求数据的时间、程序响应的时间和输出响应数据的时间。如果要检查后端服务的性能,需要使用$upstream_response_time的值。
5、$uri和$request_uri:
$uri记录的是执行一系列内部重定向操作后最终传递到后端服务器的URL(不包含参数$args的值)。
$request_uri记录的是当前请求的原始URL(包含参数),如果没有执行内部重定向操作,$request_uri去掉参数后的值和$uri的值是一样的。在线上环境中排查问题时,如果在后端服务中看到的请求和在Nginx中存放的$request_uri无法匹配,可以考虑去 $uri里面进行查找。
6、$scheme:
近几年来,HTTPS非常流行,很多互联网企业都把HTTP切换成了HTTPS,但是当用户手动输入网站地址时,很少会主动加上https://。为了让用户的请求能够顺利跳转到HTTPS,首先需要判断用户输入的是HTTP还是HTTPS。$scheme就具有此功能,如果用户输入的是HTTP可以通过重定向跳转到HTTPS,示例代码如下:

相关文章:
Nginx——基础配置
和大多数软件一样,Nginx也有自己的配置文件,但它又有很多与众不同的地方,本帖就来揭开Nginx基础配置的面纱。 1、Nginx指令和指令块 了解指令和指令块有助于大家了解配置的上下文,下面是一个配置模板示例: 在这个配…...
计算机基础(存储单位)
1. 计算机中的存储单位有哪些 1.1 常见的计算机存储单位 计算机存储单位一般用bit、B、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB……来表示,如下所示: bit位、比特byte(B)字节、字Kill Byte(KB)千字…...
Leetcode 494 目标和
题意理解: 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums [2, 1] ,可以在 2 之前添加 ,在 1 之前添…...
Windows常用命令(文件相关、进程相关、网络相关、用户相关、特殊符号)
Windows常用命令 Windows常用命令 Windows常用命令0x01 基础操作0x02 文件操作0x03 进程操作0x04 网络相关0x05 用户相关0x06 特殊符号 0x01 基础操作 清屏:cls 关机:shutdown -s(关机)-r(重启) -f(强制)…...
摘:国六排放法规下的重型车车载终端的革新
系列文章目录 文章目录 系列文章目录一、国六排放法规下的重型车车载终端的革新二、使用步骤1.引入库2.读入数据 一、国六排放法规下的重型车车载终端的革新 添加链接描述 ascii码 二、使用步骤 1.引入库 代码如下(示例): import numpy a…...
java读取json文件并解析并修改
要在Java中读取和解析JSON文件,可以使用Java提供的JSON库,例如Jackson、Gson或JSON.simple。以下是使用Jackson库的示例代码: 首先,你需要添加Jackson库的依赖到你的项目中。如果你正在使用Maven,可以在pom.xml文件中…...
2024年前端面试中JavaScript的30个高频面试题之基础知识
中级 高级知识 充分准备你的下一个JavaScript面试,增强信心! 无论你是老手还是刚进入技术行业,这份2024年必备资源都将帮助你复习核心概念,从基本语言特性到高级主题。 在本文中,我汇总了30个最关键的JavaScript面试题以及详细的答案和代码示例。 深入探索这宝贵的收藏,以确…...
鸿蒙设备-开发板基础学习(BearPi-HM Micro)
theme: minimalism 每当学习一门新的编程语言或者上手一款新的开发板,在学习鸿蒙设备开发过程中,带大家写的第一个程序,通过这个程序,我们可以对鸿蒙设备开发的整个流程有一个初步的体验。BearPi-HM Micro开发板为例:…...
Oracle导入导出dump
创建目录: create directory *** as /bak; #***名称可以随便命名 需要手工创建/bak,并且此目录oracle用户有读取,目录地址空间要够用。 查看所有目录 select * from DBA_DIRECTORIES;---查询导入导出的目录 导入 impdp ****/**** direc…...
判断vector、string是否存在某个元素
1、string字符串中是否存在某个字符(char) string中find()返回值是字母在母串中的位置(下标索引),如果没有找到,那么会返回一个特别的标记npos。(返回值可以看成是一个int型的数) …...
C语言--结构体详解
C语言--结构体详解 1.结构体产生原因2.结构体声明2.1 结构体的声明2.2 结构体的初始化2.3结构体自引用 3.结构体内存对齐3.1 对齐规则3.2 为什么存在内存对齐3.3 修改默认对⻬数 4. 结构体传参 1.结构体产生原因 C语言将数据类型分为了两种,一种是内置类型…...
外卖骑手与行人之间的非零和博弈
一、背景 自2013年成立以来,美团外卖一直保持着高速增长,通过提供便捷、高效的外卖服务,满足了大量消费者的需求。美团外卖的服务不仅限于基础的送餐服务,还涵盖了多种生活服务,如超市便利、药品配送等,满…...
[AutoSar]基础部分 RTE 06 对runnable的触发和SWC的影响
目录 关键词平台说明一、runnable二、RTE的event2.1Mode类型event2.2周期触发类型2.3 数据交互触发 三、internal runnable value四、专属运行区指定五、per_instance memory 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商T…...
网络层协议及IP编址与IP路由基础华为ICT网络赛道
目录 4.网络层协议及IP编址 4.1.网络层协议 4.2.IPv4地址介绍 4.3.子网划分 4.4.ICMP协议 4.5.IPv4地址配置及基本应用 5.IP路由基础 5.1.路由概述 5.2.静态路由 5.3.动态路由 5.4.路由高阶特性 4.网络层协议及IP编址 4.1.网络层协议 IPv4(Internet Protocol Versi…...
基于stm32f4的蓝牙控制小车
1. 引言 蓝牙的创始人是瑞典爱立信公司,蓝牙技术是一种无限数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。手机之间通过蓝牙实现数据共享成为常理,将手机变为遥…...
基于BP神经网络的租金预测
目录 摘要 BP神经网络参数设置及各种函数选择 参数设置 训练函数 传递函数 学习函数 性能函数 显示函数 前向网络创建函数 BP神经网络训练窗口详解 训练窗口例样 训练窗口四部详解 基于BP神经网络的租金预测 代码下载:基于BP神经网络的租金预测(代码完整,数据齐全)资源-CS…...
C语言学习记录—进阶作业(通讯录文件版本)
通讯录 1. 添加一个函数,在退出通讯录的时候把信息到保存到文件中 2. 添加一个函数,在通讯录打开的时候,可以把文件中的信息加载到通讯录中 contact.h文件 #pragma once #include <string.h> #include <stdio.h> #include <…...
深度学习笔记(四)——TF2构建基础网络常用函数+简单ML分类网络实现
文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 TF2基础常用函数 1、张量处理类 强制数据类型转换: a1 tf.constant([1,2,3], dtypetf.floa…...
GPT function calling v2
原文:GPT function calling v2 - 知乎 OpenAI在2023年11月10号举行了第一次开发者大会(OpenAI DevDays),其中介绍了很多新奇有趣的新功能和新应用,而且更新了一波GPT的API,在1.0版本后的API调用与之前的0.…...
【Golang】IEEE754标准二进制字符串转为浮点类型
IEEE754介绍 IEEE 754是一种标准,用于表示和执行浮点数运算的方法。在这个标准中,单精度浮点数使用32位二进制表示,分为三个部分:符号位、指数位和尾数位。 符号位(s)用一个位来表示数的正负,0表示正数,1表…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
