[关闭]
@xushengkai 2023-01-01T05:38:15.000000Z 字数 15330 阅读 347

Nginx-入门篇2

nginx


[TOC]

一.Nginx WEB模块

1.连接状态(stub_status_module)

用来观察用户和nginx的连接数量信息

1.查询模块是否安装

  1. [root@xsk ~]# nginx -V 2>&1 | grep stub_status
  2. 参数解释:
  3. 2>&1:把正确的和错误的输出重定向

2.启动状态模块

  1. 为了保证实验的唯一性,我把上面我创建的网站删掉
  2. [root@xsk ~]# rm -rf /etc/nginx/conf.d//xsk.conf
  3. [root@xsk ~]# rm -rf /xsk/
  4. [root@xsk ~]# systemctl restart nginx
  5. nginx页面
  6. [root@xsk ~]# vim /etc/nginx/conf.d/default.conf
  7. server{ 下面写入一下内容,2-5
  8. 1 server {
  9. 2 location /nginx_status { #当有人访问这个页面时给他看这个模块
  10. 3 stub_status; #模块名
  11. 4 allow all; #用户访问页面的权限,所有用户都可以访问
  12. 5 }

3.重启服务,再次访问

  1. [root@xsk ~]# systemctl restart nginx
  2. 打开浏览输入http://192.168.200.149/nginx_status
  3. 显示内容:
  4. Active connections: 1 #几个人在连接
  5. server accepts handled requests #连接了多少次
  6. 1 1 1 #总连接数;成功连接数;总共处理的请求数
  7. Reading: 0 Writing: 1 Waiting: 0
  8. #Reading :读取客户端Header的信息数 请求头
  9. #Writing:返回给客户端的header的信息数 响应头
  10. #Waiting:等待的请求数,开启了keepalive

2.关于连接的问题

什么是连接?

OSI封装回顾
OSI数据封装与解封装
TCP封装结构
TCP封装结构
TCP三次握手

step1:第一次握手
建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号seq=x,并进入SYN_SENT状态,等待服务器确认。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)。

step2:第二次握手
服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号seq(服务器)=y,以及服务器对客户端初始序号的确认号ack(服务器)=seq(客户端)+1=x+1)。

step3:第三次握手
客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。

未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包时,删除该条目,服务器进入ESTAB_LISHED状态。

TCP四次挥手

step1:第一次挥手
首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。

step2:第二次挥手
服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一

step3:第三次挥手
关闭服务器到客户端的连接,发送一个FIN给客户端。

step4:第四次挥手
客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

客户端发送FIN后,进入终止等待状态,服务器收到客户端连接释放报文段后,就立即给客户端发送确认,服务器就进入CLOSE_WAIT状态,此时TCP服务器进程就通知高层应用进程,因而从客户端到服务器的连接就释放了。此时是“半关闭状态”,即客户端不可以发送给服务器,服务器可以发送给客户端。
此时,如果服务器没有数据报发送给客户端,其应用程序就通知TCP释放连接,然后发送给客户端连接释放数据报,并等待确认。客户端发送确认后,进入TIME_WAIT状态,但是此时TCP连接还没有释放,然后经过等待计时器设置的2MSL后,才进入到CLOSED状态。

TCP机制(四大计时器)

重传计时器(Retransmession)
持久计时器(Persistance)
保活计时器(keep-alive)
时间等待(time-wait)

TCP流控/拥塞管理

原理:

接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区打满。这个时候如果继续发送数据,就会导致丢包等一系列连锁反应。
所以TCP支持根据接收端能力来决定发送端的发送速度。这个机制叫做流控制。

窗口大小:
(接收端向发送端主机通知自己可以接受数据的大小,这个大小限制就叫做窗口大小)

什么是请求

一次HTTP查询

keepalived
从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接

长连接设置

HTTP守护进程,一般都提供了keepalive_timeout时间设置参数,比如nginx的keepalive_timeout,

  1. [root@xsk ~]# vim /etc/nginx/nginx.conf
  2. 27 keepalive_timeout 65;

和Apache的keepalivetimeout,这个时间值意味着:一个HTTP产生的TCP连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接,当HTTP守护发送完一个响应后,理应马上主动关闭相应的TCP连接,设置keepalive_timeout后,HTTP守护进程会想说:“再等等吧,看看浏览器还有没有请求过来”这一等便是keepalive_timeout时间,如果守护进程在这个等待时间里,一直没有收到浏览发过来的http请求,则关闭这个http连接

3.随机主页(random_index_module)

目的:微更新,将主页设置成随机页面,是一种微调更新机制

示例:

创建主页目录

  1. [root@xsk ~]# mkdir /app

创建多个主页

  1. [root@xsk ~]# touch /app/{blue.html,green.html,red.html,.yellow.html}
  2. [root@xsk ~]# ll -a /app/
  3. 总用量 0
  4. drwxr-xr-x 2 root root 77 12 3 15:40 .
  5. dr-xr-xr-x. 18 root root 235 12 3 15:38 ..
  6. -rw-r--r-- 1 root root 0 12 3 15:40 blue.html
  7. -rw-r--r-- 1 root root 0 12 3 15:40 green.html
  8. -rw-r--r-- 1 root root 0 12 3 15:40 red.html
  9. -rw-r--r-- 1 root root 0 12 3 15:40 .yellow.html

在不同的页面插入不同的内容,内容不重要,复制粘贴就可以了。

  1. [root@xsk ~]# vim /app/red.html
  2. <html>
  3. <head>
  4. <title>green color</title>
  5. </head>
  6. <body style="background-color:red">
  7. <h1>red color!</h1>
  8. </body>
  9. </html>
  10. [root@xsk ~]# vim /app/.yellow.html
  11. <html>
  12. <head>
  13. <title>green color</title>
  14. </head>
  15. <body style="background-color:yellow">
  16. <h1>yellow color!</h1>
  17. </body>
  18. </html>
  19. [root@xsk ~]# vim /app/green.html
  20. <html>
  21. <head>
  22. <title>green color</title>
  23. </head>
  24. <body style="background-color:green">
  25. <h1>green color!</h1>
  26. </body>
  27. </html>
  28. <html>
  29. <head>
  30. <title>green color</title>
  31. </head>
  32. <body style="background-color:blue">
  33. <h1>blue color!</h1>
  34. </body>
  35. </html>

启动随机主页

  1. [root@xsk ~]# vim /etc/nginx/conf.d/default.conf
  2. 1 server {
  3. 2 location /nginx_status {
  4. 3 stub_status;
  5. 4 allow all;
  6. 5 }
  7. 6 listen 80;
  8. 7 server_name localhost;
  9. 8
  10. 9 #access_log /var/log/nginx/host.access.log main;
  11. 10
  12. 11 location / {
  13. 12 #root /usr/share/nginx/html; #把12,13行注释掉
  14. 13 #index index.html index.htm;
  15. 14 root /app; #添加14,15行的内容
  16. 15 random_index on;
  17. 16 }
  18. 重启nginx
  19. [root@xsk ~]# systemctl restart nginx

打开浏览器,输入服务器IP,多次刷新页面,会展示出不同颜色的页面,实验成功,但是只能看到红色,绿色,蓝色的页面,不能看到黄色的页面,是因为黄色页面的文件是隐藏文件

4.替换模块(sub_module)

目的:网页内容替换,如果我们用模板生成网站的时候,因为疏漏或者别的原因造成代码不如意,但是此时因为文件数量巨大,不方便全部生成,那么这个时候我们就可以用此模块来暂时实现纠错,另一方面,我们也可以利用这个实现服务器端文字过滤的效果

示例:

  1. 启动nginx默认页面,先将上个实验的注释内容的取消,添加的内容注释掉。改完以后就是下面的内容
  2. [root@xsk ~]# vim /etc/nginx/conf.d/default.conf
  3. 11 location / {
  4. 12 root /usr/share/nginx/html;
  5. 13 index index.html index.htm;
  6. 14 #root /app;
  7. 15 #random_index on;
  8. 然后在第一行的下面添加下以内容,2-3
  9. 1 server {
  10. 2 sub_filter nginx "shengkai"; #过滤nginx换成shengkai
  11. 3 sub_filter_once off; #过滤一次关闭

重启nginx

  1. [root@xsk ~]# systemctl restart nginx

打开浏览器输入服务器IP,查看结果:Welcome to shengkai!

5.文件读取模块(ngx_http_core_module)

语法:sendfile on|off;

原理介绍
sendfile
未使用sendfile()的传统网络传输过程:
硬盘-->内核空间-->用户空间-->内核的接口缓存-->协议栈
使用sendfile()来进行网络传输的过程:
硬盘-->内核空间(快速拷贝到内核的接口缓存)-->协议栈

默认sendfile on;

  1. [root@xsk ~]# vim /etc/nginx/nginx.conf
  2. 24 sendfile on;
  3. 安装好nginx后,默认打开

tcp_nopush
未使用tcp_nopush()网络资源浪费
应用程序每产生一次操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据以及40个字节长的包头,于是产生4000%的过载,很轻易的就能令网络发生拥塞,同时也浪费资源
使用tcp_nopush()网络传输效率提升
当包累计到一定大小后再发送

  1. [root@xsk ~]# vim /etc/nginx/nginx.conf
  2. 25 #tcp_nopush on;
  3. 默认是关闭的,打开以后可以起到优化nginx的作用

tcp_nodelay
开启或关闭nginx使用tcp_nodelay选项的功能,这个选项仅在将链接转变为长连接的时候才被禁用
tcp_nodelay是禁用Nagle算法,即数据包立即发送出去
由于Nagle和DelayedACK的原因,数据包的确认信息需要积攒到两个时才发送,长连接情况下,奇数包会造成延时40ms,所以tcp_nodelay会将ack立刻发出去,如果不在长连接时,可以关闭此模块,因为ack会被立刻发出去

示例:

  1. 启用模块这三个模块,重启nginx,不需要验证,因为肉眼看不到的效果
  2. [root@xsk ~]# vim /etc/nginx/nginx.conf
  3. 24 sendfile on;
  4. 25 tcp_nopush on;
  5. 26 tcp_nodelay on;
  6. [root@xsk ~]# systemctl restart nginx

6.文件压缩(ngx_http_gzip_module)

原理
启动该模块,使文件传输前进行压缩,提升传输效率

语法
gizp on | off;
默认:gzip off;

  1. [root@xsk ~]# vim /etc/nginx/nginx.conf
  2. 29 #gzip on;

压缩级别
语法:gzip_comp_level level(1-9);
默认:gzip_comp_level 1;

压缩版本
语法:gzip_http_version 1.0 | 1.1;
默认:gzip_http_version 1.0;

示例:
1.观察未压缩传输

  1. 拷贝文本到文件主目录
  2. [root@xsk ~]# cd /usr/share/nginx/html/
  3. [root@xsk html]# vim 1.html
  4. 在里面写上大量内容
  5. [root@xsk html]# ll -h
  6. 总用量 5.0M
  7. -rw-r--r-- 1 root root 210.0M 12 4 08:59 1.html
  8. -rw-r--r-- 1 root root 497 10 19 18:48 50x.html
  9. -rw-r--r-- 1 root root 615 10 19 18:48 index.html

1.2通过浏览器下载文件并观察下载后的大小,http:192.168.200.149/1.html,点击F12,进入控制台

未压缩的文件大小

2.启动压缩功能

  1. [root@xsk ~]# vim /etc/nginx/nginx.conf
  2. 在第14行下面添加以下内容
  3. 14 http {
  4. 15 gzip on; #打开压缩功能
  5. 16 gzip_http_version 1.1; #用1.1版本
  6. 17 gzip_comp_level 9; #压缩级别最高9
  7. 18 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #可以压缩的内容:文本;脚本;网页文件;java脚本,网页文件,http/php模块,图像
  8. 19 gzip_static on; #开启静态压缩
  9. 重启nginx
  10. [root@xsk ~]# systemctl restart firewalld

3.观察压缩传输,通过浏览器下载文件并观察下载后的大小,http:192.168.200.149/1.html,点击F12,进入控制台,压缩以后从210MB变成了916KB

压缩以后的大小

7.页面缓存(ngx_http_headers_module)

expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求,要配置expires,可以在http段中(所有的服务器)或者server段中(本服务器)或者loaction段中(本页面)加入。
Nginx(expires缓存减轻服务端压力)

语法
expires time;
expires epoch | max | off;
默认:expires off;

  1. epoch:指定expires的值为1
  2. max:指定expires的值为10
  3. -1:指定expires的值为当前服务器时间-1s,即永远过期
  4. off:不修改expiresCache-Control的值

原理
无缓存,每次访问服务器均是全文传输,开启缓存可以加速浏览网站

示例:
1.打开浏览器缓存,浏览默认页面,放个图片才会看到缓存的状态,主页不缓存

200
300

2.禁用缓存浏览页面,返回码200全文传输,理解浏览器缓存作用

此处输入图片的描述
此处输入图片的描述

3.解析缓存原理

解析缓存原理图

4.开启服务器缓存模块

  1. [root@xsk ~]# vim /etc/nginx/conf.d/default.conf
  2. 14行的下面添加以下内容
  3. 14 location / {
  4. 15 expires 24h;
  5. 重启nginx
  6. [root@xsk ~]# systemctl restart nginx

5.再次打开浏览器查看,观察响应头出现服务器回复的缓存时间86400秒就是我们设置的24h
此处输入图片的描述

理解nginx服务器启动缓存时间,加速浏览,缺点是时效性降低

8.防盗链(ngx_http_referer_module)

语法:valid_refereers none | blocked |server_names |string..;

日志原理介绍

  1. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  2. '$status $body_bytes_sent "$http_referer" '
  3. '"$http_user_agent" "$http_x_forwarded_for"';

日志格式中的http_referer是记录访问点引用是URL,也就是超链接的上一级地址,通过这段地址可以发现一种网络行为--盗链,非法盗链会影响站点的正常访问,通过http_referer模块可以控制这一点,防止非法盗链现象

示例
展现防盗链现象,启动防盗链
1.搭建一个a.com网站,在主页中插入图片

  1. #创建主页的配置文件
  2. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  3. server {
  4. listen 80;
  5. server_name a.com;
  6. location / {
  7. root /a.com;
  8. index index.html;
  9. }
  10. }
  11. #给主页创建内容,添加图片
  12. [root@xsk ~]# vim /a.com/index.html
  13. <img src='1.jpg' />
  14. #准备1.png图片,注意权限可读
  15. [root@xsk ~]# cd /a.com/
  16. [root@xsk a.com]# rz
  17. [root@xsk a.com]# ll -d 1.jpg
  18. -rw-r--r-- 1 root root 19784 11 29 10:16 1.jpg
  19. #重启nginx
  20. [root@xsk a.com]# systemctl restart nginx

1.2打开一台桌面模式的linux客户机来验证

  1. #关闭安全机制
  2. [root@192 ~]# systemctl stop firewalld
  3. [root@192 ~]# setenforce 0
  4. #在客户机上做域名解析
  5. [root@192 ~]# vim /etc/hosts
  6. 192.168.200.149 a.com b.com
  7. #在客户机上打开火狐浏览器查看a.com页面,显示出我刚才添加的照片

2.搭建一个b.com网站,在主页中盗链网站上搜索的图片

  1. #创建主页的配置文件
  2. [root@xsk ~]# vim /etc/nginx/conf.d/b.com.conf
  3. server {
  4. listen 80;
  5. server_name b.com;
  6. location / {
  7. root /b.com;
  8. index index.html;
  9. }
  10. }
  11. #给主页创建内容,这次盗链网站上搜索的图片
  12. [root@xsk ~]# cd /b.com
  13. [root@xsk b.com]# vim index.html
  14. <img src="https://img.zcool.cn/community/019f4b6022a5ec11013f792878170a.jpg@1280w_1l_2o_100sh.jpg" />
  15. #重启nginx
  16. [root@xsk b.com]# systemctl restart nginx
  17. #在linunx客户机上打开火狐浏览器访问b.com,显示的内容就是我从网站搜索的图片

3.在b.com上盗链a.com网站的图片

  1. [root@xsk b.com]# vim index.html
  2. <img src="http://a.com/1.jpg" />
  3. #在linux客户机上打开火狐浏览器访问b.com显示的页面和a.com的页面一样

访问两个网站页面,均能正常显示图片

4.将a.com和b.com两个网站的日志分离

  1. #设置a网站的日志
  2. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  3. #在server{ 的下面添加以下内容
  4. 1 server {
  5. 2 access_log /var/log/nginx/a.com.access.log main;
  6. #设置b网站的日志
  7. [root@xsk ~]# vim /etc/nginx/conf.d/b.com.conf
  8. #在server{ 的下面添加以下内容
  9. 1 server {
  10. 2 access_log /var/log/nginx/b.com.access.log main;
  11. #重启nginx
  12. [root@xsk ~]# systemctl restart nginx
  13. #这时候nginx的日志目录下多了两个日志,一个a网站的,一个b网站的
  14. [root@xsk ~]# ls /var/log/nginx/
  15. access.log access.log-20221204 error.log-20221201.gz
  16. access.log-20221201.gz a.com.access.log error.log-20221202.gz
  17. access.log-20221202.gz b.com.access.log error.log-20221203.gz
  18. access.log-20221203.gz error.log error.log-20221204

5.注意啊a.com和b.com网站的日志

  1. #多次刷新b网站,观察b网站的日志正常
  2. [root@xsk ~]# tail -f /var/log/nginx/b.com.access.log
  3. 192.168.200.138 - - [04/Dec/2022:15:03:44 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"
  4. #观察a网站的日志,日志不正常
  5. [root@xsk ~]# tail -f /var/log/nginx/a.com.access.log
  6. 192.168.200.138 - - [04/Dec/2022:15:05:09 +0800] "GET /1.jpg HTTP/1.1" 304 0 "http://b.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"

总结:在多次访问b网站时,a网站的日志莫名其妙的产生了,观察referer字段,发现被盗链了,这个时候就需要防盗链的技术,阻止这个行为的发生

6.启用a网站的防盗链功能

  1. #在a网站的配置文件中location / {的下面添加以下内容
  2. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  3. 5 location / {
  4. 6 valid_referers none blocked *.a.com; #没有人可以引用,锁住所有的a.com
  5. 7 if ($invalid_referer){ #如果有人访问我,就返回403包括,此时a网站也是不能访问的
  6. 8 return 403;
  7. 9 }
  8. #重启nginx
  9. [root@xsk ~]# systemctl restart nginx
  10. #在linux客户机上打开火狐浏览器再次访问b.com,此时页面丢失,设置防盗链成功

7.如果希望某些网站能够使用盗链资源,怎么操作?请看下面操作(白名单功能)

  1. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  2. 1 server {
  3. 2 access_log /var/log/nginx/a.com.access.log main;
  4. 3 listen 80;
  5. 4 server_name a.com;
  6. 5 location / {
  7. 6 valid_referers none blocked *.a.com server_name
  8. ~\.google\. ~\.baidu\. b.com 192.168.200.* a.com;
  9. #像是以.google结束的网站,像是以.baidu结束的网站,b.com,192.168.200.*整个200网段,b.com;
  10. 7 if ($invalid_referer){
  11. 8 return 403;
  12. 9 }
  13. 10 root /a.com;
  14. 11 index index.html;
  15. 12 }
  16. 13 }

再次盗链,用linux客户机打开火狐浏览器访问两个网站,显示页面的都是a网站的图片,设置白名单成功

9.Nginx 访问限制

ngx_http_limit_req_module

目的:限制http请求

1.测试未限制情况下的访问

  1. #安装压力测试工具
  2. [root@xsk ~]# yum -y install httpd-tools
  3. #设置域名解析
  4. [root@xsk ~]# vim /etc/hosts
  5. 192.168.200.149 xsk.com a.com
  6. #开始测试
  7. [root@xsk ~]# ab -n 100 -c 10 http://a.com/ #发起一百次请求,分十次发送,向a.com网站的根目录发送
  8. Benchmarking a.com (be patient).....done
  9. Server Software: nginx/1.22.1 #服务器版本
  10. Server Hostname: a.com #服务器主机名
  11. Server Port: 80 #服务器端口
  12. Document Path: / #申请内容根目录
  13. Document Length: 20 bytes #文档长度
  14. Concurrency Level: 10 #发送了10次
  15. Time taken for tests: 0.003 seconds #测试总耗时
  16. Complete requests: 100 #完成100次的请求
  17. Failed requests: 0 #失败0次
  18. Write errors: 0 #写入错误0次
  19. Total transferred: 25100 bytes #已经传输了25100字节
  20. HTML transferred: 2000 bytes #HTML传输了2000字节
  21. Requests per second: 36153.29 [#/sec] (mean) #吞吐率
  22. Time per request: 0.277 [ms] (mean) #平均等待时间
  23. Time per request: 0.028 [ms] (mean, across all concurrent requests)
  24. Transfer rate: 8861.79 [Kbytes/sec] received
  25. Connection Times (ms)
  26. min mean[+/-sd] median max
  27. Connect: 0 0 0.0 0 0
  28. Processing: 0 0 0.0 0 0
  29. Waiting: 0 0 0.0 0 0
  30. Total: 0 0 0.1 0 0
  31. Percentage of the requests served within a certain time (ms)
  32. 50% 0
  33. 66% 0
  34. 75% 0
  35. 80% 0
  36. 90% 0
  37. 95% 0
  38. 98% 0
  39. 99% 0
  40. 100% 0 (longest request)

启动限制,共两步,定义和引用

定义:limit_req_zone binary_remote_addr:二进制地址
zone=req_zone:限制策略的名称
10m:占用10M空间
rate=1r/s:允许每秒一次请求

引用:limit_rep zone=req_zone (引用限制策略的名称)

2.定义

  1. [root@xsk ~]# vim /etc/nginx/nginx.conf
  2. #在http模块内,在http {的下面添加以下的内容
  3. 14 http {
  4. 15 limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; #定义
  5. #在a.com的配置文件中引用,在location / {下面添加以下内容
  6. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  7. 1 server {
  8. 2 access_log /var/log/nginx/a.com.access.log main;
  9. 3 listen 80;
  10. 4 server_name a.com;
  11. 5 location / {
  12. 6 limit_req zone=req_zone; #引用
  13. #重启nginx
  14. [root@xsk ~]# systemctl restart nginx

3.再次进行压力测试

  1. [root@xsk ~]# ab -n 100 -c 10 http://a.com/
  2. Concurrency Level: 10
  3. Time taken for tests: 0.003 seconds
  4. Complete requests: 100
  5. Failed requests: 99
  6. (Connect: 0, Receive: 0, Length: 99, Exceptions: 0)
  7. Write errors: 0
  8. Non-2xx responses: 99
  9. Total transferred: 36782 bytes
  10. HTML transferred: 19523 bytes
  11. Requests per second: 35186.49 [#/sec] (mean)
  12. Time per request: 0.284 [ms] (mean)
  13. Time per request: 0.028 [ms] (mean, across all concurrent requests)
  14. Transfer rate: 12638.96 [Kbytes/sec] received
  15. Connection Times (ms)
  16. min mean[+/-sd] median max
  17. Connect: 0 0 0.0 0 0
  18. Processing: 0 0 0.0 0 0
  19. Waiting: 0 0 0.0 0 0
  20. Total: 0 0 0.1 0 1
  21. Percentage of the requests served within a certain time (ms)
  22. 50% 0
  23. 66% 0
  24. 75% 0
  25. 80% 0
  26. 90% 0
  27. 95% 0
  28. 98% 0
  29. 99% 1
  30. 100% 1 (longest request)
  31. #查看测试结果发现发起了100次请求,但是99次请求都被拒绝了,因为设置限制以后,服务器认为恶意攻击

4.观察错误日志,99个访问拒绝的日志

  1. [root@xsk ~]# cat /var/log/nginx/error.log
  2. 2022/12/04 17:07:19 [error] 2065#2065: *71 limiting requests, excess: 0.999 by zone "req_zone", client: 192.168.200.149, server: a.com, request: "GET / HTTP/1.0", host: "a.com"

bngx_http_limit_conn_module

目的:通过IP地址,限制连接(TCP)。实验环境无法测试

1.启动连接频率限制,和限制http请求基本一样

  1. [root@xsk ~]# vim /etc/nginx/nginx.conf
  2. http {
  3. limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
  4. }
  5. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  6. server {
  7. location / {
  8. ...
  9. limit_conn conn_zone 1;
  10. }
  11. }

2.测试

  1. ab -n 100 -c 10 http://服务器IP地址/

了解不同的网站压力测试工具

二.Nginx 访问控制

1.基于主机(IP)

模块:ngx_http_access_module
两个关键指令
allow允许某些主机
deny拒绝某些主机

语法:
allow address |网段 | unix:|all;
适用范围:http,server,location,limit_except

示例
1.限制主机访问

  1. #在server {的下面添加2-3行的内容
  2. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  3. 1 server {
  4. 2 allow 192.168.200.1; #允许这个主机访问
  5. 3 deny all; #所有的主机都拒绝
  6. 4 access_log /var/log/nginx/a.com.access.log main;
  7. 5 listen 80;
  8. 6 server_name a.com;
  9. 7 location / {
  10. 8 #limit_req zone=req_zone; #注释掉此行,前面实验的设置会影响本次实验
  11. #重启nginx
  12. [root@xsk ~]# systemctl restart nginx

2.测试

打开linux客户机的火狐浏览器访问a.com页面,显示“403 Forbidden”,因为我客户机的IP是192.168.200.138,属于被拒绝的主机,设置成功

2.基于用户(username&password)

模块:ngx_http_auth_basic_module

语法

第一种:auth_basic string| off;
适用范围:http,server,location,limit_except

第二种(常用):auth_basic_user_file file;
通过加密文件,加密文件是独立存储的,需要调用
适用范围:http,server,location,limit_except

示例

1.建立认证文件

  1. #安装需要加密的工具
  2. [root@xsk ~]# yum -y install http-tools
  3. #为用户创建密码
  4. [root@xsk ~]# htpasswd -cm /etc/nginx/conf.d/passwd user10
  5. New password: #输入需要设置的密码
  6. Re-type new password: #再次输入
  7. Adding password for user user10 #为用户10创建密码
  8. [root@xsk ~]# htpasswd -m /etc/nginx/conf.d/passwd user20
  9. New password:
  10. Re-type new password:
  11. Adding password for user user20
  12. #参数解释:
  13. -c:创建新的文件,如果文件已存在,去掉-c参数
  14. -m:加密
  15. #查看创建的口令文件
  16. [root@xsk ~]# cat /etc/nginx/conf.d/passwd
  17. user10:$apr1$Hd/4RhCb$CTHA9q6.9w3vNr3h6w9Ek.
  18. user20:$apr1$LTRvquy1$YI2b1aTWYmITIlVrk543G/

2.启动认证

  1. #在a.com的配置文件中,server {的下面写入以下内容2-3行
  2. [root@xsk ~]# vim /etc/nginx/conf.d/a.com.conf
  3. 1 server {
  4. 2 auth_basic "lai le lao di!!"; #认证基础信息“欢迎词”
  5. 3 auth_basic_user_file /etc/nginx/conf.d/passwd; #基础认证文件的位置
  6. 4 #allow 192.168.200.1; #把上个实验的两行注释掉,不然无法访问
  7. 5 #deny all;
  8. #重启nginx
  9. [root@xsk ~]# systemctl restart nginx

3.测试

打开linux客户机的火狐浏览器,访问a.com的页面,需要用户名和密码才能看到页面内容,输入刚才设置的两个用户名和对应的密码进行访问
访问结果

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注