Nginx location 配置 - Part 2

news2024/12/26 11:12:35

接上文
链接: 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块,并使用该块中的配置来处理请求。这个前缀匹配具有比通用的正则表达式匹配更高的优先级。

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

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

相关文章

Docker实战08|Docker管道及环境变量识别

上一篇文章中,讲解了如何通过Go语言实现对Docker Cgroup的资源限制 具体文章可见《Docker就应该这么学-07》 有需要的小伙伴可以回顾一下。 接下来本文会详细介绍一下Docker 管道及环境变量识别 管道及环境变量识别 获取代码 git clone https://gitee.com/mjr…

物理机部署三节点Kafka集群

一、部署Kafka集群 官方下载地址:http://kafka.apache.org/downloads.html上传安装包到102的/opt/software目录下 解压安装包到/opt/module/目录下,修改解压包名为kafka 修改config目录下的配置文件server.properties内容 #broker的全局唯一编号&#…

【漏洞复现】ActiveMQ文件上传漏洞(CVE-2016-3088)

Nx01 产品简介 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件。ActiveMQ是消息队列服务,是面向消息中间件(MOM)的最终实现,它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。 Nx02 漏洞描述 Ap…

excel统计分析——LSD多重比较

参考资料:生物统计学 一篇教你搞定显著性差异分析abcd字母标记法 LSD(least significant difference,最小显著差数法)是R. A. Fisher提出的,又称为Fisher LSD检验法,是最早用于检验各组均数间两两差异的方…

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑

1 有限状态机简介 有限状态机(英语:finite-state machine,缩写:FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型 在游戏开发中应用有限状态机&#xff…

NoSQL概述与Redis入门-redis安装与测试

一、Nosql概述 1、为什么使用Nosql 1、单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用。随着用户增多,网站出现以下问题 数据量增加到一定程度,单机数据库就放不下了数据的索引(B Tree),一个…

38.深入MySQL

深入MySQL 索引 索引是关系型数据库中用来提升查询性能最为重要的手段。关系型数据库中的索引就像一本书的目录,我们可以想象一下,如果要从一本书中找出某个知识点,但是这本书没有目录,这将是意见多么可怕的事情!我们…

【JaveWeb教程】(16) SpringBootWeb之 分层解耦 详细代码示例讲解

目录 SpringBootWeb请求响应3. 分层解耦3.1 三层架构3.1.1 介绍3.1.2 代码拆分 3.2 分层解耦3.2.1 耦合问题3.2.2 解耦思路 3.3 IOC&DI3.3.1 IOC&DI入门3.3.2 IOC详解3.3.2.1 bean的声明3.3.2.2 组件扫描 3.3.3 DI详解 SpringBootWeb请求响应 3. 分层解耦 3.1 三层架…

【UE Niagara学习笔记】01 - 浮动的蒲公英

目录 效果 步骤 一、创建材质 二、创建Niagara粒子 2.1 创建Niagara模板 2.2 通过用户参数设置粒子大小 2.3 设置数量、风速、透明度变化 2.4 设置粒子旋转 效果 步骤 一、创建材质 1. 在虚幻商城中把“Realistic Starter VFX Pack Vol 2”添加到项目中&#xff…

机器学习周刊 第4期:动手实战人工智能、计算机科学热门论文、免费的基于ChatGPT API的安卓端语音助手、每日数学、检索增强 (RAG) 生成技术综述

LLM开发者必读论文:检索增强(RAG)生成技术综述! 目录: 1、动手实战人工智能 Hands-on Al2、huggingface的NLP、深度强化学习、语音课3、Awesome Jupyter4、计算机科学热门论文5、LLM开发者必读论文:检索增强 (RAG) 生…

用css给宽高不固定的矩形画对角线

.kong{width: 200rpx;height: 76rpx;background: linear-gradient(to bottom right, #E5E5E5 0%, rgba(0, 0, 0, 0.1) calc(50% - 1px),#175CFF 50%, rgba(0, 0, 0, 0.1) calc(50% 1px),rgba(0, 0, 0, 0.1) 100%);}参考: https://blog.csdn.net/weixin_38779534/a…

GCN的使用和包的安装(超详细)

文章目录 工具包安装方法首先进入官网,找到安装包的地址进入后,找到自己的torch版本进入后,将每种对应的包都下载到本地,用本地命令安装然后就是本地安装了最后就是pip install pytorch_geometric 工具包安装方法 一定参考其GITH…

css选择器有哪些?优先级?哪些属性可以继承?

面试官:css选择器有哪些?优先级?哪些属性可以继承? 一、选择器 CSS选择器是CSS规则的第一部分 它是元素和其他部分组合起来告诉浏览器哪个HTML元素应当是被选为应用规则中的CSS属性值的方式 选择器所选择的元素,叫做…

web前端(html)练习

第一题 1. 用户名为文本框,名称为 UserName,长度为 15,最大字符数为 20。 2. 密码为密码框,名称为 UserPass,长度为 15,最大字符数为 20。 3. 性别为两个单选按钮,名称为 sex,值分…

苹果Find My查找芯片-伦茨科技ST17H6x支持苹果Find My认证

Apple「查找」Find My可通过庞大的“Apple Find My Network” 实现全球查找功能。无数iOS、iPadOS、macOS、watchOS激活设备与Find My 设备结合在一起,无需连接到Wi-Fi或者蜂窝网络,用户也可以给遗失的设备定位。对于任何iOS、iPadOS、macOS、watchOS设备…

【小白专用】(C#)用户、角色、权限控制体系

我们在开发很多项目的时候,都会用到用户权限管理,我也在很多项目里做过权限控制,所以,我也总结出一套条理清晰的角色权限控制体系。本文采用RBAC(Role Based Access Control)的基本思想,RBAC(角色访问控制)的基本思想可…

SpringBoot 中 @Transactional 注解的使用

一、基本介绍 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。本篇只说明声明式注解。 1、在 spring 项目中, Transactional 注解默认会回滚运行时异常及其子类,其它范…

【HarmonyOS】深入了解 ArkUI 的动画交互以提高用户体验

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

echarts柱状图加单位,底部文本溢出展示

刚开始设置了半天都不展示单位,后来发现是被挡住了,需要调高top值 // 基于准备好的dom,初始化echarts实例var myChart echarts.init(document.getElementById("echartD"));rankOption {// backgroundColor: #00265f,tooltip: {…

让企业的招投标文件、生产工艺、流程配方、研发成果、公司计划、员工信息、客户信息等核心数据更安全。

PC端访问地址1:www.drhchina.com PC端访问地址2: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 全方位立体式防护  让数据泄密无处遁形 信息防泄漏是一项系统的整体部署工程,加密监控已成为多数企事业单…