Nginx02-Nginx虚拟主机介绍、日志介绍、Location规则介绍

目录

  • 写在前面
  • Nginx
    • Nginx处理用户请求流程
    • 虚拟主机
      • 虚拟主机的分类
        • 基于域名的虚拟主机
        • 基于端口的虚拟主机
        • 基于IP的虚拟主机
    • Nginx日志
      • 错误日志
        • 案例
      • 访问日志
        • 访问格式变量
        • 案例
    • Location规则
      • 案例1
      • 案例2
      • Location规则小结

写在前面

这是Nginx第二篇,内容为Nginx处理用户请求流程、虚拟主机、日志简介、Location简介等。
上篇笔记 Nginx01-HTTP简介与Nginx简介(安装、命令介绍、目录介绍、配置文件介绍)

Nginx

Nginx处理用户请求流程

  • DNS解析,域名->IP;
  • TCP三次握手,与对应端口建立连接。
  • 用户的请求报文:
    • GET /index.html
    • HOST: game.test.com
    • User-Agent: Chrome/xxxx
  • Nginx对http请求交给http区域处理。
    • 不同的server{ }区域(子配置文件)处理:
      • 端口
      • 域名:用户的请求将携带HOST,Nginx根据这个HOST和所有配置文件的server_name进行匹配。
      • 匹配成功后,Nginx确定站点目录root和访问定位location,访问对应的location内的文件。
  • Nginx若找到,回复200 OK文件
    • 响应报文:
      • 状态码:
      • server信息
      • 其他信息
      • 文件内容
    • 浏览器处理收到的文件,进行渲染。
  • Nginx若没找到,根据配置的默认站点,进行访问default_server
    • 若没有默认站点,根据子配置文件字母顺序第一个。

虚拟主机

虚拟主机,相当于一个网站,Nginx中的server{}区域实现。
Nginx中,虚拟主机有不同的类型,配置也不同。

虚拟主机的分类

虚拟主机分类说明应用场景
基于域名的虚拟主机不同域名访问不同的站点。生产环境最常用的。用于多域名网站,每个域名对应一个站点。
基于端口的虚拟主机不同端口访问不同的站点。保护,设置特殊端口(1024以上)。用于多站点共用一个IP地址,通过不同端口来区分。
基于IP的虚拟主机不同IP访问不同的站点。保护,用户只能通过某个IP连接进来。用于多站点,每个站点有独立的IP地址,可以提供更好的安全性和隔离性。
基于域名的虚拟主机

不同的域名访问不同的虚拟主机
同一个ip,多个域名,访问不同的界面

Linux不修改hosts文件访问不同的域名
curl -H Host:域名 ip
例子:curl -H Host:bird.test.com 192.168.100.148

# 书写子配置文件
[root@front conf.d]# cat bird.test.com.conf
server {listen 80;server_name bird.test.com;location / {root /app/code/bird/;index index.html;}
}#测试并重启
nginx -t
systemctl reload nginx# 不指定访问文件,报错403
[root@front conf.d]# curl -H Host:bird.test.com 192.168.100.148
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html># 指定访问文件,报错404
[root@front conf.d]# curl -H Host:bird.test.com 192.168.100.148/index.html
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html># 添加index.html后,访问
[root@front conf.d]# echo bird > /app/code/bird/index.html
[root@front conf.d]# curl -H Host:bird.test.com 192.168.100.148/index.html
bird
基于端口的虚拟主机

仅需将server{}中,listen字段的端口号修改即可

# 编写子配置文件
[root@front conf.d]# cat live.test.com.conf
server {listen 8011;  #修改此行server_name live.test.com;location / {root /app/code/live/;index index.html;}
}# 访问
[root@front conf.d]# curl -H Host:live.test.com 192.168.100.148:8011
live
基于IP的虚拟主机

同样修改listen字段,修改为IP:端口的形式
这样就制定了,什么网段能访问这个虚拟主机
若路径错误,会报错 Failed connect to x.x.x.x:yyy; Connection refused

Nginx日志

默认的日志存放是所有虚拟主机在一个日志文件中。
所以可以设置给每个虚拟主机指定一个自己的独立的错误日志和访问日志

日志类型使用建议定义使用
错误日志记录服务器错误信息,有助于故障排查。发生故障时查看,4xx,5xx错误级别。error_log
访问日志记录用户访问信息,如访问时间、访问页面、客户端信息等。记录用户访问行为。access_log

错误日志

  • error_log指定访问日志位置
    • 格式:error_log 文件名 错误日志级别
    • 位置:main , http , mail , stream , server , location
    • 错误日志级别:debug, info, notice, warn, error, crit, alert, emerg(从左往右,信息记录越来越粗糙)

官网: nginx.org/en/docs Modules reference -> Alphabetical index of directives -> error_log

案例
  • 设置让每个虚拟主机有一个自己的独立的错误日志
# 注释主配置文件错误日志
[root@front conf.d]# grep "#error" ../nginx.conf
#error_log  /var/log/nginx/error.log notice;# 在子配置文件中,增加错误日志语句
[root@front conf.d]# cat game.test.com.conf
server {error_log /var/log/nginx/game.test.com-error.log notice;  # 一般添加在server内location外即可listen 80;server_name game.test.com;location / {root /app/code/game/;index index.html;}
}# 检查语法并查看日志文件
[root@front conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@front conf.d]# tree /var/log/nginx/
/var/log/nginx/
└── game.test.com-error.log # 检查语法后,会自动添加对应的errorlog0 directories, 5 files

访问日志

  • log_format 指定访问日志的格式
    • 格式:log_format 格式名字 格式…;
    • 位置:http
  • access_log 指定访问日志路径
    • 格式:access_log 日志位置 格式
    • 位置:http , server , location , if in location , limit_except

在这里插入图片描述

访问格式变量

更多nginx内置变量:http://nginx.org/en/docs/varindex.html

ngx内置变量说明
$remote_addr客户端IP地址
$remote_user用户名(空,进行认证的用户)
$time_local时间(格式:20/Jan/2023:15:04:33 +0800)
$request请求报文的起始行(请求方法、URI、HTTP/1.1)
$statusHTTP状态码
$body_bytes_sent响应给客户的文件大小,响应报文的主体大小(文件大小) 单位字节
$http_referer从哪里跳转,访问到这个网站的。网站运营分析
$http_user_agent客户端代理(浏览器)
$http_x_forwarded_forXFF头,负载均衡器使用,记录用户真实的IP地址
案例
  • 让每个虚拟主机指定自己的独立的访问日志
# 注释主配置文件的访问日志
[root@front conf.d]# grep "access_log" ../nginx.conf
#    access_log  /var/log/nginx/access.log  main;# 编辑子配置文件,添加access_log语句
[root@front conf.d]# cat game.test.com.conf
server {error_log /var/log/nginx/game.test.com-error.log notice;access_log /var/log/nginx/game.test.com-access.log main; # 添加该行,main为accesslog中记录的语句的格式listen 80;server_name game.test.com;location / {root /app/code/game/;index index.html;}
}# 检查语法并查看文件
[root@front conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@front conf.d]# tree /var/log/nginx/
/var/log/nginx/
├── game.test.com-access.log
└── game.test.com-error.log0 directories, 6 files
访问日志说明描述
访问日志进行压缩可以使用gzip压缩访问日志,以节省磁盘空间。压缩后的日志可以通过zcat、zless或zgrep等工具查看。
进行缓存buffer = 32k 先把日志写入到内存中,定期写入到磁盘
定义刷新时间flush=10s, 每10秒,日志缓冲区中的内容会被写入到磁盘,以防止日志丢失

access_log /var/log/nginx/game.test.com-access.log main gzip buffer=32k flush=10s ;

Location规则

  • 在nginx用于匹配用户请求中的uri进行判断

  • 如果用户请求的uri是xxx,则作xxx

  • URL和URI:

    • URL:https://nginx.org/en/docs
    • URI:/en/docs
  • URI就是URL去除域名之后,/后的部分

案例1

域名:buy.test.com
站点目录:/app/code/buy
后台管理页面:/app/code/buy/admin/index.html
后台只能内网访问

# 编写子配置文件
[root@front conf.d]# cat buy.test.com.conf
server {listen 80;server_name buy.test.com;root /app/code/buy;location / {index index.html;}location /admin/ {allow 192.168.100.0/24; # 仅允许192.168.100.0网段deny all;  # 默认拒绝所有index index.html;}
}# 设置目录并重启
[root@front conf.d]# mkdir -p /app/code/buy/admin
[root@front conf.d]# echo buy > /app/code/buy/index.html
[root@front conf.d]# echo buy-admin > /app/code/buy/admin/index.html[root@front conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@front conf.d]# systemctl restart nginx# 测试
## 访问没有限制的
[root@front conf.d]# curl -H Host:buy.test.com 127.0.0.1
buy## 访问外部有限制,403权限错误
[root@front conf.d]# curl -H Host:buy.test.com http://127.0.0.1/admin/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html># 通过allow的网段访问,正常
[root@front conf.d]# curl -H Host:buy.test.com http://192.168.100.148/admin/
buy-admin

案例2

域名:bird.test.com
网站加速,设置缓存。html、js、css文件缓存一天,图片缓存1h

# 配置子配置文件[root@front conf.d]# cat bird.test.com.conf
server {listen 80;server_name bird.test.com;root /app/code/bird/; # 每个location区域都是独立的,如果root写在location内,则在指定缓存时的location中也要添加上rootlocation / {index index.html;#root /app/code/bird/;}
#uri 包含 html、js、css 结尾的文件缓存一天
#~* 后支持正则表达式location ~* \.(html|js|css)$ {expires 1d;}location ~* \.(jpg|jpeg|png|gif|bmp)$ {expires 1h;}
}

Location规则小结

location规则说明
location / {xxxx}默认规则,保底,location规则在进行匹配的时候,其他的规则都匹配失败了,这时候匹配默认的规则。
location /image/ {}用于匹配请求的uri(路径),例如game.test.com/image/test.txt
location ~ \. (jpg|jpeg)$ {}支持正则,区分大小写,例如game.test.com/test/test.jpg
location ~* \. (jpg|jpeg)$ {}支持正则,不区分大小写,例如game.test.com/test/test.jpg
location ^~ /test/不支持正则,仅仅匹配普通字符,很少使用,但优先级高。
location = /50x.html不支持正则,精确匹配,使用较少,例如匹配/50x.html
location @名字 {}命名的location,一般用于returnerror_log跳转。
  • 匹配优先级:
    | 优先级 | 符号 |
    |--------|------|
    | 1 = | 精确匹配,如location = /50x.html |
    | 2 ^~ | 优先匹配,如location ^~ /test/ |
    | 3 ~ | 区分大小写的正则匹配,如location ~ \. (jpg|jpeg)$ {} |
    | 4 ~* | 不区分大小写的正则匹配,如location ~* \. (jpg|jpeg)$ {} |
    | 5 /image/ | 普通字符匹配,如location /image/ {} |
    | 6 / | 默认匹配,如location / {} |
# 编辑
server {listen 80;server_name l.test.com;default_type text/html;location / {return 200 "location /\n";}location = /index.html {return 200 "location =/\n";}location ~ /index.html {return 200 "location ~/\n";}location ^~ /index.html {return 200 "location ^~\n";}
} # 分析?
location = / {[ configuration A ]
}
location / {[ configuration B ]
}
location /documents/ {[ configuration C ]
}
location ^~ /images/ {[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {[ configuration E ]
}#测试与访问“/”                             A“/index.html”                   B“/documents/document.html”     C“/images/1.gif”                 D“/documents/1.jpg”             E

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电阻、电容和电感测试仪设计

在现代化生产、学习、实验当中,往往需要对某个元器件的具体参数进行测量,在这之中万用表以其简单易用,功耗低等优点被大多数人所选择使用。然而万用表有一定的局限性,比如:不能够测量电感,而且容量稍大的电容也显得无能为力。所以制作一个简单易用的电抗元器件测量仪是很…

QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox&#xff0c;可参见下面这篇文章 QT之动态加载下拉框&#xff08;QComboBox&#xff09; 同理QTreeWidget也可以实现动态加载&#xff0c;在一些异步加载数据&#xff0c;并且数据加载比较耗时&#xff0c;非常实用。 效果 原理分析 要实现此类效…

【全开源】多功能投票小程序系统源码(ThinkPHP+FastAdmin+Uniapp)

&#x1f680; 多功能投票小程序&#xff0c;让决策变得更简单&#xff01; 基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c…

PlantUML-使用文本来画时序图

介绍 PlantUML 是一个开源工具&#xff0c;用户可以使用纯文本描述来创建 UML (统一建模语言) 图形。由于它使用文本来描述图形&#xff0c;因此可以很容易地将这些描述与源代码一起存储在版本控制系统中。然后&#xff0c;PlantUML 负责将这些描述转换为图形。 资料 官方文…

工业通讯现场中关于EtherCAT转TCPIP网关的现场应用

在当今工业自动化的浪潮中&#xff0c;EtherCAT技术以其高效、实时的特性成为了众多制造业的首选。然而&#xff0c;随着工业互联网的发展&#xff0c;对于数据的远程访问和云平台集成的需求日益增长&#xff0c;这就需要将EtherCAT协议转化为更为通用的TCP/IP协议。于是开疆智…

基础面试题

目录 MySql 1.连接查询 2.聚合函数 3.SQL 关键字 1.分页 (Iimit) 2.倒序 (order by) 3.分组 (group by) 4.去重 (distinct) 4. SQL Select 语句完整的执行顺序: 5. ★数据库三范式 6. 存储引擎 7.★数据库事务 7.1. ★事务特性: ACID 7.2. ★事务隔离级别 8.★…

《web应用技术》第十次作业

将自己的项目改造为基于vue-cli脚手架的项目&#xff0c;页面有导航&#xff0c;学会使用router。 <el-aside width"200px" style"background-color: aliceblue;"> <el-menu :default-openeds"[1]" style"background-color:rgb(1…

【数据结构】排序(直接插入、折半插入、希尔排序、快排、冒泡、选择、堆排序、归并排序、基数排序)

目录 排序一、插入排序1.直接插入排序2.折半插入排序3.希尔排序 二、交换排序1.快速排序2.冒泡排序 三、选择排序1. 简单选择排序2. 堆排序3. 树排序 四、归并排序(2-路归并排序)五、基数排序1. 桶排序&#xff08;适合元素关键字值集合并不大&#xff09;2. 基数排序基数排序的…

电风扇如何实现跌倒断电保护功能

电风扇作为日常生活中常用的家电产品&#xff0c;为了提升安全性能&#xff0c;在设计上通常会考虑加入跌倒断电保护功能。其中&#xff0c;光电倾倒开关是实现跌倒断电保护功能的关键组件之一。 光电倾倒开关内置红外发光二极管和光敏接收器&#xff0c;其工作原理非常巧妙。…

MySQL之查询性能优化(六)

查询性能优化 查询优化器 9.等值传播 如果两个列的值通过等式关联&#xff0c;那么MySQL能够把其中一个列的WHERE条件传递到另一列上。例如&#xff0c;我们看下面的查询: mysql> SELECT film.film_id FROM film-> INNER JOIN film_actor USING(film_id)-> WHERE f…

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱 在大数据处理和分析的场景中&#xff0c;Hadoop MapReduce是一种常见且高效的工具。本文将展示如何使用Hadoop MapReduce来分析邮件日志&#xff0c;提取邮件的发送状态&#xff08;成功、失败或退回&#xff09;和…

企业微信hook接口协议,ipad协议http,内部联系人备注修改

内部联系人备注修改 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"1688855749266556","vid":1688856554448765,"remark":"备注啦啦啦22222","des&quo…

软件测试——蓝桥杯笔记(自用)

Before和BeforeClass&#xff0c;在测试前&#xff0c;初始化Driver&#xff0c;BeforeClass适用于静态方法 After和AfterClass&#xff0c;在测试后&#xff0c;关闭Driver&#xff0c;AfterClass适用于静态方法 自动化测试记得使用BeforeClass&#xff0c;AfterClass 单元…

2004NOIP普及组真题 2. 花生采摘

线上OJ&#xff1a; 【04NOIP普及组】花生采摘 核心思想&#xff1a; 1、本题为贪心即可。 2、因为本题严格限制了顺序&#xff0c;所以先把每个节点的花生数量按降序排序。然后逐一判断下一个花生是否需要去采摘即可 3、每一次采摘完&#xff0c;记录耗时 t 以及采集的花…

手机相册的排列方式探讨

不论你是不是程序员&#xff0c;你一定留意过一个问题&#xff1a;相册 App 基本都将图片裁剪成了居中的 1:1 正方形。那么手机相册 App&#xff0c;为什么要将图片切割成 1:1 正方形&#xff0c;然后以网格排列&#xff1f;是行业标准吗&#xff1f; 自适应图片宽度的图库&a…

Stable Diffusion——四种模型 LoRA(包括LyCORIS)、Embeddings、Dreambooth、Hypernetwork

目前 Stable diffusion 中用到主要有四种模型&#xff0c;分别是 Textual Inversion &#xff08;TI&#xff09;以 Embeddings 为训练结果的模型、Hypernetwork 超网络模型、LoRA&#xff08;包括 LoRA 的变体 LyCORIS&#xff09;模型、Dreambooth 模型。 视频博主 koiboi 用…

Linux中Apache网站基于Http服务的访问限制(基于地址/用户)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月3日11点44分 &#x1f004;️文章质量&#xff1a;95分 为了更好地控制对网站资源的访问&#xff0c;可…

用 Axios 封装一个双 token 无感刷新

为什么要用双Token无感刷新&#xff0c;它解决了什么问题&#xff1f; 为了保证安全性&#xff0c;后端设置的Token不可能长期有效&#xff0c;过了一段时间Token就会失效。而发送网络请求的过程又是需要携带Token的&#xff0c;一旦Token失效&#xff0c;用户就要重新登陆&…

python书上的动物是啥

Python的创始人为Guido van Rossum。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;Guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&#xff0c;做为ABC语言的一种继承。之所以选中Python作为程序的名字&#xff0c;是因为他是一个叫Monty Python…

C# 判断字符串不等于空的示例

在C#中&#xff0c;要判断一个字符串是否不等于空&#xff08;即它既不是null也不是空字符串""&#xff09;&#xff0c;方法有如下几种&#xff0c;如下。 方法1 使用逻辑运算符和string.IsNullOrEmpty方法 string myString "123"; // 假设要检查的字…