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;
}
七.总结
本期内容还是有点多的,大家做个了解一下,点赞关注加收藏,做个了结,遇到的时候再来具体配置