Brc's blog
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于

Brc

努力中
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于
  • Linux基础

  • Linux进阶

    • shell

    • nginx

      • nginx快速入门
        • Nginx基本简述
          • 什么是Nginx
          • 为什么选择Nginx
          • 高性能、高并发
          • 高扩展性
          • 高可靠性
          • 热部署
          • 应用广泛
          • 网络模型
          • Nginx应用场景
          • Nginx组成部分
        • Nginx快速安装
          • 安装Nginx软件所需依赖包
          • 配置nginx官方yum源
          • 安装Nginx服务,启动并加入开机自启
          • 访问测试
          • 检查Nginx软件版本以及编译参数
          • 查看整体目录及对应功能
          • Nginx主配置文件
          • Nginx代理相关参数文件
          • Nginx编码相关配置文件
          • Nginx管理相关命令
          • Nginx日志相关目录与文件
        • Nginx基本配置
        • Nginx虚拟主机
          • 基于多IP的虚拟主机配置实战
          • 基于多端口虚拟主机配置实战
          • 基于host名称的虚拟主机配置实战
        • Nginx Location
          • 什么是Location
          • Location语法
          • location优先级语法示例
          • Locaiton规则配置应用场景
        • Nginx常用模块
          • Nginx目录索引
          • Nginx访问控制
          • 限制地址访问
          • 身份认证
          • Nginx限流限速
          • 限速应用场景
          • 请求频率限速实现的原理?
          • 场景实践一、限制单位时间内所产生的Http请求数。
          • 场景实践二、限制客户端同一时刻的并发连接数。
          • 场景实践三、限制下载速度。
          • 综合案例
          • Nginx状态监控
      • LNMP架构
      • Nginx反向代理
      • Nginx七层负载均衡
      • Rewrite重写
      • HTTPS
    • keepalived

    • LVS

    • ansible

    • docker

    • mysql

  • 其他

  • 运维
  • Linux进阶
  • nginx
Brc
2021-08-08
目录

nginx快速入门

# Nginx基本简述

# 什么是Nginx

  • Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。
    • 开源,体现在直接获取Nginx的源代码;
    • 高性能,体现在支持海量的并发;
    • 高可靠,体现在服务稳定;

# 为什么选择Nginx

# 高性能、高并发

通常正常情况下,单次请求会得到更快的响应。另一方面在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求。

# 高扩展性

Nginx功能模块化。Nginx官方提供了非常多的优秀模块提供使用。这些模块都可以实现快速增加和减少。

# 高可靠性

所谓高可靠性,是指Nginx可以在服务器上持续不间断的运行,而很多web服务器往往运行几周或几个月就需要进行一次重启。对于nginx这样的一个高并发、高性能的反向代理服务器而言,他往往运行网站架构的最前端,那么此时如果我们企业如果想提供9999、99999,对于nginx持续运行能够宕机的时间,一年可能只能以秒来计算,所以在这样的一个角色中,nginx的高可靠性为我们提供了非常好的保证。

# 热部署

热部署是指在不停服务的情况下升级nginx,这个功能非常的重要。对于普通的服务,只需要kill掉进程在启动,但对于Nginx而言,如果Nginx有很多的客户端连接,那么kill掉Nginx。Nginx会像客户端发送tcp reset复位包,但很多客户端无法很好的理解reset包,就会造成异常。由于Nginx的master管理进程与worker工作进程的分离设计,使得Nginx能够在7×24小时不间断服务的前提下,升级Nginx的可执行文件。当然,也支持不停止服务更新配置、更换日志文件等功能。

# 应用广泛

首先Nginx技术成熟,具备企业最常使用的功能,如代理、代理缓存、负载均衡、静态资源、动静分离、Https、Inmp、Inmt等等。

其次使用Nginx统一技术栈,降低维护成本,同时降低技术更新成本。

# 网络模型

Nginx使用Epool网络模型,而常听到Apache采用的是Select网络模型。

Select:当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。

Epoll:当用户发起请求,epoll模型会直接进行处理,效率高效。

# Nginx应用场景

Nginx的主要使用场景我归纳为三个,分为是静态资源服务、代理资源服务、安全服务,场景详细介绍如下

如下图是一个网站的基本架构,首先用户请求先到达nginx,然后在到 tomcat或php这样的应用服务器,然后应用服务器在去访问redis、mysql这样的数据库,提供基本的数据功能。

image-20210810101545448

那么这里有一个问题,我们的程序代码要求开发效率高,所以他的运行效率是很低的,或者说它并发是受限,所以我们需要很多应用服务组成一个集群,为更多用户提供访问。

而应用服务一但构成集群,则需要我们的nginx具有反向代理功能,这样可以将动态请求传倒给集群服务。

但很多应用构成集群,那么一定会带来两个需求。

​ 1、应用服务器需要动态扩展。

​ 2、有些服务出问题需要做容灾。

那么我们的反向代理必须具备负载均衡功能。

image-20210810101642931

其次,随着我们网络链路的增长,用户体验到的时延则会增加。如果我们能把一段时间内不会发生变化的"动态"内容,缓存在Nginx,由Nginx直接向用户提供访问,那么这样用户请求的时延就会减少很多,所以在这里反向代理会演生出另外一个功能"缓存",因为它能加速我们的访问。

image-20210810101739676

在很多时候我们访问docs、pdf、mp4、png等这样的静态资源时,是没有必要将这些请求通过Nginx交给后端的应用服务,我们只需要通过Nginx直接处理“静态资源"即可。这是Nginx的静态资源功能。

image-20210810102132830

当我们使用http网站时,可能会遭到劫持和篡改,如果使用https安全通讯协议,那么数据在传输过程中是加密的,从而能有效的避免黑客窃取或者篡改数据信息,同时也能避免网站在传输过程中的信息泄露。大大的提升我们网站安全。

image-20210810102217672

PS: Nginx的功能非常的强大,远不止上面列出一角。

# Nginx组成部分

在这里我们将Nginx的组成架构比喻为一辆汽车:

这个汽车提供了基本的驾驶功能,但是还需要一个驾驶员控制这辆汽车开往哪个方向,同时该汽车行驶过的地方还会形成GPS轨迹,如果汽车在行驶的过程中出现了任何问题,我们需要一个黑匣子,分析是汽车本身的问题,还是驾驶人员的操作出现了问题。

image-20210810102336558

  1. 第一个组成部分Nginx二进制可执行文件:它是Nginx本身框架以及相关模块等构建的一个二进制文件,这个文件就相当于汽车本身,所有的功能都由它提供。
  2. 第二个组成部分Nginx.conf文件:它相当于驾驶人员,虽然二进制可执行文件已经提供了许多的功能,但是这些功能究竟有没有开启,或者开启后定义怎样的行为去处理请求,都是由nginx.conf这个文件决定的,所以他就相当于这个汽车的驾驶员,控制这个汽车的行为。
  3. 第三个组成部分access.log:它相当于这辆汽车经过所有地方形成的GPS轨迹,access.log会记录Nginx处理过的每一条HTTP的请求信息、响应信息。
  4. 第四个组成部分error.log:它相当于黑匣子,当出现了一些不可预期的问题时,可以通过error.log将问题定位出来。

Nginx组成部分小结∶

Nginx的组成部分是相辅相成,Nginx二进制可执行文件和Nginx.conf文件,它定义了Nginx处理请求的方式。

而如果我们想对nginx服务做一些web的运营和运维,需要对access.log做进一步分析。

而如果出现了任何未知的错误,或者预期的行为不一致时,应该通过error.log去定位根本性的问题。

# Nginx快速安装

安装Nginx软件的方式分为以下几种:

  1. 源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐)
  2. epel仓库=>Nginx (1.版本较低 2.安装简单 3.配置不易读)
  3. 官方仓库=>Nginx (1.版本较新 2.安装简单 3.配置易读,推荐)

# 安装Nginx软件所需依赖包

[root@web ~]# yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake httpd-tools
1

# 配置nginx官方yum源

[root@web ~]# vim /etc/yum.repos.d/CentOS-nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
1
2
3
4
5
6
7

# 安装Nginx服务,启动并加入开机自启

[root@web ~]# yum install nginx -y
[root@web ~]# systemctl enable nginx
[root@web ~]# systemctl start nginx
1
2
3

# 访问测试

通过浏览器访问该服务器ip地址获取资源

# 检查Nginx软件版本以及编译参数

[root@web ~]# nginx -v
nginx version: nginx/1.16.0

[root@web ~]# nginx -V
1
2
3
4

# 查看整体目录及对应功能

可使用rpm -ql nginx查看整体目录结构及对应的功能,下表整理了Nginx比较重要的配置文件

# Nginx主配置文件

路径 类型 作用
/etc/nginx/nginx.conf 配置文件 nginx主配置文件
/etc/nginx/conf.d/default.conf 配置文件 默认网站配置文件

# Nginx代理相关参数文件

路径 类型 作用
/etc/nginx/fastcgi_params 配置文件 Fastcgi代理配置文件
/etc/nginx/scgi_params 配置文件 scgi代理配置文件
/etc/nginx/uwsgi_params 配置文件 uwsgi代理配置文件

# Nginx编码相关配置文件

路径 类型 作用
/etc/nginx/win-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-win 配置文件 Nginx编码转换映射文件
/etc/nginx/mime.types 配置文件 Content-Type与扩展名

# Nginx管理相关命令

路径 类型 作用
/usr/sbin/nginx 命令 Nginx命令行管理终端工具
/usr/sbin/nginx-debug 命令 Nginx命令行与终端调试工具

# Nginx日志相关目录与文件

路径 类型 作用
/var/log/nginx 目录 Nginx默认存放日志目录
/etc/logrotate.d/nginx 配置文件 Nginx默认的日志切割

# Nginx基本配置

Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块),EventModule(事件驱动模块),HttpCoreModule(http内核模块)

CoreModule核心模块

user www;							#Nginx进程所使用的用户
worker_processes 1;					#Nginx运行的work进程数量(建议与CPU数量一致或auto)
error_log /log/nginx/error.log		#Nginx错误日志存放路径
pid /var/run/nginx.pid				#Nginx服务运行后产生的pid进程号
1
2
3
4

events事件模块

events {
	worker_connections 25535;		#每个worker进程支持的最大连接数
	use epoll;						#事件驱动模型,epoll默认
}
1
2
3
4

http 内核模块

http {								#http层开始
...
	#使用Server配置网站,每个Server{}代表一个网站(简称虚拟主机)
	'server' {
		listen 80;					#监听端口,默认80
		server_name	birenchong.cn;	#提供的域名
		access_log access.log;		#该网站的访问日志
		#控制网站访问的路径
		'location' / {
			root	/usr/share/nginx/html;	#存放网站源代码的位置
			index	index.html index.htm;	#黑默认返回网站的文件
		}
	}
	...
	#第二个虚拟主机配置
	'server' {
	...
	}
	include /etc/nginx/conf.d/*.conf;	#包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
	#include作用是:简化主配置文件写太多造成臃肿,这样会让整体的配置文件更加的清晰。
}										#http层结束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

PS: Nginx中的http、server、location之间的关系是?

http 主要用来解决用户的请求与响应。

server 主要用来响应具体的某一个网站。

location 主要用于匹配网站具体URL路径。

http{} 层下允许有多个Server{},一个Server{}下又允许有多个location{}

# Nginx虚拟主机

通常在企业中可能会有很多业务系统,那么多套业务服务如何使用Nginx配置?

image-20210810141040369

如果使用如上方式部署,则需要多台服务器配置Nginx,但如果使用虚拟主机方式,则在同一个Nginx上运行多套单独服务,这些服务是相互独立的。简单来说,看似多套业务系统,实则可以运行在一台Nginx服务上

image-20210810141659085

Nginx配置虚拟主机有如下三种方式:

方式一、基于主机多IP方式

方式二、基于端口的配置方式

方式三、基于多个hosts名称方式(多域名方式)

# 基于多IP的虚拟主机配置实战

image-20210810143204706

配置多网卡多IP的方式

server {
	...
	listen 10.0.0.10:80;
	...
}

server {
	...
	listen 10.0.0.11:80;
	...
}
1
2
3
4
5
6
7
8
9
10
11

# 基于多端口虚拟主机配置实战

image-20210810144129402

Nginx多端口虚拟主机方式,具体配置如下

#仅修改listen监听端口即可,但不能和系统端口出现冲突
[root@web ~]# cat /etc/nginx/conf.d/port1.conf
server {
	...
	listen 80;
	...
}

[root@web ~]# cat /etc/nginx/conf.d/port2.conf
server {
	...
	listen 81;
	...
}

[root@web ~]# cat /etc/nginx/conf.d/port3.conf
server {
	...
	listen 82;
	...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 基于host名称的虚拟主机配置实战

image-20210810145008169

1.创建对应的web站点目录以及程序代码

[root@web ~]# mkdir /code/{server1,server2}
[root@web ~]# echo "server1" > /code/server1/index.html
[root@web ~]# echo "server2" > /code/server2/index.html
1
2
3

2.配置不同域名的虚拟主机

[root@web ~]# cat /etc/nginx/conf.d/server1.conf
server {
	listen 80;
	server_name	1.birenchong.cn;
	root /code/server1;
	index index.html;
	...
}

[root@web ~]# cat /etc/nginx/conf.d/server2.conf
server {
	listen 80;
	server_name	2.birenchong.cn;
	root /code/server2;
	index index.html;
	...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# Nginx Location

# 什么是Location

Location用来控制访问网站的uri路径

# Location语法

location [ = | ~ | ~* │ ^~ ] uri { ... }
location @name { ... }

# 匹配符	  匹配规则				优先级
# =			精确匹配				1
# ^~		以某个字符串开头			2
# ~			区分大小写的正则匹配			3
# ~*		不区分大小写的正则匹配			4
# /			通用匹配,任何请求都会匹配到		5
1
2
3
4
5
6
7
8
9

# location优先级语法示例

[root@web conf.d]# cat location.birenchong.cn.conf 
server {
 listen 80;
    server_name location.birenchong.cn;
    
    location = / {
    	default_type text/html;
    	return 200 'location = /';
    }
    
    location / {
    	default_type text/html;
    	return 200 'location /';
    }
    
    location /documents/ {
    	default_type text/html;
    	return 200 'location /documents/';
    }
    
    location ^~ /images/ {
    	default_type text/html;
    	return 200 'location ^~ /images/';
    }
    
    location ~* \.(gif|jpg|jpeg)$ {
        default_type text/html;
        return 200 'location ~* \.(gif|jpg|jpeg)';
    }
}

#测试结果如下(建议是curl测试)
#1.请求http://location.birenchong.cn/				会被location =/		匹配
#2.请求http://location.birenchong.cn/index.html	会被location /		匹配
#3.请求http://location.birenchong.cn/documents/1.html	会被location /documents/	匹配
#4.请求http://location.birenchong.cn/images/1.gif	会被location ^~ /images/	匹配
#5.请求http://location.birenchong.cn/documents/1.jpg	会被location ~* l.( gif|jpg|jpeg)$	匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# Locaiton规则配置应用场景

可进行验证测试

[root@web conf.d]# cat location2.birenchong.cn.conf
server {
	listen 80;
	server_name location2.birenchong.cn;
	
	#通用匹配,任何请求都会匹配到
	location / {
		root html;
		index index.html;
	}
	
	#精准匹配,必须请求的uri是/nginx_status
	location = /nginx_status {
    	stub_status;
    }
    
    #严格区分大小写,匹配以.php结尾的都走这个location
    location ~ \.php$ {
    	default_type text /html;
    	return 200 'php访问成功';
    }
    
    #严格区分大小写,匹配以.jsp结尾的都走这个location
    location ~ \.jsp$ {
    	default_type text/html;
    	return 200 'jsp访问成功';
    }

    #不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
    location ~* \.(jpglgif|pngljs|css)$ {
   		return 403;
    }
    
    #不区分大小写匹配
    location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
    	deny all;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# Nginx常用模块

# Nginx目录索引

当ngx_http_index_module模块找不到索引文件时,通常会将请求传递给ngx_http_autoindex_module模块。

ngx_http_autoindex_module模块处理以斜杠字符('/')结尾的请求,并生成目录列表。

1.指令

#启用或禁用目录列表输出,on开启,of杅关闭。
Syntax : autoindex on | off;
Default: autoindex off;
Context: http,server,location

#指定是否应在目录列表中输出确切的文件大小, on显示字节,off显示大概单位。
Syntax : autoindex_exact_size on | off;
Default: autoindex_exact_size on;
Context: http,server,location

#指定目录列表中的时间是应以本地时区还是UTC输出。on本地时区,off UTC时间。
Syntax : autoindex_localtime on | off;
Default: autoindex_localtime off;
Context: http,server,location
1
2
3
4
5
6
7
8
9
10
11
12
13
14

2.场景示例

[root@web ~]# cat /etc/nginx/conf.d/mirror.birenchong.cn.conf
server {
	listen 80;
	server_name mirror.birenchong.cn;
	charset utf-8;		#设定字符集,防止中文字符乱码显示。
	autoindex on;
	autoindex_exact_size off;
	autoindex_locatime on;
	
	location / {
		root /code/;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

3.场景示例:模拟搭建企业内部yum仓库

[root@web mirror]# cat /etc/nginx/conf.d/mirror.birenchong.cn.conf
server {
	listen 80;
	server_name mirror.birenchong.cn;
	charset utf-8;
	root /mirror;

	location / {
		index index.html;
	}
	
	#提供yum仓库目录
	location /repo {
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# Nginx访问控制

# 限制地址访问

ngx_http_access_module模块允许限制对某些客户端地址的访问。

1.指令

#允许配置语法
Syntax: allow address | CIDR | unix: | all;
Default: -
Context: http,server,location,limit_except

#拒绝配置语法
Syntax : deny address | CIDR | unix: | all;
Default: -
Context: http,server,location,limit_except
1
2
3
4
5
6
7
8
9

2.场景示例,只允许指定的来源IP能访问/centos,其它网段全部拒绝。

[root@web ~]# cat /etc/nginx/conf.d/mirror.birenchong.cn.conf
server {
	listen 80;
	server_name mirror.birenchong.cn;
	charset utf-8;		#设定字符集,防止中文字符乱码显示。
	autoindex on;
	autoindex_exact_size off;
	autoindex_locatime on;
	
	location / {
		index index.html;
	}
	
	location /centos {
		allow 127.0.0.1;
		allow 10.0.0.1/32;		#允许地址或地址段
		deny all;				#拒绝所有人
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

3.场景示例,拒绝指定的iP访问该网站的/centos,其他IP全部允许访问。

[root@web ~]# cat /etc/nginx/conf.d/mirror.birenchong.cn.conf
server {
	listen 80;
	server_name mirror.birenchong.cn;
	charset utf-8;			#设定字符集,防止中文字符乱码显示。
	autoindex on;
	autoindex_exact_size off;
	autoindex_locatime on;

	location / {
		index index.html;
	}

	location /centos {
		deny 10.0.0.1/32;	#拒绝指定的地址或地址段
		allow all;			#允许所有的地址
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 注意:deny和allow的顺序是有影响的
    • 默认情况下,从第一条规则进行匹配
    • 如果匹配成功,则不继续匹配下面的内容。
    • 如果匹配不成功,则继续往下寻找能匹配成功的内容。

# 身份认证

ngx_http_auth_basic_module模块允许使用HTTP基本身份验证,验证用户名和密码来限制对资源的访问。

1.指令

#使用HTTP基本身份验证协议启用用户名和密码验证。
Syntax : auth_basic stringl off;
Default: auth_basic off;
Context: http,server,location,limit_except

#指定保存用户名和密码的文件
Syntax : auth_basic_user_file file;
Default: -
Context: http,server,location,limit_except
1
2
3
4
5
6
7
8
9

2.指定保存用户名和密码的文件,格式如下:

#可以使用htpasswd程序或"openssl passwd"命令生成对应的密码;
name1:passwd1
name2:passwd2

#使用htpaaswd创建新的密码文件,-c创建新文件 -b允许命令行输入密码
[root@web ~]# yum install httpd-tools
[root@web ~]# htpasswd -b -c /etc/nginx/auth_conf birenchong 123456
1
2
3
4
5
6
7

3.场景示例,基于用户名和密码认证实践。

[root@web ~]# cat /etc/nginx/conf.d/mirror.birenchong.cn.conf
server {
	listen 80;
	server_name mirror.birenchong.cn;
	charset utf-8;			#设定字符集,防止中文字符乱码显示。
	autoindex on;
	autoindex_exact_size off;
	autoindex_locatime on;
	location / {
		index index.html;
	}

	location /centos {
		auth_basic "Auth access Blog Input your Passwd!";
		auth_basic_user_file /etc/nginx/auth_conf;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# Nginx限流限速

# 限速应用场景

  • 下载限速:限制用户下载资源的速度,使用Nginx ngx_http_core_module。
  • 请求限制:限制用户单位时间内所产生的Http请求数,使用Nginx ngx_http_limit_req_module。
  • 连接限制:限制同一时间的连接数,及并发数限制。使用Nginx ngx_http_limit_conn_module

# 请求频率限速实现的原理?

image-20210810113121773

水(请求)从上方倒入水桶,从水桶下方流出(被处理)﹔

如果说水(请求)流入的过快,水桶流出(被处理)的过慢,来不及流出的水存在水桶中(缓存),然后以固定速率流出,水桶满后则水溢出(丢弃)。

简单来说就是︰当处理速度,达不到请求的速度,则会将请求放置缓存,然后持续处理。当缓存被占满,如果还有大量的请求,则会被丢弃。

# 场景实践一、限制单位时间内所产生的Http请求数。

1.指令

Syntax : limit_req_zone key zone=name:size rate=rate;
Default: -
Context: http

Syntax : limit_conn zone number [burst=number] [nodelay];
Default: -
Context: http,server,location
1
2
3
4
5
6
7

2.基于来源IP对下载速率限制,限制每秒处理1次请求,但可以突发超过5个请求放入缓存区

# http标签段定义请求限制,rate限制速率,限制一秒钟最多一个IP请求
http {
	limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
}
server {
	listen 80;
	server_name mirror.birenchong.cn;
	#请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
	limit_req zone=req_one burst=3 nodelay;
	location / {
		root /code;
		index index.html;
	}
}


limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
#第一个参数: $binary_remote_addr表示通过这个标识来做限制,限制同一客户端ip地址。
#第二个参数: zone=req_one:10m表示生成一个大小为10M,名为req_one的内存区域,用来存储访问的频次信息。
#第三个参数: rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次。

limit_req zone=req_one burst=3 nodelay;
#第一个参数︰ zone=req_one设置使用哪个配置区域来做限制,与上面limit_req_zone里的name对应。
#第二个参数: burst=3,设置一个大小为3的缓冲区,当有大量请求过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
#第三个参数: nodelay,超过访问频次并且缓冲区也满了的时候,则会返回503,如果没有设置,则所有请求会等待排队。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 场景实践二、限制客户端同一时刻的并发连接数。

1.指令

Syntax : limit_conn_zone key zone=name:size;
Default: -
Context: http

Syntax : limit_conn zone number;
Default: -
Context: http,server,location
1
2
3
4
5
6
7

⒉.设置共享内存区域和给定键值的最大允许个连接数。超过此限制时,服务器将返回503错误以回复请求

[root@web ~]# cat /etc/nginx/conf.d/mirror.birenchong.cn.conf
limit_conn_zone $binary_remote_addr zone=conn_mg:10m;

server {
	listen 80;
	server_name mirror.birenchong.cn;
	root /code;
	charset utf8;
	autoindex on;
	autoindex_exact_size off;
	autoindex_localtime on;
	
	limit_conn conn_mg 2;
	
	location / {
		index index.html;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 场景实践三、限制下载速度。

[root@web ~]# cat /etc/nginx/conf.d/mirror.birenchong.cn.conf
server {
	listen 80;
	server_name mirror.birenchong.cn;
	root /code;
	charset utf8;
	autoindex on;
	autoindex_exact_size off;
	autoindex_localtime on;
	
	limit_rate_after 100m;#达到100m开始限速
	limit_rate 100k;
	
	location / {
		index index.html;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 综合案例

限制web服务器请求数处理为1秒一个,触发值为5、限制用户仅可同时下载一个文件。当下载超过100M则限制下载速度为500k。如果同时下载超过2个视频,则返回提示"请联系管理员进行会员充值"。

[root@web conf.d]# cat mirror.birenchong.cn.conf
limit_req_zone $binary_remote_addr zone=req_mg:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_mg:10m;

server {
	listen 80;
	server_name mirror.birenchong.cn;
	root /code;
	charset utf8;
	autoindex on;
	autoindex_exact_size off;
	autoindex_localtime on;
	
	limit_req zone=req_mg burst=5 nodelay;
	limit_conn conn_mg 1;
	limit_rate_after 100m;
	limit_rate 500k;
	
	error_page 503 @errpage;
	location @errpage {
		default_type text/html;
		return 200 '提示-->请联系管理员进行会员充值';
	}
	
	location / {
		index index.html;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# Nginx状态监控

ngx_http_stub_status_module模块提供对基本状态信息的访问。

默认情况下不集成该模块,需要使用--with-http_stub_status_module集成。

1.指令

Syntax : stub_status;
Default: -
Context: server,location
1
2
3

2.示例配置

[root@web ~]# cat /etc/nginx/conf.d/module.conf
server {
	listen 80;
	server_name mirror.birenchong.cn;
	access_log off;
	
	location /nginx_status {
		stub_status;
	}
}
1
2
3
4
5
6
7
8
9
10

3.此配置创建一个简单的网页,其基本状态数据可能如下所示:

image-20210810114127181

4.提供以下状态信息

状态 含义
Active connections 当前活跃连接数,包括Waiting等待连接数。
accepts 已接收的总TCP连接数量。
handled 已处理的TCP连接数量。
requests 当前总http请求数量。
Reading 当前读取的请求头数量。
Writing 当前响应的请求头数量。
Waiting 当前等待请求的空闲客户端连接数

如何简单理解Reading、Writing、Waiting。

假设现在有两条船分别为︰C、S。C船需要S船的1个物品,那么此时C船就要给S船发送一个消息。

1、S船收到这个消息时就是reading。

2、S船将物资发送给C船,这个时候就是writing。

3、如果C船需要S船很多个物品,那么需要C船和S船建立起一个物资传送管道,不断的传送物资。这个管道建立起来的时候,就是waiting状态了。

#nginx
Last Updated: 2022/03/30, 11:09:09
shell流程控制
LNMP架构

← shell流程控制 LNMP架构→

最近更新
01
谷歌云创建GKE集群
07-26
02
ElastiCacheForRedis启用密码
07-26
03
upload-to-gcs
06-29
更多文章>
Theme by Vdoing | Copyright © 2021-2024 Brc | MIT License | 浙ICP备19031881号-4
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式