当前位置: 首页 > news >正文

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

一.前言

本期继续来介绍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;

        }

七.总结 

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

 

 

 

相关文章:

  • 配置刷新技术
  • DAY01:【ML 第三弹】基本概念和建模流程
  • JS手写代码篇---手写类型判断函数
  • Python中三种不同包读取csv文件数据的方式:numpy、pandas、csv
  • Shell
  • android binder(三)binder.c函数分析
  • hadoop伪分布式配置(单机)
  • Unity中的MonoSingleton<T>与Singleton<T>
  • 回测效率提升500%!khQuant打板策略回测性能深度剖析——基于miniQMT的回测系统深度优化【AI量化第29篇】
  • AI矢量软件|Illustrator 2025网盘下载与安装教程指南
  • PAT-甲级JAVA题解(更新中...)
  • 浅写弱口令与命令爆破
  • 中科院报道铁电液晶:从实验室突破到多场景应用展望
  • 动中通天线跟踪性能指标的测试
  • windows11安装scoop 20250602
  • RAG入门 - Retriever(1)
  • 每天总结一个html标签——a标签
  • 第一章:计算机系统概论
  • AI智能体|扣子(Coze)搭建【合同/文档审查】工作流
  • Modern C++(二)预处理器及表达式
  • WordPress追番页面/重庆百度快照优化
  • 旅游网站模板html免费下载/广州企业网站推广
  • 政务中心网站建设方案/免费网站怎么做出来的
  • 网站在线客服插件代码/国际新闻最新消息2022
  • 建网站要租服务器吗/百度热搜风云榜
  • 怎样在微信公众号里做微网站/淘宝seo搜索引擎优化