web架构3------(nginx的return跳转,gzip压缩,目录浏览,访问控制和location符号优先级)

article/2025/7/5 9:59:15

一.前言

本期继续来介绍nginx的各项配置,看着内容很多,但是主要还是介绍,内容还是很少的。

二.return和rewrite跳转

在我们配置ssl证书之后,如果把https的s去掉,就相当于去访问80端口了,https默认找的是443端口,而80端 口对应的网站我们设置了默认网站,所以如果你删掉了s再访问,就看到我们的默认网站了,这样会造成我们配置的就有点问题,但是像百度那些网站,他们就会自动跳转,那我们今天说的就是要解决这个问题。

2.1 return

#使用return跳转

server {

        access_log off; # 这段配置是专门用来做跳转用的,所以日志就不用记录了,off就是关闭跳 转行为的日志记录

        listen         80;

        server_name         www.xxx.top;

        location / {

                return         302 https://www.xxx.top$request_uri; # 当用户访问www.wulaoban.top的80端口时,自动跳转到https网址。

        }

}

演示:

 [root@web01 ~]# cd /etc/nginx/conf.d/

[root@web01 conf.d]# ls

a.xxx.com.conf b.xxx.com.conf c.xxx.com.conf www.xxx.top.conf

[root@web01 conf.d]# vim www.xxx.top.conf

# 在一个网站配置文件中,其实可以写多个server,如下

server {

        listen 443 ssl;

        server_name www.xxx.top;

        ssl_certificate /opt/cert/9683539_wulaoban.top.pem;

        ssl_certificate_key /opt/cert/9683539_wulaoban.top.key;

        ssl_session_timeout 5m;

        #表示使用的加密套件的类型

        ssl_ciphers ECDHE-RSA-AES128-GCM

SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

        #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。

        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # 如果不加TLSv1.1,就删掉

        

        ssl_prefer_server_ciphers on;

        location / {

                #Web网站程序存放目录

                root /web/www.xxx.top; index index.html index.htm;

        }

}

server {

        listen         80;

        server_name www.xxx.top;

        location / {

                root /web/www.wulaoban.top;

                index index.html index.htm;

        }

}

# 现在的意思是,不然你是http还是https,都可以访问到我们的www.xxx.top这个网站,但是http访问的就是80端口,不安全的访问,https访问的是443端口,安全的访问

但其实我们要的并不是这样的效果,我们采用https就是想要数据传输的安全性,现在你http也能正常访 问,那就失去了https的加密意义了

所以我们应该让他使用http的时候自动跳转为https的访问。如下

[root@web01 conf.d]# vim www.xxx.top.conf

# 在一个网站配置文件中,其实可以写多个server,如下

server {

        listen 443 ssl;

        server_name www.xxx.top;

        ssl_certificate /opt/cert/9683539_wulaoban.top.pem;

         ssl_certificate_key /opt/cert/9683539_wulaoban.top.key;

        

        ssl_session_timeout 5m;

        #表示使用的加密套件的类型ssl_ciphers ECDHE-RSA-AES128-GCM

SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

        #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。

        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # 如果不加TLSv1.1,就删掉

        

        ssl_prefer_server_ciphers on;

        location / {

                #Web网站程序存放目录

                root /web/www.xxx.top;

                index index.html index.htm;

        }

}

server {

        listen 80;

        server_name www.xxx.top;

        location / {

                return         302 https://www.wulaoban.top$request_uri; # 跳转,302是状 态码,表示重定向,也就是跳转

        }

}

# 可以先去掉$request_uri来看看效果

# $request_uri的意思是网址uri,这个访问http://www.wulaoban.top网址后面不管加什么内容,不 管访问哪个页面路径,都直接跳转到https

# URL: 协议(http/https):// + 主机(ip/域名) + 端口(80/443) + uri(/xx/index.html或 者/xx/xx.jpg等)

# 比如访问http://www.wulaoban.top/jaden/,会自动跳转到这个https://www.wulaoban.top/jaden/,还是这个页面,但是是https协议的

2.2 rewrite 

这个写法比return那个难理解,需要写正则,所以现在用return来玩的居多。

#使用rewrite跳转

server {

        access_log off;

        listen         80;

        server_name www.xxx.top;

        location / {

                rewrite ^/(.*) https://www.wulaoban.top/$1 redirect; # redirect代表302状态码,临时跳转,^代表网址https://www.wulaoban.top,/(.*)其实就是匹配uri,$1表示()中 匹配到的内容,也就是.*匹配到的内容

                # rewrite ^/(.*) https://www.wulaoban.top/$1 permanent; # permanent代表301状态码,永久跳转

        }

我们配置了静态ip的这个NAT模式的虚拟机不能上网是因为被NetworkManager给干扰了,关闭一下它 即可

# 在CentOS中有NetworkManager和network两种网络管理工具,如果这两种服务都工作时会产生冲突进而 导致机器无法联网。

systemctl stop NetworkManager

systemctl disable NetworkManager

# 在重启网卡

systemctl restart network

# route -n就看到有网关了。 

配置额外的跳转

# 通过curl可以查看网址的跳转细节,如下

curl -v http://www.jd.com

# 不管我们访问www.jd.com/jd.com/http://www.jd.com都会自动跳转到https://www.jd.com

# 所以我们还需要配置两个跳转,如下

server {

        listen         80;

        server_name www.xxx.top;

        location / {

                return         302 https://www.wulaoban.top$request_uri;

        }

}

server {

        listen         80;

        server_name xxx.top; # 用户输入不带www的时候也能跳转到https的网址上

        location / {

                return         302 https://www.wulaoban.top$request_uri;

        }

三.nginx gzip压缩

nginx采用的压缩方式是gzip

[root@web01 ~]# cd ~

[root@web01 ~]# ll

总用量 4

-rw------- 1 root root 1304 3月 15 20:14 anaconda-ks.cfg

[root@web01 ~]# gzip anaconda-ks.cfg

[root@web01 ~]# ll

总用量 4

-rw------- 1 root root 747 3月 15 20:14 anaconda-ks.cfg.gz

# 可以看到gzip压缩的文件还是小了很多的,而且原文件没有了,只剩下压缩文件了 

nginx为什么压缩呢?为了省流量、加快传输速度。服务端的流量都是要花钱的。尤其是要做加速的网 站,比如CDN加速,都是要收取流量费的。

很明显,如果服务器能够做压缩,既能够省流量,又能够加快传输速度。但是我们如果自己手动给每个 文件进行压缩,就太慢了,所以我们部署Nginx的时候,一般都会给Nginx做自动压缩的配置:

将下面的所有配置全部拷贝到我们nginx的网站配置上,哪个网站需要配置,就给哪个网站配置。

        gzip on;         #开启gzip压缩

        gzip_min_length 1k; #最小压缩文件,小于1KB的就不压缩了

        gzip_buffers         4 32k; #内存缓冲,压缩需要提前规划一些内存空间出来,4个32KB的空间

        gzip_http_version 1.1; #http版本,默认是1.0,1.1需要自己声明,不过现在比较新的nginx应该默认就是1.1了

        gzip_comp_level 9; #压缩等级,等级数1-9,压缩等级越高,压缩用的时长越长,但 是压缩的就越小

        gzip_types text/css text/xml application/javascript; #压缩的文件类型,这些 类型的文件才会被压缩,为什么压缩的都是文本文件,而不压缩图片、视频和音频等多媒体文件呢,因为文本 文件的压缩比是最高的,值得压缩。 比如jgp图片文件,这种格式的图片本身就是压缩过的文件,再压缩的意义不大。

        gzip_vary on; #http响应头添加gzip标识

        gzip_disable "MSIE [1-7]\."; #遇到IE浏览器1-7取消gzip压缩 

配置自动压缩:

         server {

                listen 80;

                server_name a.xxx.com;

                access_log /opt/nginx/a.xxx.com_log xxx;

                location / {

                        # 添加到这里即可

                        gzip on; #开启gzip压缩

                        gzip_min_length 1k; #最小压缩文件

                        gzip_buffers         4 32k; #内存缓冲

                        gzip_http_version 1.1; #http版本

                        gzip_comp_level 9; #压缩等级

                        gzip_types text/css text/xml application/javascript; #压缩w类型

                        gzip_vary on; #http响应头添加gzip标识

                        gzip_disable "MSIE [1-7]\."; #遇到IE浏览器1-7取消gzip压缩

                        root /web/one;

                        index index.html index.htm;

                }

        }

# 配置完重启nginx

如果你的客户端不支持这种压缩文件或者说不支持这种压缩格式,那么服务端只能老老实实给你发送原 文件,不压缩。

而且压缩和解压缩会消耗双方的CPU性能,但是现在的CPU性能高的很,不在乎这点消耗,摩尔定律 说,每个一年半或者两年,CPU的性能会增加一倍。但是现在受限于CPU的物理制作工艺,很难突破每 年性能提升一倍。

四.nginx 目录浏览

 # 如下两个配置即可:

autoindex on; # 开启目录浏览功能

autoindex_exact_size off; #显示文件大小的时候带单位

# 配置在nginx网站配置的server配置中:

        server {

                listen         80 default_server;

                server_name c.xxx.com; access_log /opt/nginx/c.xxx.com_log xxx;

                autoindex on; # 这里

                autoindex_exact_size off; # 这里

                location / {

                        root /web/three;

                        index index.html index.htm;

                }

        }

效果如下:

 

五.nginx 访问控制allow和deny 

访问控制行为无非就两种,允许(加白)和禁止(加黑)

访问控制有两个方式,一种是在OSI模型的四层传输层,一种是在第七层应用层。主机防火墙就是在四层 控制,nginx就是在七层控制

演示访问控制,需要开启防火墙

# 示例1:防火墙直接禁用ip地址,这是基于四层的效果

# systemctl start firewalld.service #开启主机防火墙

# 拉黑某些ip地址:

        # firewall-cmd --add-rich-rule='rule family=ipv4 source address="116.255.196.0/24" drop'

        # firewall-cmd --add-rich-rule='rule family=ipv4 source address="123.44.22.55" drop'

# 比如查看一下当前系统远程连接了哪些ip地址

[root@web01 conf.d]# w

12:52:50 up 4:11, 3 users, load average: 0.00, 0.01, 0.04

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root tty1 08:41 4:11m 0.01s 0.01s -bash

root pts/0 192.168.61.1 08:52 2.00s 0.12s 0.00s w

root pts/1 192.168.61.1 08:43 57:22 0.07s 0.07s -bash

# 可以看到192.168.61.1,这是我们NAT模式的网卡的网关,也就是说我们的物理机其实是使用的VMnet8虚拟网卡的ip地址进行连接的,如果我们通过防火墙将这个ip地址给封了,那么再建立新的ssh连接应该就连 不上这个虚拟机了。

# firewall-cmd --add-rich-rule='rule family=ipv4 source address="192.168.61.1" drop'

# 基于四层的封锁,所有的网站都访问不了、ssh、ftp等等都不行了。 

# 示例2:看一下nginx的基于七层的访问控制效果

# systemctl stop firewalld.service #关闭主机防火墙

# 拉黑的,叫做加入黑名单,被禁止访问的

# 加白的,叫做加入白名单,是允许访问的

# allow 允许

# deny 拒绝

# 比如我们将a网站做一下访问控制

[root@web01 conf.d]# pwd

/etc/nginx/conf.d

[root@web01 conf.d]# ls

a.xxx.com.conf b.xxx.com.conf c.xxx.com.conf www.xxx.top.conf

[root@web01 conf.d]# vim a.xxx.com.conf

        server {

                listen         80;

                server_name a.xxx.com;

                access_log /opt/nginx/a.xxx.com_log xxx;

                location / {

                        deny 192.168.61.1; # 黑名单,不允许192.168.61.1访问这个网站

                        allow 0.0.0.0/0; # 白名单,0.0.0.0/0表示所有ip都在白名单

                        gzip on;

                        #...

                        root /web/one;

                        index index.html index.htm;

                }

        }

[root@web01 conf.d]# nginx -t # 查看语法信息的时候,看到一个warn警告信息,提示有重复的配 置,警告没事,我们删除重复的部分即可gzip_types text/css text/xml application/javascript; #把那个text/html删除

nginx: [warn] duplicate MIME type "text/html" in

/etc/nginx/conf.d/a.jaden.com.conf:13

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

# 重启服务

[root@web01 conf.d]# systemctl restart nginx.service

# 再访问就看到403 forbidden了

# 黑名单就是先拒绝,再允许所有

        deny 192.168.61.1;

        allow 0.0.0.0/0;

# 白名单就是先允许,再拒绝所有

        allow 192.168.61.1; # 白名单

        allow 192.168.61.16; # 白名单

        #allow 192.168.61.16/24; # 还可以写地址段

        deny 0.0.0.0/0; # 黑名单

# 四层禁止(显示无法连接),哪些情况访问的时候会看到403呢,七层禁止、没有首页html文件、文件没有读 取权限,比如nginx访问某些文件,用的nginx用户身份,如果某个网站的文件,nginx用户没有读取权限, 那么也是403,我们可以将某个网站的index.html文件权限修改一下看看效果

# 如果某个公司的网站都不想让某个ip地址访问,那么就在四层禁止比较方便。

六.nginx location和优先级 

nginx网站配置可以配置多个location,单独对某些访问路径进行控制。

比如,将下面这个页面的a目录的访问加一个basic认证 

        server {

                listen         80 default_server;

                server_name c.xxx.com;

                access_log /opt/nginx/c.xxx.com_log xxx;

                autoindex on;

                autoindex_exact_size off;

                location / {

                        root /web/three;

                        index index.html index.htm;

                }

                # 加上如下内容:

                location /a {

                        auth_basic "b.xxx.com";

                        auth_basic_user_file /etc/nginx/htpasswd;

                }

        }

访问效果:

 

location还可以配置多个站点根目录

        server {

                listen         80 default_server;

                server_name c.xxx.com;

                access_log /opt/nginx/c.xxx.com_log xxx;

                autoindex on;

                autoindex_exact_size off;

                location / {

                        root /web/three;

                        index index.html index.htm;

                }

                # 下面配置的意思是,当访问a目录的时候,其实访问的是/web/a/index.html,这就是配置多 个站点根目录的意思

                location /a {

                        root /web;

                }

        } 

既然可以配置多个站点根目录,那么如果访问的目录冲突了,谁优先呢,刚才看到a目录的访问是下面的 优先了,对吧。优先级还能通过符号来控制,一会我们来看。

匹配,location的路径支持正则写法,了解几个简单的即可

        #没有符号,代表模糊匹配,不支持正则 location /te 可以匹配te开头的目录和文件

~ #表示执行一个正则匹配,区分大小写

~* #表示执行一个正则匹配,不区分大小写

= #针对的是文件,精准匹配,不支持正则

        server {

                listen         80 default_server;

                server_name c.xxx.com;

                access_log /opt/nginx/c.xxx.com_log xxx;

                autoindex on;

                autoindex_exact_size off;

                location / {

                        root /web/three;

                        index index.html index.htm;

                }

                # 下面正则的意思是,只要用户访问txt文件,都返回404状态码。那么就可以做到各类文件的保 护,或者各种路径访问的控制

                location ~* ^.*\.txt$ {

                        return 404;

                }

        }

# 再比如:只要a/A开头的目录,不区分大小写,都不能访问

location ~* /a+/ {

        return 405; # 405是不允许访问的意思的状态码

}

# 再比如:只要a开头的目录,区分大小写,不能访问

location ~ /a+/ {

        return 405;

}

# 再比如:不能访问1.txt文件

location = /1.txt {

        return 405;

}

匹配符号的优先级

 符号优先级 = 大于 ~ 大于 ~* 大于 无符号

touch jpg

#配置文件符号优先级的例子:

        location ~ /jpg {

                return 501;

        }

        location = /jpg {

                return 500;

        }

        location ~* /Jpg {

                return 503;

        }

        location /Jpg {

                return 505;

        }

七.总结 

本期内容还是有点多的,大家做个了解一下,点赞关注加收藏,做个了结,遇到的时候再来具体配置 

 

 

 


http://www.hkcw.cn/article/lRPAUQkirN.shtml

相关文章

大楼智能化建设设计方案(Word)

第一章 智能化设计 4 1.1 项目概况 4 1.2 设计原则 4 1.3 设计依据 6 1.4 项目总体规划 7 1.5 综合布线系统 8 1.5.1 综合布线系统 8 1.5.2 楼宇分机房系统 20 1.5.3 有线电视网 27 1.6 建筑智能化系统 37 1.6.1 周界防范系统 37 1.6.2 电子巡更系统 38 1.6.3…

Spring AI 之检索增强生成(Retrieval Augmented Generation)

检索增强生成(RAG)是一种技术,有助于克服大型语言模型在处理长篇内容、事实准确性和上下文感知方面的局限性。 Spring AI 通过提供模块化架构来支持 RAG,该架构允许自行构建自定义的 RAG 流程,或者使用 Advisor API 提…

【C++/Linux】TinyWebServer前置知识之IP协议详解

目录 IPv4地址 分类 IP数据报分片 IP 协议在传输数据报时,将数据报分为若干分片(小数据报)后进行传输,并在目的系统中进行重组,这一过程称为分片(Fragmentation)。 IP模块工作流程​编辑 I…

破局软件开发困境:一套‘一模到底‘的功能模型,如何撬动软件工程全数字化管控?

软件工程如同一场复杂的交响乐,功能模型是乐谱的主旋律,而需求、设计、开发、测试、运维、用户反馈、Bug、版本、状态等则是丰富的配器和节奏。传统模式下,这些元素常常各自为营,声部混乱,难以奏出和谐的乐章。如何才能…

RAG入门 - Retriever(1)

文章目录 环境准备知识库加载1. Retriever - embeddings 🗂️1.1 将文档拆分为chunks1.2 词嵌入1.3 构建向量数据库Nearest Neighbor search algorithm (最近邻搜索算法)Distances (距离)点积(Dot Product&…

Pyomo中线性规划接口的使用

之前在 Pyomo介绍-CSDN博客 中以饮食为例介绍过Pyomo的使用,执行以下命令: pyomo solve --solverglpk test_pyomo_linear_programming.py ../test_data/diet.dat 直接执行以上命令,不便之处有以下几点: (1).不能直接解析python文…

打开一个新的Maven工程要做的事情

新导入项目变成maven 1、检查环境配置 2.看有没有maven 3.在idea中配置maven 4、让配置文件添加到maven项目中 变成这样基本就成功了 调出service界面 可以同时选中启动多个项目 这里可以同时关闭多个项目

GNURadio实现MIMO OFDM文件传输

文章目录 前言一、理论基础二、使用方法1、打开虚拟机2、输入密码3、运行 grc 文件4、运行 三、流图及运行结果1、MIMO_simulation.grc2、MIMO_tx.grc3、MIMO_rx.grc 四、资源自取 前言 使用 GNU Radio Companion 驱动 USRP N320 实现 MIMO OFDM 收发测试。(Ubuntu…

达梦数据库 Windows 系统安装教程

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…

【Day43】

DAY 43 复习日 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 今天代码见个人 Gitee仓库:LOVE/Python学习库https://gitee.com/love_hub/python-learning-library Github仓库&a…

贪心算法应用:装箱问题(BFD算法)详解

贪心算法应用&#xff1a;装箱问题(BFD算法)详解 1. 装箱问题与BFD算法概述 1.1 装箱问题定义 装箱问题(Bin Packing Problem)是组合优化中的经典问题&#xff0c;其定义为&#xff1a; 给定n个物品&#xff0c;每个物品有大小wᵢ (0 < wᵢ ≤ C)无限数量的箱子&#xf…

mysql(十五)

目录 子查询 1.准备工作 2--创建表格 3--插入数据 2.where 子查询单列单个数据 格式 查询 3.where 子查询单列多个数据(in) 格式 查询 使用子查询 4.from 多行多数据 格式 查询 子查询 将select的查询的返回结果 当成另外一个selet语句的内容去使用。 子查询放在()里面 注意…

Unity 环境搭建

Unity是一款游戏引擎&#xff0c;可用于开发各种类型的游戏和交互式应用程序。它由Unity Technologies开发&#xff0c;并在多个平台上运行&#xff0c;包括Windows、macOS、Linux、iOS、Android和WebGL。Unity也支持虚拟现实(VR)和增强现实(AR)技术&#xff0c;允许用户构建逼…

从0开始学习R语言--Day15--非参数检验

非参数检验 如果在进行T检验去比较两组数据差异时&#xff0c;假如数据里存在异常值&#xff0c;会把数据之间的差异拉的很大&#xff0c;影响正常的判断。那么这个时候&#xff0c;我们可以尝试用非参数检验的方式来比较数据。 假设我们有A&#xff0c;B两筐苹果&#xff0c…

NX847NX855美光固态闪存NX862NX865

NX847NX855美光固态闪存NX862NX865 美光固态闪存技术深度解析&#xff1a;NX847、NX855、NX862、NX865的多维探索 一、技术架构与核心优势 美光NX系列固态闪存的卓越性能源于其底层技术的创新突破。以G9 NAND技术为核心的产品线&#xff08;如NX865&#xff09;&#xff0c;…

秋招Day12 - 计算机网络 - UDP

说说TCP和UDP的区别&#xff1f; TCP使用无边界的字节流传输&#xff0c;可能发生拆包和粘包&#xff0c;接收方并不知道数据边界&#xff1b;UDP采用数据报传输&#xff0c;数据报之间相互独立&#xff0c;有边界。 应用场景方面&#xff0c;TCP适合对数据的可靠性要求高于速…

Baklib知识中台重塑企业知识生态

Baklib四库体系构建知识中枢 Baklib通过独创的四库体系&#xff08;显性知识库、隐性经验库、场景案例库、智能模型库&#xff09;&#xff0c;构建起企业知识管理的核心枢纽。显性知识库集中存储制度文档、产品手册等结构化信息&#xff0c;隐性经验库则通过问答社区、专家笔…

字节跳动社招面经 —— BSP驱动工程师(5)

接前一篇文章&#xff1a;字节跳动社招面经 —— BSP驱动工程师&#xff08;4&#xff09; 本文内容参考&#xff1a; ARM64架构启动流程_arm64 linux kernel 启动流程-CSDN博客 特此致谢&#xff01; 上一回讲解了“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工…

超越与沉浸:关于意识觉醒的量子化生存艺术

一、现象世界的认知架构&#xff1a;从AR渲染到神经编译 人类意识系统犹如搭载生物算法的增强现实&#xff08;AR&#xff09;设备&#xff0c;每秒将4000万比特的原始感官数据&#xff0c;通过神经编译引擎压缩成40比特的认知全息图。在这个过程中&#xff1a; 海马体材质库自…

自主设计一个DDS信号发生器

DDS发生器 DDS信号发生器是直接数字频率合成技术&#xff0c;采用直接数字频率合成(Direct Digital Synthesis&#xff0c;简称DDS)技术&#xff0c;把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平&#xff0c;并且可以在很宽的频率范围内进行精细的频率调节。采…