nginx------HTTP模块配置详解
Nginx 的 server
配置块是 Nginx 配置文件中的一个关键部分,用于定义虚拟主机。每个 server
块可以包含多个 location
块和其他指令,以处理特定的请求。下面是对 server
配置块的详细解释:
一 server
配置块的基本结构
http {# 其他全局配置server {# 服务器配置}# 可以有多个 server 块
}
二 server
配置块中的常见指令
1. listen
- 功能:指定 Nginx 监听的端口和 IP 地址。
- 示例:
listen 80; # 监听所有接口的 80 端口 listen 192.168.1.1:80; # 监听特定 IP 地址的 80 端口
2. server_name
- 功能:指定该虚拟主机处理哪些域名。
- 示例:
server_name example.com www.example.com;
3. root
和 alias
root
:设置网站根目录。- 示例:
root /var/www/html;
- 示例:
alias
:为特定位置设置别名。- 示例:
location /images/ {alias /data/images/; }
- 示例:
生产常用技巧:
防止意外的目录遍历
使用 alias 的安全性
alias 指令通过替换请求 URI 的部分来直接映射到文件系统中的一个特定目录。这种方式可以有效防止目录遍历攻击,因为它不会保留 URI 中的路径结构。
示例:
假设你有以下目录结构:
/var/www/
├── static
│ └── logo.png
└── images
└── banner.jpg
配置如下:
server {
listen 80;
server_name example.com;location /static/ {
alias /var/www/static/;
}location /images/ {
alias /var/www/images/;
}
}
请求 /static/logo.png 会映射到 /var/www/static/logo.png。
请求 /static/../images/banner.jpg 不会被解析为 /var/www/images/banner.jpg,而是会返回 404 错误。
这是因为 alias 会将 /static/ 替换为 /var/www/static/,而不会保留 URI 中的其他部分。因此,/static/../images/banner.jpg 实际上会被解析为 /var/www/static/../images/banner.jpg,这在文件系统中是无效的路径,Nginx 会返回 404 错误。
使用 root 的潜在风险
root 指令将请求的 URI 附加到 root 指定的路径后面。这种方式可能会导致目录遍历攻击,因为 URI 中的路径结构会被保留。
示例:
假设你有相同的目录结构,并且配置如下:
server {
listen 80;
server_name example.com;location /static/ {
root /var/www/;
}location /images/ {
root /var/www/;
}
}
请求 /static/logo.png 会映射到 /var/www/static/logo.png。
请求 /static/../images/banner.jpg 会被解析为 /var/www/static/../images/banner.jpg,这在文件系统中是有效的路径,指向 /var/www/images/banner.jpg。
这种情况下,恶意用户可以通过构造特定的 URL 来访问服务器上的其他文件,从而可能导致敏感信息泄露或其他安全问题。如何防止目录遍历攻击
即使使用 root 指令,也可以通过一些额外的配置来防止目录遍历攻击。以下是一些常用的方法:使用 try_files 指令:
location /static/ {
root /var/www/;
try_files $uri =404;
}
这样,如果请求的文件不存在,Nginx 会返回 404 错误,而不是尝试访问其他路径。
使用 internal 关键字:
location /internal/ {
internal; # 只允许内部重定向
root /var/www/internal/;
}
这样,只有内部重定向(如 rewrite 或 proxy_pass)才能访问这个位置,外部请求会被拒绝。
限制访问的文件类型:
location /static/ {
root /var/www/;
if ($request_uri ~* \.(php|pl|py|sh|cgi)$) {
return 403;
}
}
这样,可以防止访问特定类型的文件,例如脚本文件。
使用 location 块进行更精细的控制:
location /static/ {
root /var/www/;
location ~* \..*/.*\.php$ { # 匹配以 . 开头的路径并包含 .php 的请求
deny all;
}
}
4. index
- 功能:指定默认的索引文件。
- 示例:
index index.html index.htm;
5. location
- 功能:根据 URL 路径匹配不同的配置。
- 示例:
location / {# 处理根路径 }location /api/ {# 处理 /api/ 路径下的请求 }location ~ \.php$ {# 处理 PHP 文件 }
6. proxy_pass
- 功能:将请求反向代理到后端服务器。
- 示例:
location /api/ {proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; }
7. fastcgi_pass
- 功能:将请求传递给 FastCGI 服务器(如 PHP-FPM)。
- 示例:
location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;include fastcgi_params; }
8. error_page
- 功能:自定义错误页面。
- 示例:
error_page 404 /404.html; location = /404.html {internal; }
9. access_log
和 error_log
access_log
:记录访问日志。- 示例:
access_log /var/log/nginx/access.log main;
- 示例:
error_log
:记录错误日志。- 示例:
error_log /var/log/nginx/error.log warn;
- 示例:
10. client_max_body_size
- 功能:设置客户端请求的最大主体大小。
- 示例:
client_max_body_size 10m; # 设置最大上传文件大小为 10MB
完整的 server
配置块示例
以下是一个完整的 server
配置块示例,展示了如何配置一个简单的 Web 服务器,并处理静态文件、PHP 文件以及反向代理到后端 API 服务。
http {include /etc/nginx/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 /var/log/nginx/access.log main;error_log /var/log/nginx/error.log warn;sendfile on;keepalive_timeout 65;# 虚拟主机配置server {listen 80;server_name example.com www.example.com;# 根目录root /var/www/html;index index.html index.htm;# 处理静态文件location / {try_files $uri $uri/ =404;}# 处理 PHP 文件location ~ \.php$ {include snippets/fastcgi-php.conf;fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;}# 反向代理到后端 API 服务location /api/ {proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}# 自定义错误页面error_page 404 /404.html;location = /404.html {internal;}}
}
解释
- 监听 80 端口:
listen 80;
- 处理域名:
server_name example.com www.example.com;
- 根目录:
root /var/www/html;
- 默认索引文件:
index index.html index.htm;
- 处理静态文件:
location / { try_files $uri $uri/ =404; }
- 处理 PHP 文件:
location ~ \.php$ { ... }
- 反向代理到后端 API 服务:
location /api/ { ... }
- 自定义 404 错误页面:
error_page 404 /404.html;
三 nginx server块匹配顺序
在 Nginx 中,server
块的匹配顺序是基于请求的 Host
头和监听端口进行的。Nginx 会按照一定的规则来决定哪个 server
块应该处理当前的请求。以下是详细的匹配顺序和规则:
1. 监听端口匹配
首先,Nginx 会根据请求的端口号来选择合适的 server
块。例如,如果客户端请求的是 80 端口,那么 Nginx 会查找所有 listen 80;
的 server
块。
2. server_name
匹配
在找到合适的端口后,Nginx 会进一步根据 Host
头(即 server_name
)来选择具体的 server
块。server_name
的匹配顺序如下:
-
精确匹配:
- 首先检查是否有完全匹配的
server_name
。 - 例如,如果
server_name
是example.com
,并且请求的Host
头也是example.com
,则这个server
块会被选中。
- 首先检查是否有完全匹配的
-
通配符匹配:
- 如果没有精确匹配,Nginx 会检查是否有以通配符开头或结尾的
server_name
。 - 例如,
server_name *.example.com
会匹配sub.example.com
。 server_name example.*
会匹配example.com
和example.net
。
- 如果没有精确匹配,Nginx 会检查是否有以通配符开头或结尾的
-
正则表达式匹配:
- 如果没有精确匹配或通配符匹配,Nginx 会检查是否有使用正则表达式的
server_name
。 - 例如,
server_name ~^(www\.)?example\.com$
会匹配example.com
和www.example.com
。
- 如果没有精确匹配或通配符匹配,Nginx 会检查是否有使用正则表达式的
-
默认服务器:
- 如果以上都没有匹配到,Nginx 会选择一个默认的
server
块。 - 默认的
server
块是在指定端口上第一个定义的server
块,或者显式指定了default_server
参数的server
块。 - 例如:
server {listen 80 default_server;server_name _;# 其他配置 }
- 如果以上都没有匹配到,Nginx 会选择一个默认的
示例配置
假设你有以下 Nginx 配置文件:
http {# 第一个 server 块server {listen 80;server_name example.com;root /var/www/example;location / {try_files $uri $uri/ =404;}}# 第二个 server 块server {listen 80;server_name www.example.com;root /var/www/www_example;location / {try_files $uri $uri/ =404;}}# 第三个 server 块server {listen 80 default_server;server_name _;root /var/www/default;location / {try_files $uri $uri/ =404;}}# 第四个 server 块server {listen 80;server_name *.example.com;root /var/www/wildcard;location / {try_files $uri $uri/ =404;}}# 第五个 server 块server {listen 80;server_name ~^(www\.)?example\.com$;root /var/www/regex;location / {try_files $uri $uri/ =404;}}
}
请求示例
-
请求
http://example.com/
:Host
头为example.com
,精确匹配第一个server
块。- 使用
/var/www/example
作为根目录。
-
请求
http://www.example.com/
:Host
头为www.example.com
,精确匹配第二个server
块。- 使用
/var/www/www_example
作为根目录。
-
请求
http://sub.example.com/
:Host
头为sub.example.com
,匹配第四个server
块(通配符匹配)。- 使用
/var/www/wildcard
作为根目录。
-
请求
http://example.net/
:Host
头为example.net
,没有任何匹配项,选择默认服务器(第三个server
块)。- 使用
/var/www/default
作为根目录。
-
请求
http://www.sub.example.com/
:Host
头为www.sub.example.com
,正则表达式匹配第五个server
块。- 使用
/var/www/regex
作为根目录。
四 nginx location块匹配顺序
在 Nginx 中,location
块的匹配顺序是基于请求 URI 的,并且遵循一定的优先级规则。Nginx 会按照特定的顺序来选择最合适的 location
块来处理请求。以下是 location
块的匹配顺序和规则:
1. 精确匹配
- 优先级最高:如果请求的 URI 完全匹配某个
location
块中的字符串,则该location
块会被选中。 - 示例:
location = /exact {# 处理精确匹配 /exact 的请求 }
2. 前缀匹配
- 普通前缀匹配:如果请求的 URI 以某个
location
块中的字符串开头,则该location
块会被选中。 - 示例:
location /prefix/ {# 处理以 /prefix/ 开头的请求 }
3. 正则表达式匹配
- 优先级较低:Nginx 会检查所有正则表达式
location
块,按配置文件中的顺序进行匹配。第一个匹配成功的location
块会被选中。 - 示例:
location ~ /regex/ {# 处理匹配正则表达式 /regex/ 的请求 }
4. 特殊前缀匹配
- 带有
^~
的前缀匹配:如果请求的 URI 以某个location
块中的字符串开头,并且该location
块使用了^~
,则该location
块会被选中,即使后面有更具体的正则表达式匹配。 - 示例:
location ^~ /special-prefix/ {# 处理以 /special-prefix/ 开头的请求,忽略后面的正则表达式匹配 }
匹配顺序总结
- 精确匹配 (
=
):优先级最高,完全匹配 URI。 - 特殊前缀匹配 (
^~
):次高优先级,匹配 URI 前缀,并忽略后续的正则表达式匹配。 - 普通前缀匹配:匹配 URI 前缀,但会被后续的正则表达式匹配覆盖。
- 正则表达式匹配 (
~
或~*
):按配置文件中的顺序进行匹配,第一个匹配成功的location
块被选中。
示例配置
假设你有以下 Nginx 配置文件:
server {listen 80;server_name example.com;# 精确匹配location = /exact {root /var/www/exact;}# 普通前缀匹配location /prefix/ {root /var/www/prefix;}# 特殊前缀匹配location ^~ /special-prefix/ {root /var/www/special_prefix;}# 正则表达式匹配location ~ /regex/ {root /var/www/regex;}# 默认 locationlocation / {root /var/www/default;}
}
请求示例
-
请求
http://example.com/exact
:- 精确匹配
location = /exact
。 - 使用
/var/www/exact
作为根目录。
- 精确匹配
-
请求
http://example.com/prefix/somefile.html
:- 普通前缀匹配
location /prefix/
。 - 使用
/var/www/prefix
作为根目录。
- 普通前缀匹配
-
请求
http://example.com/special-prefix/somefile.html
:- 特殊前缀匹配
location ^~ /special-prefix/
。 - 使用
/var/www/special_prefix
作为根目录。
- 特殊前缀匹配
-
请求
http://example.com/regex/somefile.html
:- 正则表达式匹配
location ~ /regex/
。 - 使用
/var/www/regex
作为根目录。
- 正则表达式匹配
-
请求
http://example.com/otherfile.html
:- 默认
location /
。 - 使用
/var/www/default
作为根目录。
- 默认
相关文章:
nginx------HTTP模块配置详解
Nginx 的 server 配置块是 Nginx 配置文件中的一个关键部分,用于定义虚拟主机。每个 server 块可以包含多个 location 块和其他指令,以处理特定的请求。下面是对 server 配置块的详细解释: 一 server 配置块的基本结构 http {# 其他全局配置…...

听见文本的魅力:AI 与未来的语音交互
AI 与未来的语音交互 引言什么是文本转语音(TTS)?当前 TTS 技术现状国内海外文本转语音能力调研文本转语音能力说明多情感风格SSML语音合成标记语言 未来趋势 引言 随着人工智能(AI)技术的迅猛发展,文本转…...
Qt 窗口可见性 之 close函数和hide函数
close函数 基本功能 close() 方法的主要功能是关闭窗口,并触发一系列与关闭相关的事件和信号。调用此方法后,窗口将不再可见,但窗口对象本身仍然存在,并且可以被再次显示(通过调用 show() 方法)。 事件处…...
git bisect和git blame
1.用 git bisect 找到出错的commit 设置开始,最新的一个已知的错误的commit和第一个已知的正确的commit,通过二分法,找出第一个出错的commit。 二分查找法(binary search method)或二分法(bisection meth…...
【面试题】Node.JS篇
1. 什么是Node.js?它的主要特点是什么?适用于哪些场景? Node.js 是一个基于Chrome V8引擎的JavaScript运行时环境,它允许JavaScript代码在服务器端运行。Node.js的主要特点是事件驱动、非阻塞I/O模型,这使得它非常适合处理高并发请求和实时应用。它适…...

Leetcode11:盛水最多的容器
原题地址:. - 力扣(LeetCode) 题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳…...
php如何对海量数据进行基数统计
在PHP中,对海量数据进行基数统计通常可以使用布隆过滤器(Bloom Filter)或者Count-Min Sketch算法。以下是使用Count-Min Sketch算法的一个简单示例: class CountMinSketch {private $rows;private $columns;private $values;publ…...
git命令报错:fatal: not a git repository (or any of the parent directories): .git
当你执行 Git 命令时遇到错误信息 "fatal: not a git repository (or any of the parent directories): .git",这表明你当前所在的目录不是一个 Git 仓库,或者你的工作目录不在 Git 仓库的根目录下。以下是一些解决这个问题的步骤:…...

如何通过sip信令以及抓包文件分析媒体发到哪个地方
前言 问题描述:A的媒体没转发到B,B只能听到回铃音,没有A的说话声音,并且fs这边按正常的信令发送了. 分析流程 分析早期媒体发送到哪一个IP 10.19.0.1发送了一个请求给10.19.0.157这个IP,然而这里的SDP媒体地址&am…...

【网络安全零基础入门】一文搞懂Javascript实现Post请求、Ajax请求、输出数据到页面、实现前进后退、文件上传
文章目录 一、Javascript原生post请求写法二、原生JS封装Ajax请求三、JS里的值或内容输出到HTML网页中四、Javascript页面后退前进刷新示例五、Javascript实现文件上传👉1.成长路线图&学习规划👈👉2.网安入门到进阶视频教程👈…...

NVR管理平台EasyNVR多个NVR同时管理综合应用方案
为了推动应急管理能力的现代化,应急管理部提出了加速现代信息技术与应急管理业务深度融合的宏伟蓝图。这一计划不仅是国家加强和改进应急管理工作的战略重点,也是应对当前应急管理形势的严峻挑战和满足人民群众对公共安全需求的必要举措。 为了实现应急管…...

SpringBoot核心框架之AOP详解
SpringBoot核心框架之AOP详解 一、AOP基础 1.1 AOP概述 AOP:Aspect Oriented Programming(面向切面编程,面向方面编程),其实就是面向特定方法编程。 场景:项目部分功能运行较慢,定位执行耗时…...
Linux: network: ifconfig已经过时,建议使用ip addr相关命令
最近有一个同事在问网络的问题,在debug的过程中还在使用ifconfig命令查看IP的相关信息。 但是这个ifconfig已经不推荐使用了,最好使用ip 相关的命令做操作。 有些信息使用ifconfig显示不出来 ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500ine…...
Flutter 鸿蒙next中的路由使用详解【基础使用】
✅近期推荐:求职神器 https://bbs.csdn.net/topics/619384540 🔥欢迎大家订阅系列专栏:flutter_鸿蒙next 💬淼学派语录:只有不断的否认自己和肯定自己,才能走出弯曲不平的泥泞路,因为平坦的大路…...

基于SSM+小程序民宿短租管理系统(民宿1)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序民宿短租管理系统实现了管理员、用户及房主 1、管理员可以管理民宿信息和订单信息用户管理、房主管理、房间类型管理、预定管理等。 2、房主可以管理自己的民宿和订单 3、…...
SQL LIKE 操作符
SQL LIKE 操作符 在SQL中,LIKE 操作符用于在查询中搜索列中的特定模式。它通常与 % 和 _ 通配符一起使用,分别代表任意数量的字符和单个字符。LIKE 操作符在数据过滤和模式匹配方面非常有用,尤其是在处理大量文本数据时。 LIKE 操作符的基本…...

七款主流图纸加密软件强力推荐|2024年CAD图纸加密保护指南
在当今信息化的设计行业,保护CAD图纸的知识产权和数据安全变得尤为重要。随着越来越多的企业采用数字化设计和共享文件,如何防止CAD图纸被未经授权的访问和窃取成为了许多设计师和企业关注的焦点。为此,选用合适的图纸加密软件是保护CAD文件安…...

【STM32】单片机ADC原理详解及应用编程
本篇文章主要详细讲述单片机的ADC原理和编程应用,希望我的分享对你有所帮助! 目录 一、STM32ADC概述 1、ADC(Analog-to-Digital Converter,模数转换器) 2、STM32工作原理 二、STM32ADC编程实战 (一&am…...

C# 委托简述
1.委托 1.1什么是委托 委托委托 官网解释: 委托是安全封装方法的类型,类似于 C 和 C 中的函数指针。 与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。 个人理解:委托就是一个方法的模板。它可以接收…...

瑞吉外卖项目
目录 Day01业务开发 一、项目总体介绍与展示 二、软件开发整体介绍 (一)软件开发流程 三、瑞吉外卖项目介绍 (一)项目介绍 (二)技术选型功能架构 1.技术选型—— 编辑2.功能架构—— 编辑 &a…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...