【Nginx】 配置负载--Nginx配置详解与负载方案详解

Nginx介绍

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
本博文不讲解Nginx的安装(官网和其他渠道的讲解都非常多,安装也较为简单),本文重点讲解Nginx使用配置各参数说明、负载均衡各场景配置说明。

Nginx配置层级结构介绍

Nginx配置结构
文字版结构描述如下

文件根目录
	----events:指令是设定Nginx的工作模式及连接数上限
	----http:
			----upstream:负载均衡服务器设置,设置一系列的后端服务器
			----server:主机设置
			----server:主机设置
			    ----location:URL匹配特定位置的设置
			    ----location:URL匹配特定位置的设置

Nginx的全局配置说明

	#(默认不配置)指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
	user nobody nobody;
	#Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可。
	worker_processes 2;
	#(默认不配置)指定全局错误日志文件。级别有debug、info、notice、warn、error、crit可供选择. debug级别最为最详细,crit输出日志最少。
	error_log logs/error.log notice;
	#(默认不配置)用来指定进程pid的存储文件位置。
	pid logs/nginx.pid;
	#(默认不配置)用于绑定worker进程和CPU, Linux内核2.4以上可用。
	worker_rlimit_nofile 65535;
	
	#指令是设定Nginx的工作模式及连接数上限
	events{
	  #(默认不配置)指定Nginx的工作模式:select、poll、kqueue、epoll、rtsig和/dev/poll。
	  #其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式. epoll用在Linux平台上,kqueue用在BSD系统中。
		use epoll;
		#指定Nginx每个进程的最大连接数(默认是1024). 最大客户端连接数由worker_processes和worker_connections决定,Max_client=worker_processes*worker_connections。
		#在作为反向代理时,max_clients变为:Max_client = worker_processes * worker_connections/4。
		#进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令"ulimit -n 65536"后worker_connections的设置才能生效
		worker_connections 65536;
	}

	#服务器相关配置
	http {
	...
	}

Http服务部分配置说明详解

http {
	#实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。默认不变
	include       mime.types;
	#设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式。默认不变
	default_type application/octet-stream;
	#(默认不配置)指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	                  '$status $body_bytes_sent "$http_referer" '
	                  '"$http_user_agent" "$http_x_forwarded_for"';
	
	#(默认不配置)设置允许客户端请求内容最大字节数
	client_max_body_size 20m;
	#(默认不配置)设置客户端请求头的headerbuffer大小。一般1K的缓冲区大小已经足够;
	client_header_buffer_size 8K;
	#用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞;
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	#设置客户端连接保持活动的超时时间(单位为秒)。设置过大会导致问题(socket() failed (24: Too many open files) while connecting to upstream),设置过小会导致大文件上传超时。
	keepalive_timeout 60;
	#(默认不配置)设置请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误;
	client_header_timeout 10;
	#(默认不配置)设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60;
	client_body_timeout 10;
	#(默认不配置)指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
	send_timeout 20;
	
	#设置开启或者关闭gzip模块,“gzip on”表示开启GZIP压缩,实时压缩输出数据流
	gzip on;
	#设置允许压缩的页面最小字节(header中Content-Length可以获取大小)。默认值0代表都压缩(不能这么用,可能导致小文件压缩反而大的情况)。建议设置成大于1K的字节数;
	gzip_min_length 1k;
	#表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果;
	gzip_buffers 4 16k;
	#用来指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源;
	gzip_comp_level 5;
	#用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的;
	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;
	#选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据。
	gzip_vary off;
	#IE6对Gzip不怎么友好,不给它Gzip了
	gzip_disable "MSIE [1-6]\.";
	
	#负载均衡设置,负载名称将会被location中的proxy_pass引用(最后章节详细介绍)
	upstream 负载名称{
		负载配置内容
	}
		
	#server虚拟主机配置(建议将一个虚拟主机server的配置写成一个独立文件,通过include指令包含进来,这样更便于维护和管理)
	server{
	...	
    }
}

server虚拟主机配置

	#server虚拟主机配置(建议将一个虚拟主机server的配置写成一个独立文件,通过include指令包含进来,这样更便于维护和管理)
	server{
		#指定服务端口
		listen 80;
		#IP地址或者域名,多个域名之间用空格分开,指明服务地址
		server_name 192.168.8.18 cszhi.com;
		#设定访问的默认首页地址
		index index.html index.htm index.php;
		#指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径
		root /wwwroot/www.cszhi.com
		#(默认不配)设置网页的默认编码格式
		charset gb2312;
		#(默认不配)此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式(引用前面的设置)。
		access_log logs/www.tasktrack.com.cn main;
		
    #location代表URL满足规律的进入本区域处理(下面示例代表 匹配aiassistant开头的URL地址)
    location ~ .*/aiassistant/* {
    	#基本语法如下:location [=|~|~*|^~|@] pattern{……} 详细语法说明如下
    	#没有修饰符 表示:必须以指定模式开始; location /abc 代表 /abc、/abc?p1、/abc/、/abcde都可以匹配
    	#=表示必须与指定的模式精确匹配; location = /abc 代表 /abc、/abc?p1可以匹配;/abc/、/abcde不可以匹配
    	#~表示指定的正则表达式要区分大小写;  location ~ ^/abc$ 代表 /abc、/abc?p1=1可以匹配;/ABC、/abc/、/abcde不可以匹配
    	#~*表示指定的正则表达式不区分大小写; location ~* ^/abc$代表/abc、/ABC、/abc?p=1可以;/abc/、/abcde不可以匹配
    	#^~类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了。
    	#@:定义命名location区段,这些区段客户段不能访问,只可以由内部产生的请求来访问,如try_files或error_page等
    	#location各模块优先级:
    		#1:带有"="的精确匹配优先
			#2:没有修饰符的精确匹配
			#3:正则表达式按照他们在配置文件中定义的顺序
			#4:带有"^~"修饰符的,开头匹配
			#5:带有"~" 或"~*" 修饰符的,如果正则表达式与URI匹配
			#6:没有修饰符的,如果指定字符串与URI开头匹配
			#示例: location = /  代表:只匹配 / 的查询
			#示例: location /    代表:匹配任何以 /开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。
			#示例: location ^~ /images/    代表:匹配任何以 /images/开始的查询并且停止搜索,不检查正则表达式。
			#示例: location ~* \.(gif|jpg|jpeg)$  代表:匹配任何以gif、jpg、jpeg结尾的文件,但是所有/images/目录的请求将在上一个示例中匹配
              #符合location条件的请求路径被转发URL地址,可以使用负载upstream设置的名称(注意最后有/根路径和没有/相对路径的区别)
              proxy_pass      http://127.0.0.1:8100;  待补充
              #重新设置代理转发的请求头Host(请求的主机名)为真实客户端请求Host,并且防止Host为空的情况(否则后端服务器收到的Host永远是nginx的host)
              proxy_set_header Host $host;
              #重新设置代理转发的请求头IP地址为最原始客户端请求IP地址
              proxy_set_header X-Real-IP $remote_addr;
              #重新设置代理转发的请求头IP地址为最原始客户端请求IP地址
              proxy_set_header REMOTE-HOST $remote_addr;
              #重新设置代理转发的请求头X-Forwarded-For的值为"用户的真实ip,第一台nginx的ip"(如果只有一集Nginx代理,效果与proxy_set_header X-Forwarded-For $remote_addr 一致)
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              #重新设置代理转发的请求头,保持原请求中的协议。 解决https请求,经过nginx转发后,Tomcat只能获得http协议的问题
              proxy_set_header X-Forwarded-Proto  $scheme;
      }
	}

upstream负载均衡设置讲解

	upstream 负载设置名称{
			负载配置内容
		}

负载均衡算法说明如下(配置有单独章节讲解)

  • 轮询(默认:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;
  • Weight:指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况;
  • ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
  • fair:根据服务器接口性能做负载(响应时间短的优先分配)。Nginx本身是不具备此模块,必须下载Nginx的upstream_fair模块才能使用;
  • url_hash:按访问url的hash值分配请求,使每个url定向到同一个后端服务器。Nginx本身是不支持url_hash的,须安装Nginx的hash软件包才能使用。

负载均衡配置关键字说明(配置有单独章节讲解)

  • down:表示当前的server暂时不参与负载均衡;
  • backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器;
  • max_fails:允许请求失败的次数(默认1)。当超过最大次数时,返回proxy_next_upstream模块定义的错误;
  • fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

upstream负载均衡配置示例说明

	#主备负载策略:在http节点下添加upstream节点:主不可用,切到备,当主服务器再次可用,流量会再次自动切到主服务器上面来。
			upstream robotweb {
			  server 192.168.0.1:8080 max_fails=60 fail_timeout=60s;  //主服务器配置,连续60次失败或者60S超时,切到备服务器
			  server 192.168.0.2:8080 backup;													//备服务器地址配置
			}
			#然后在server节点下配置location内容进行引用:
			location /name {
			            proxy_pass http://robotweb/name/;							//这里引用上面配置的upstream的 robotweb名称的负载策略。
			}
	#多机负载策略:源地址哈希法,适用于希望session保持的业务场景
			upstream searchapi {
				ip_hash;
			  server 192.168.0.1:8080;  
			  server 192.168.0.2:8080;	
			}
	#多机负载策略:加权轮询(适用于服务器无状态,并且服务器硬件配置不均衡的场景)
			upstream searchapi{ 
			      server 11.22.333.11:6666 weight=1; 		//权重为1的轮训到此节点(值越大负载的量越大)
			      server 11.22.333.22:8888 down; 				//表示单前的server临时不參与负载
			      server 11.22.333.33:8888 backup;			//其他全部的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
			      server 11.22.333.44:5555 weight=2; 		//权重为2的轮训到此节点(值越大负载的量越大)
			}
	#多机负载策略:fair法(非官方):按照服务器响应时间的长短来进行分发的,服务器响应时间越短的,优先分发
			upstream searchapi{ 
			      server 11.22.333.11:6666 ;
			      server 11.22.333.22:8888 ;
			      fair;
			}
	#多机负载策略:一致性哈希(Consistent Hash),适用于后端是缓存服务器的场景,共3台缓存服务器,其中一台挂了,以前落在另外两台服务器的请求不变.
			upstream searchapi{ 
						consistent_hash $request_uri;
		        server 106.38.193.183:80;
		        server 106.38.193.182:80;
			}
	#多机负载策略:根据请求参数做一致性哈希(Consistent Hash),通过lua脚本获得请求参数,并请求组装成nginx使用的hash源
			upstream searchapi{ 
						server 10.44.55.67:8080;
						server 10.44.55.68:8080;
						server 10.44.55.69:8080;
						consistent_hash $req_param;
			}
			location ~.*/searchweb/search/*{
						rewirte_by_lua '
							local request_method = ngx.var.request_method
							if "GET" == request_mothod then
								local args = ngx.req.get_rul_args()
								ngx.var.req_param = args["client"]
							end 
						';
						proxy_pass .....
			}

Connection与Request限流部分说明

  • connection是连接,即常说的tcp连接,通过三次握手而建立的一个完整状态机。建立一个连接,必须得要三次握手。
    request是指请求,即http请求,(注意,tcp连接是有状态的,而构建在tcp之上的http却是无状态的协议)。

通过打开一个网页,然后通过wareshark可以看到,一个连接建立后(即三次握手后),在这个连接断开之前(即四次挥手之前),会有很多的http request,这就是他们的区别:即一个连接的生命周期中,会存在一个或者多个请求,这是为了加快效率,避免每次请求都要三次握手建立连接,现在的HTTP/1.1协议都支持这种特性,叫做keepalive。

limit_conn_zone $binary_remote_addr zone=limitperip:10m
  • 第一个参数:$binary_remote_addr
    表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
    第二个参数:zone=limitperip:10m表示生成一个大小为10M,名字为limitperip的内存区域,用来存储访问的频次信息。

代表:启一个名为只limitperip的定义,定义同一个客户端ip地址的连接的数量。
limit_conn limitperip 10;
代表:使用上面的zone=limitperip这个名字的定义,并且限定 同一个客户端ip地址的最大连接的数量未10.

limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=5r/s;
  • 第一个参数:$binary_remote_addr
    表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
    第二个参数:zone=mylimit:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。
    第三个参数:rate=5r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒5次,还可以有比如30r/m的。
limit_req zone=ratelimit burst=10 nodelay;
  • 第一个参数:zone=ratelimit 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
    第二个参数:burst=10,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为10的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
    第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。

打印日志 配置 说明

在nginx.conf中做如下配置:

  log_format main  'server="$server_name" host="$host” dest_port="$server_port" '
                   'src="$remote_addr" ip="$realip_remote_addr" user="$remote_user" '
                   'time_local="$time_local" http_status="$status" '
                   'http_referer="$http_referer" http_user_agent="$http_user_agent" '
                   'http_x_forwarded_for="$http_x_forwarded_for" '
                   'http_x_header="$http_x_header" uri_query="$query_string" uri_path="$uri" '
                   'request=$request http_method="$request_method" bin_remote_addr=$binary_remote_addr';

通常的地址日志如下

  server="airobot.cloud.net" 
  host="airobot.cloud.net” dest_port="443" 
  src="10.68.129.18" 
  ip="10.68.129.18" 
  user="-" 
  time_local="01/Sep/2020:10:49:22 +0800" 
  http_status="200" 
  http_referer="-" 
  http_user_agent="Mozilla/5.0 (Linux; Android 10; PCT-AL10 Build/HUAWEIPCT-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2581 MMWEBSDK/200801 Mobile Safari/537.36 MMWEBID/2074 MicroMessenger/7.0.18.1740(0x27001235) Process/toolsmp WeChat/arm64 NetType/WIFI Language/zh_CN ABI/arm64" 
  http_x_forwarded_for="client_ip, 10.68.11.18" 
  http_x_header="-" 
  uri_query="sourceId=63491&_=0.10907357737685697" 
  uri_path="/airobot/web/keepAlive/1591079349364" 
  request=GET /aorobot/web/keepAlive/1591079349364?sourceId=67391&_=0.10907357737685697 HTTP/1.0 http_method="GET" 
  bin_remote_addr=\x0AD\x81\x12    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
nginx负载均衡配置可以通过在nginx配置文件中添加upstream模块来实现。在http{}模块中添加以下内容: ``` upstream webServer { server 192.168.95.138:80 weight=3; server 192.168.95.139:80 weight=7; } ``` 其中,`192.168.95.138:80`和`192.168.95.139:80`是需要进行负载均衡的服务器的地址和端口号,`weight`参数指定了服务器的权重。 接下来,在server{}模块中配置监听端口和服务器名称,并设置代理规则,将请求转发给上面定义的webServer集群: ``` server { listen 80; server_name 192.168.95.137; location / { index index.html index.htm; proxy_pass http://webServer; } } ``` 保存配置文件后,使用命令`/usr/local/nginx/sbin/nginx -t`检查配置文件的语法正确性,然后使用命令`/usr/local/nginx/sbin/nginx -s reload`重新加载配置文件使其生效。 此外,如果需要修改默认的网页内容,可以通过以下步骤进行: 1. 进入网页文件所在的目录:`cd /usr/local/nginx/html/` 2. 备份原始的index.html文件:`cp index.html index.html.bak` 3. 编辑index.html文件并清空其中的所有内容:`vim index.html` 4. 添加新的内容,例如:`<h>Welcome to server1<h>` 5. 保存并退出编辑器 6. 检查配置文件的语法正确性:`/usr/local/nginx/sbin/nginx -t` 7. 重新加载配置文件:`/usr/local/nginx/sbin/nginx -s reload` 这样,当访问nginx服务器时,会进行负载均衡将请求分发给不同的后端服务器,并且可以自定义权重值来调节各个服务器的负载比例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值