Nginx location 配置 - Part 2

接上文
链接: Nginx 简介和入门 - part1

上文 我们简单地在 nginx 创建了3个虚拟主机, 虽然这个3个主机都是用占用80端口

但是我们可以用不同的域名来实现区分访问3台虚拟主机。

但是, 实际项目上, 我们更加多地会使用location 配置而不是用 域名区分。 本文的重点就是location 配置。




先准备1个网站模板

这次我们直接从github 下载
github 地址:
https://github.com/LinkedInLearning/learning-nginx-2492317.git

gateman@tf-vpc0-subnet0-main-server:~/learning-nginx$ pwd
/home/gateman/learning-nginx
gateman@tf-vpc0-subnet0-main-server:~/learning-nginx$ git clone https://github.com/LinkedInLearning/learning-nginx-2492317.git



解压
gateman@tf-vpc0-subnet0-main-server:~/learning-nginx/learning-nginx-2492317$ pwd
/home/gateman/learning-nginx/learning-nginx-2492317
gateman@tf-vpc0-subnet0-main-server:~/learning-nginx/learning-nginx-2492317$ sudo mkdir -p /var/www/binaryville/
gateman@tf-vpc0-subnet0-main-server:~/learning-nginx/learning-nginx-2492317$ sudo tar -xf Binaryville_robot_website_LIL_107684.tgz --directory /var/www/binaryville/

上面的命令直接把文件解压在了/var/www/binaryVille/ 这个文件夹

gateman@tf-vpc0-subnet0-main-server:~/learning-nginx/learning-nginx-2492317$ cd /var/www/binaryville
gateman@tf-vpc0-subnet0-main-server:/var/www/binaryville$ ls -l
total 100
-rw-r--r--  1 root root  1140 Aug  5  2022 403.html
-rw-r--r--  1 root root  1193 Jul 29  2022 404.html
-rw-r--r--  1 root root  1208 Jul 29  2022 50x.html
-rw-r--r--  1 root root   648 Aug 19  2020 README.rtf
drwxrwxr-x 38 root root  4096 Aug  3  2020 _style-guide
drwxrwxr-x 16 root root  4096 Aug  3  2020 about
drwxrwxr-x  2 root root  4096 Aug  3  2020 account
drwxrwxr-x  2 root root  4096 Aug  3  2020 assets
drwxrwxr-x  8 root root  4096 Aug  3  2020 blog
drwxrwxr-x  2 root root  4096 Aug  3  2020 cart
drwxrwxr-x  4 root root  4096 Aug  3  2020 checkout
drwxrwxr-x  2 root root  4096 Aug  3  2020 contact
-rw-rw-r--  1 root root    45 Aug  3  2020 humans.txt
drwxrwxr-x  7 root root  4096 Aug  3  2020 images
-rw-rw-r--  1 root root 29987 Jul 29  2022 index.html
drwxr-xr-x  2 root root  4096 Aug  5  2022 private
-rw-rw-r--  1 root root    25 Aug  3  2020 robots.txt
drwxrwxr-x  3 root root  4096 Aug  3  2020 shop



然后在/etc/nginx/conf.d 准备1个for这个网站的配置文件
gateman@tf-vpc0-subnet0-main-server:/etc/nginx/conf.d$ cat binaryville.conf 
server {
        listen 8081;
        server_name jp-gcp-vms.xyz www.jp-gcp-vms.xyz;
        index index.html index.htm index.php;
        root  /var/www/binaryville;
}

注意这次用感到是8081 端口, 如果防火墙没打开这个端口的记得打开


重启 nginx 服务
nginx -t
sudo systemctl reload nginx



访问配置好的网站

http://jp-gcp-vms.xyz:8081/
在这里插入图片描述

好了接下来我们会尝试更新配置文件, 使用location 配置去更新这个网站的

  1. Site root
  2. Images
  3. Error Pages



配置Site root (网站根目录)

我们先检查下 网站目录 /var/www/binaryVille 的内容

gateman@tf-vpc0-subnet0-main-server:/var/www/binaryville$ ls -l
total 100
-rw-r--r--  1 root root  1140 Aug  5  2022 403.html
-rw-r--r--  1 root root  1193 Jul 29  2022 404.html
-rw-r--r--  1 root root  1208 Jul 29  2022 50x.html
-rw-r--r--  1 root root   648 Aug 19  2020 README.rtf
drwxrwxr-x 38 root root  4096 Aug  3  2020 _style-guide
drwxrwxr-x 16 root root  4096 Aug  3  2020 about
drwxrwxr-x  2 root root  4096 Aug  3  2020 account
drwxrwxr-x  2 root root  4096 Aug  3  2020 assets
drwxrwxr-x  8 root root  4096 Aug  3  2020 blog
drwxrwxr-x  2 root root  4096 Aug  3  2020 cart
drwxrwxr-x  4 root root  4096 Aug  3  2020 checkout
drwxrwxr-x  2 root root  4096 Aug  3  2020 contact
-rw-rw-r--  1 root root    45 Aug  3  2020 humans.txt
drwxrwxr-x  7 root root  4096 Aug  3  2020 images
-rw-rw-r--  1 root root 29987 Jul 29  2022 index.html
drwxr-xr-x  2 root root  4096 Aug  5  2022 private
-rw-rw-r--  1 root root    25 Aug  3  2020 robots.txt
drwxrwxr-x  3 root root  4096 Aug  3  2020 shop
gateman@tf-vpc0-subnet0-main-server:/var/www/binaryville$ ls images
accepted-cards.svg  characters  empty-cart.svg  home-hero-characters.png  logo.svg                  placeholder-371x217.jpg  placeholder-708x590.jpg  placeholder-800x800.jpg      product-montage.png
blog                contact     favicon         icons.svg                 placeholder-1184x360.jpg  placeholder-535x535.jpg  placeholder-720x480.jpg  product-montage-cropped.png  products
gateman@tf-vpc0-subnet0-main-server:/var/www/binaryville$ 

我们在 /etc/nginx/conf.d/binaryVille.conf 添加下面代码

	    location /site {
           # First attempt to serve a request as a file, 
           # then as directory, then fall back to display a 404
           try_files $uri $uri/ =404;
        }

这时的配置文件内容

root@tf-vpc0-subnet0-main-server:/etc/nginx/conf.d# cat binaryville.conf
server {
        listen 8081;
        server_name jp-gcp-vms.xyz www.jp-gcp-vms.xyz;
        index index.html index.htm index.php;
        root  /var/www/binaryville;

        location / {
           # First attempt to serve a request as a file, then as directory, then fall back to display a 404
           try_files $uri $uri/ =404 ;
        }
}
root@tf-vpc0-subnet0-main-server:/etc/nginx/conf.d# 

这段配置代码的意思是,

当访问/ url时, 例如 /abc
nginx 首先会把abc 作为 / 里的1个abc文件处理(通常是浏览器下载)
如果/var/www/binaryVille/ 没有abc这个文件 则尝试处理 /abc/ 当作文件夹
还没有, 返回404

注意 这段代码也是 nginx的默认处理逻辑,不加上也是这样的

这时我们尝试访问 /images
在这里插入图片描述

为什么是403 而不是404

首先, /var/www/binaryVille 里面没有images 的文件, 但是有images 文件夹

所以nginx 就当成/images/来处理了

但是images/下虽然有很多 图片文件, 但是默认下是不会显示文件列表的, 而且里面没有index.html 文件, 所以就显示403了

但是我们直接访问images 下某个图片文件, (前提是知道文件名)
是可以访问的
在这里插入图片描述

如果这时我们在images 添加1个index.html

root@tf-vpc0-subnet0-main-server:/var/www/binaryville/images# cat index.html 
images folder!
root@tf-vpc0-subnet0-main-server:/var/www/binaryville/images# 

再刷新下网页!
就能显示网页内容了
在这里插入图片描述




配置images 目录

这时我们再增加一段代码

		location /images {
            # Allow the contents of /images folder to be listed
            autoindex on;
        }

这时 配置文件内容

root@tf-vpc0-subnet0-main-server:/etc/nginx/conf.d# cat binaryville.conf
server {
        listen 8081;
        server_name jp-gcp-vms.xyz www.jp-gcp-vms.xyz;
        index index.html index.htm index.php;
        root  /var/www/binaryville;

        location / {
           # First attempt to serve a request as a file, then as directory, then fall back to display a 404
           try_files $uri $uri/ =404 ;
        }

        location /images {
            # Allow the contents of /images folder to be listed
            autoindex on;
        }
}

当我们为 /images folder 打开 autoindex on时 , 我们刷新下/images/网页, 见到不再是

403 了
而是文件可以被列出
在这里插入图片描述





配置覆盖

如果 location / 的配置 和 location /images 的配置有冲突会怎么样
答案是 访问 非 /images 的资源时会依照 / 的配置
而访问 /images 资源时 按照 /images 的配置

例如下面的配置文件

root@tf-vpc0-subnet0-main-server:/etc/nginx/conf.d# cat binaryville.conf
server {
        listen 8081;
        server_name jp-gcp-vms.xyz www.jp-gcp-vms.xyz;
        index index.html index.htm index.php;
        root  /var/www/binaryville;

        location / {
           # First attempt to serve a request as a file, then as directory, then fall back to display a 404
           try_files $uri $uri/ =404;
        }

        location /images {
            # Allow the contents of /images folder to be listed
            autoindex on;
           try_files $uri $uri/ =504;
        }
}

location / 找不到资源时返回404
location /images 找不到资源时返回504

测试
当访问 /abcxx 时 页面是404
在这里插入图片描述
访问/images/abcxx 页面是504了
在这里插入图片描述




配置404 错误页面

上面的404 页面是 nginx 默认的
而网站目录下有自定义的404.html, 如何让404 出错的页面指向它呢, 还是location 配置

我们增加下面1段配置代码

	    # specify the page to server for 404 errors
        error_page 404 /404.html;

很容易理解
我们再访问 http://jp-gcp-vms.xyz:8081/abcxx
的确能显示自定义的404.html 页面了
在这里插入图片描述
这时我们直接访问
http://jp-gcp-vms.xyz:8081/404.html

也会一样显示上面的页面的
如何禁止用户直接在浏览器访问 http://jp-gcp-vms.xyz:8081/404.html?

加上下面这段代码

        # an exact map location for the 404 page
        location = /404.html {
          # only for intenal requests
          internal;
        } 

也不难理解。。
但是for 这个case, 再访问 http://jp-gcp-vms.xyz:8081/404.html 还是会显示自定义的404 页面,
因为
访问 404.html -> 简直访问 -> return 404 error -> 还是调回404.html…





配置500 错误页面

我们再加上下面3段配置

        # specify the page to server for 50x errors
        error_page 500 502 503 504 /50x.html;

        # an exact map location for the 404 page
        location = /50x.html {
          # only for intenal requests
          internal;
        } 

       # a location to demostrated 500 errors
       location /500 {
          fastcgi_pass unix:/this/will/fail;
       }

其实与404的配置差不多, 小小区别:

  1. 用error_page 覆盖了多个error 到同1个页面50x.html
  2. 最后构造了1个 /500 的location 用于测试, fastcgi_pass unix:/this/will/fail 这个命令肯定会出错的

我们尝试访问 http://jp-gcp-vms.xyz:8081/500
在这里插入图片描述
就是我们想要的!

出错日志: /var/log/nginx/error.log

gateman@tf-vpc0-subnet0-main-server:/var/log/nginx$ tail -n 10 error.log
2024/01/07 16:26:16 [error] 195693#195693: *1771 open() "/var/www/binaryville1/.env" failed (2: No such file or directory), client: 140.82.15.131, server: 34.39.2.90, request: "GET /.env HTTP/1.1", host: "34.39.2.90"
2024/01/07 16:29:27 [warn] 213106#213106: conflicting server name "jp-gcp-vms.xyz" on 0.0.0.0:80, ignored
2024/01/07 16:29:27 [warn] 213106#213106: conflicting server name "www.jp-gcp-vms.xyz" on 0.0.0.0:80, ignored
2024/01/07 16:29:46 [warn] 213449#213449: conflicting server name "jp-gcp-vms.xyz" on 0.0.0.0:80, ignored
2024/01/07 16:29:46 [warn] 213449#213449: conflicting server name "www.jp-gcp-vms.xyz" on 0.0.0.0:80, ignored
2024/01/07 16:29:46 [notice] 213449#213449: signal process started
2024/01/07 16:32:53 [crit] 213450#213450: *1772 connect() to unix:/this/will/fail failed (2: No such file or directory) while connecting to upstream, client: 103.151.172.31, server: jp-gcp-vms.xyz, request: "GET /500 HTTP/1.1", upstream: "fastcgi://unix:/this/will/fail:", host: "jp-gcp-vms.xyz:8081"
2024/01/07 16:33:21 [error] 213450#213450: *1774 open() "/var/www/binaryville1/.env" failed (2: No such file or directory), client: 154.47.20.17, server: 34.39.2.90, request: "GET /.env HTTP/1.1", host: "34.39.2.90"
2024/01/07 16:34:15 [crit] 213450#213450: *1775 connect() to unix:/this/will/fail failed (2: No such file or directory) while connecting to upstream, client: 103.151.172.31, server: jp-gcp-vms.xyz, request: "GET /500 HTTP/1.1", upstream: "fastcgi://unix:/this/will/fail:", host: "jp-gcp-vms.xyz:8081"
2024/01/07 16:34:20 [crit] 213450#213450: *1775 connect() to unix:/this/will/fail failed (2: No such file or directory) while connecting to upstream, client: 103.151.172.31, server: jp-gcp-vms.xyz, request: "GET /500 HTTP/1.1", upstream: "fastcgi://unix:/this/will/fail:", host: "jp-gcp-vms.xyz:8081"
gateman@tf-vpc0-subnet0-main-server:/var/log/nginx$ 

这时我们直接访问
http://jp-gcp-vms.xyz:8081/50x.html
在这里插入图片描述
这时第2段的internal 生效了, 显示的是404页面而不是50x的页面
访问 50x.html -> 不允许外部访问 -> return 404 -> return 404.html





location 配置中一些通配符规则

这时, 配置文件的内容如下:

root@tf-vpc0-subnet0-main-server:/etc/nginx/conf.d# cat binaryville.conf
server {
        listen 8081;
        server_name jp-gcp-vms.xyz www.jp-gcp-vms.xyz;
        index index.html index.htm index.php;
        root  /var/www/binaryville;

        location / {
           # First attempt to serve a request as a file, then as directory, then fall back to display a 404
           try_files $uri $uri/ =404;
        }

        location /images {
            # Allow the contents of /images folder to be listed
            autoindex on;
           try_files $uri $uri/ =504;
        }

        # specify the page to server for 404 errors
        error_page 404 /404.html;
 
        # an exact map location for the 404 page
        location = /404.html {
          # only for intenal requests
          internal;
        } 

        # specify the page to server for 50x errors
        error_page 500 502 503 504 /50x.html;

        # an exact map location for the 404 page
        location = /50x.html {
          # only for intenal requests
          internal;
        } 

       # a location to demostrated 500 errors
       location /500 {
          fastcgi_pass unix:/this/will/fail;
       }
}

可以简单 location 的配置中有些有 = 号 有些没有
区别是什么呢

其实

location /500 这种写法代表perfix 匹配
下面的location 都是符合规则的
/500 /5001 /500/abc … 总之 500开头的都可以

location = /500 代表精确匹配
只有 /500 才能匹配

还是其他的匹配规则, 参考如下

modifierAplication to Location Definitions
Noneprefix
=exact match
~a case-senitive regular expression
~*a case-insensitive regular expression
^~if the longest prefix maches then no regular expression is checked

1 ~ 4 规则都很简单, 值得注意是最后1个

^~是Nginx配置中用于指定前缀匹配的特殊符号,可以与location块一起使用。

当^~前缀与location块一起使用时,它表示如果请求的URL以指定的前缀匹配,那么该location块将被选择用于处理请求,而不再继续寻找其他更具体的匹配。

下面是对^~符号的使用示例:

location ^~ /images/ {
    # 处理以 /images/ 开头的请求
    # ...
}

在上述示例中,当请求的URL以 /images/ 开头时,它将被匹配到该location块,并使用该块中的配置来处理请求。这个前缀匹配具有比通用的正则表达式匹配更高的优先级。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240107查看Android11下移远的4G模块EC20在Firefly的AIO-3399J开发板跑通时的相关服务

20240107查看Android11下移远的4G模块EC20在Firefly的AIO-3399J开发板跑通时的相关服务 2024/1/7 11:24 缘起:友善之臂的SDK:rk3399-android-11-r20211216.tar.xz可以跑通EC20,但是Toybrick的不行! 同样是Andrid11,因此…

抖音在线查权重系统源码,附带查询接口

抖音权重在线查询只需输入抖音主页链接,即可查询作品情况。 搭建教程 上传源码并解压 修改数据库“bygoukai.sql” 修改“config.php” 如需修改水印请修改第40行 如需修改限制次数,请修改第156行 访问域名user.php即可查看访问用户,停…

018、通用集合类型

Rust标准库包含了一系列非常有用的被称为集合的数据结构。大部分的数据结构都代表着某个特定的值,但集合却可以包含多个值。 与内置的数组与元组类型不同,这些集合将自己持有的数据存储在了堆上。这意味着数据的大小不需要在编译时确定,并且可…

Spring系列学习六、深入Spring AOP——揭开代理的神秘面纱

深入Spring AOP——揭开代理的神秘面纱 一、动态代理的实现原理二、CGLIB字节码增强的实现原理三、结语 上一章节,我们体验了Spring AOP强大的能力的同时,是不是也想弄明白,它是怎么原理是什么呢?如果自己要做一个类似的框架&…

阿里云服务器ECS入门与基础运维

一、云服务器简介 1、服务器: (1) 概念: 服务器本身就是一种电脑,同样具备CPU、内存、硬盘、网卡、电源等硬件。 互联网对外提供网站、游戏、在线会议、网盘等服务,都需要将这些互联网服务部署到服务器中。 (2) 特点&#xf…

Fluids —— DOP Nodes

目录 Gas SubStep —— 重复执行对应的子步 Switch Solver —— 切换解算器 Gas Attribute Swap —— 交换、复制或移动几何体属性 Gas Intermittent Solve —— 固定时间间隔计算子解算器 Gas External Forces —— 计算外部力并更新速度或速度场 Gas Particle Separate…

python学习笔记

四、列表 4.1 序列的索引及切片操作 s"helloworld" # 正向递增 for i in range(0,len(s)):print(i,s[i],end\t\t) print(\n) # 反向递减 for i in range(-len(s),0):print(i,s[i],end\t) print(\n) # 切片 for i in range(0,5,2):print(i,s[i],end\t)4.2 序列的相关…

Vue中Vuex的环境搭建和原理分析及使用

Vuex的环境搭建 Vuex是Vue实现集中式数据管理的Vue的一个插件,集中式可以理解为一个老师给多个学生讲课。 Vue2.0版本的安装: npm i vuex3 使用Vuex需要在store中的index.js引入Vuex和main.js中引入store,目的是让vm和vc都能看到$store。实现多个组件…

快速实现产品智能:用 AI 武装你的 API | 开源日报 No.138

openchatai/OpenCopilot Stars: 3.8k License: MIT OpenCopilot 是一个允许你拥有自己产品的 AI 副驾驶员的项目。它集成了产品底层 API,并可以在需要时执行 API 调用。它使用 LLMs 来确定用户请求是否需要调用 API 端点,然后决定调用哪个端点并根据给定…

Retrieval-Augmented Generation for Large Language Models: A Survey

PS: 梳理该 Survey 的整体框架,后续补充相关参考文献的解析整理。本文的会从两个角度来分析总结,因此对于同一种技术可能在不同章节下都会有提及。第一个角度是从整体框架的迭代来看(对应RAG框架章节),第二个是从RAG中…

SPON世邦 IP网络对讲广播系统 多处文件上传漏洞复现

0x01 产品简介 SPON世邦IP网络对讲广播系统是一种先进的通信解决方案,旨在提供高效的网络对讲和广播功能。 0x02 漏洞概述 SPON世邦IP网络对讲广播系统 addscenedata.php、uploadjson.php、my_parser.php等接口处存在任意文件上传漏洞,未经身份验证的攻击者可利用此漏洞上…

6.OpenResty系列之深入理解(二)

1. 日志输出 vim /usr/local/openresty/nginx/conf/nginx.conf默认配置如下 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;http {#log_format main $remote_addr - $remote_user [$time…

提高企业培训考试系统的用户体验的技术技巧

随着现代企业培训的发展,企业培训考试系统已经成为企业人力资源培训的重要工具。为了提高用户体验,需要采取一些技术技巧来优化系统功能和界面设计。 第一,用户界面的简洁性是提高用户体验的关键。在设计考试系统界面时,应该尽量避…

flutter中枚举的使用

Dart 2.17 增加了对枚举成员变量的支持,推荐使用方式三 使用dart工具来运行代码,工具:https://dartpad.cn //方式一:未支持扩展枚举时 enum InOutOrderStatusEnum {approval,completed,cancel,rejected;int get statusCode {sw…

CSS3渐变属性详解

渐变属性 线性渐变 概念:线性渐变,指的是在一条直线上进行的渐变。在线性渐变过程中,起始颜色会沿着一条直线按顺序过渡到结束颜色 语法: background:linear-gradient(渐变角度,开始颜色,结束颜色);渐变…

FineBI实战项目一(4):指标分析之每日订单总额/总笔数

1 明确数据分析目标 统计每天的订单总金额及订单总笔数 2 创建用于保存数据分析结果的表 use finebi_shop_bi;create table app_order_total(id int primary key auto_increment,dt date,total_money double,total_cnt int ); 3 编写SQL语句进行数据分析 selectsubstring(c…

DeepPurpose 生物化学深度学习库;蛋白靶点小分子药物对接亲和力预测虚拟筛选

参考: https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/107649770 https://github.com/kexinhuang12345/DeepPurpose ##安装 pip install DeepPurpose rdkitDeepPurpose包括: 数据: 关联TDC库下载,是同一作者开发的 https://blog.csdn.net/weixin_42357472/artic…

一、二进制方式 安装部署K8S

目录 一、操作系统初始化 1、关闭防火墙 2、关闭 SELinu 3、 关闭 swap 4、添加hosts 5、同步系统时间 二、集群搭建 —— 使用外部Etcd集群 1、自签证书 2、自签 Etcd SSL 证书 ① 创建 CA 配置文件:ca-config.json ② 创建 CA 证书签名请求文件&#xff…

Python3 字典

字典是另一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示: d {key1 : value1, key2 : value2, key3 : value3 } 注…

[计算机提升] 设置文件关联程序

4.4 设置文件关联程序 我们知道,系统是通过文件的后缀名来选择使用哪种程序来打开同一种类型的文件的。这个我们可以在选中文件后,点击鼠标右键,在弹出的菜单中选择属性: 可以在打开方式中看到默认是用记事本程序打开.docx文件…