Nginx服务学习

Nginx服务学习

介绍

1、背景介绍

  • Nginx(“engine x”) 一个具有高性能的【HTTP】和【反向代理】的【web服务器】。同时也是一个【POP3/SMTP/IMAP代理服务器】。

  • 由伊戈尔-赛索耶夫使用C语言编写。

  • 开源

2、市面上常见的服务器

  • IIS

    • 全称(Internet Information Services)互联网信息服务,微软提供的基于Windows操作系统的互联网基本服务。
  • tomcat

    • tomcat是一个运行Servlet和JSP的WEB应用软件,技术先进、性能稳定、开放源码。
    • 但是一个重量级的web服务器,对静态文件和高并发处理较弱。
    • 一台tomcat大概处理200-300的并发量、一台nginx可以处理5万左右的并发量。
  • Apache

  • Nginx

    • 轻量级、高性能
  • Lighttpd

    • 德国开源WEB服务器
    • 和nginx一样,都是轻量级、高性能
  • Google Servers

  • Weblogic

  • Webshpere

3、Nginx的优点

  1. 速度快、并发量高

    1. Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。
  2. 配置简单、扩展性强

  3. 高可靠性

    1. Nginx采用多进程模式运行,有一个master主进程和N多个worker进程。
    2. master主进程可以在某个worker进程出错时,快速去“拉起”新的worker进程提供服务。
  4. 热部署

    1. Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。
  5. 成本低,BSD许可证

4、Nginx常用功能模块

静态资源部署

Rewrite地址重写

​ 正则表达式

反向代理

负载均衡

​ 轮询、加权轮询、ip_hash、url_hash、fair

web缓存

环境部署

​ 高可用的环境

用户认证模块。。。。

Nginx核心组成

Nginx二进制可执行文件

nginx.conf配置文件

error.log错误日志记录

access.log访问记录

一、Nginx基础篇

1、Nginx的安装

  1. wget 命令后面跟nginx的源码下载地址,即可进行下载

  2. 创建文件夹命令:

mkdir nginx/core : 如果没有nginx目录,会报错

mkdir -p nginx/core :如果没有nginx目录,会按照层级递归创建所需目录。

  1. 解压缩命令:

tar -zxvf xxx.gz 将xxx.gz解压到当前目录

tar -zxvf xxx.gz -C /tmp/ 将xxx.gz解压到/tmp/目录

打压缩包命令:

tar -zcvf /root/aaa.gz /root/test/ 将/root/test/目录下的内容打压缩包到/root/目录下。

-z gzip压缩

-c 创建压缩包

-v 显示打包压缩解压过程

-f 接着压缩

-t 查看压缩包内容

-x 解压

-C 解压到指定目录

-exclude 指定排除文件或目录不需要打包

  1. 进入资源文件中,发现configure目录

./configure 简单的默认配置

部分路径配置:

–prefix=PATH 指向Nginx安装目录,默认/usr/local/nginx

–sbin-path=PATH 指向(执行nginx)程序文件的路径,默认/sbin/nginx

–modules-path=PATH 指向动态模块安装目录

–conf-path=PATH 指向Nginx配置文件nginx.conf路径,默认/conf/nginx.conf

–error-log-path=PATH 指向错误日志文件,默认/logs/error.log

–http-log-path=PATH 指向访问日志文件,默认/logs/access.log,可看到访问路径和IP

–pid-path=PATH 指向nginx启动后进程ID的文件路径,…/logs/nginx.pid

–lock-path=PATH 指向nginx锁文件的存放路径,…/logs/nginx.lock

  1. 编译

make

  1. 安装

make install

编译和安装命令可以放在一起一次执行

make && make install

  1. 安装nginx如果不指定服务器,默认路径在:/usr/local/nginx/目录下面,

该目录下面sbin/目录下面有个二进制可执行文件,nginx

执行./nginx即可启动nginx服务。

./nginx -v 可查看对应的nginx版本信息

  1. 验证nginx是否启动成功
  2. 访问对应的ip,看是否能看到nginx 的欢迎界面
  3. 如果无法访问,查看防火墙是否已关闭

systemctl status firewalld 查看防火墙状态
systemctl stop firewalld 关闭防火墙

systemctl disable firewalld 永久关闭防火墙
systemctl start firewalld 开启防火墙

  1. 卸载nginx步骤
  2. 关闭nginx进程 ./nginx -s stop
  3. 删除安装的nginx rm -rf /usr/local/nginx
  4. 清除编译环境 make clean
Nginx启停操作

Nginx是多进程的方式工作,一个master进程和多个worker进程。

  • master进程主要用来管理worker进程,包含接收外界的信息,并将接收到的信号发送给各个worker进程,监控worker进程的状态,当worker进程异常退出后,会自动重启新的worker进程。
  • worker进程是专门用来处理用户请求的,各个worker进程之间是平等的并且相互独立,处理请求的机会也是一样的。

Nginx master进程id的获取

  • ps -ef|grep nginx
  • more xxx/sbin/logs/nginx.pid

方式一:Nginx的信号控制

  • TERM/INT 立即关闭整个服务

  • QUIT "优雅"的关闭整个服务

  • HUP 重读配置文件,并使服务对新配置项生效

  • USR1 重新打开日志文件,可以用来进行日志切割

  • USR2 平滑升级到最新版的nginx

      • 发送USR2信号给master进程,告诉master进程要平滑升级,这个时候,会重新开启对应的master和worker进程,整个系统中将会有两个master进程。
      • 新的master进程的PID会被记录在***/logs/nginx.pid文件,而之前旧的master进程PID会被记录在nginx.pid.oldbin文件中。
      • 接着再发送QUIT信号给旧的master进程,让其处理完请求后再进行关闭。
  • WINCH 所有子进程不在接收处理新连接,相当于给worker进程发送了QUIT指令

  • QUIT和WINCH区别

    • QUIT会关闭所有进程,包括master进程
    • WINCH只关闭worker进程

调用命令为:kill -signal PID

signal 即为信号;PID为master进程ID

方式二:Nginx的命令行控制

此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来进行Nginx状态的控制。

可用参数:

-v : 打印版本号信息

-V:打印版本号信息和配置信息

-t : 测试nginx的配置文件语法是否正确

-T:测试nginx的配置文件语法是否正确,并列出用到的配置文件的信息

-q: 在配置测试期间禁止显示非错误信息

-s : signal信号,后面可以跟:

  • stop 【快速关闭,类似于TERM/INT信号的作用】 ./nginx -s stop
  • quite【优雅的关闭,类似于QUIT信号的作用】
  • reopen【重新打开日志文件,类似于USR1信号的作用】
  • reload【类似于HUP信号的作用】配置文件修改后,无需重启nginx,重新加载配置文件即可。

-p : prefix,指定Nginx的prefix路径

-c : filename,指定Nginx的配置文件路径

-g : 用来补充Nginx配置文件,项Nginx服务指定启动时应用全局的配置。

使用系统命令来操作Nginx服务

启动:systemctl start nginx
停止:systemctl stop nginx
重启:systemctl restart nginx
重新加载配置文件:systemctl reload nginx
查看nginx状态:systemctl status nginx
开机启动:systemctl enable nginx

2、Nginx服务器版本升级

方案一:使用Nginx服务信号完成Nginx的升级

方案二:使用Nginx安装目录的make命令完成升级

环境准备:将新版本的nginx解压并配置编译。

  • 配置 ./configure
  • 编译 make
方案一:使用Nginx服务信号完成Nginx的升级

第一步:将旧版本的sbin目录下的nginx进行备份

mv nginx nginxold

第二步:将新版本安装目录编译后的objs目录下的nginx文件,拷贝到旧版本的sbin目录下

cp nginx /usr/local/nginx/sbin

第三步:发送信号USR2给Nginx的旧版本对应的master进程

kill -USR2 旧PID

第四步:发送信号QUIT给Nginx的旧版本对应的master进程

kill -QUIT 旧PID


方案二:使用Nginx安装目录的make命令完成升级

第一步:将旧版本的sbin目录下的nginx进行备份

mv nginx nginxold

第二步:将新版本安装目录编译后的objs目录下的nginx文件,拷贝到旧版本的sbin目录下

cp nginx /usr/local/nginx/sbin

第三步:进入到安装目录,执行make upgrade

make upgrade

第四步:查看是否更新成功

./nginx -v

3、Nginx核心配置文件结构

目录默认在:/usr/local/nginx/conf/nginx.conf

master_process on|off;	# 控制是否开启工作进程。默认on。
worker_process 1; # 配置Nginx生成工作进程的数量。建议和服务器CPU的内核数保持一致。
# 以上两个配置修改后,reload无效,需要重启nginx。如果master_process off,则worker_process 配置的值无效。

# events块,主要设置nginx服务器与用户的网络连接,这一部分对nginx服务器的性能影响较大
events {
	accept_mutex on;	# 开启接收请求序列,解决“惊群”现象
	multi_accept on;	# 开启后,一个worker进程可以同时接收多个用户的请求
	worker_connections 1024; # 用来配置单个worker进程最大的连接数,不能大于操作系统最大句柄量。
	use epoll;			# 事件驱动,效率高
}

# http块,是nginx服务器配置中的重要部分,代理、缓存、日志记录、第三方模块配置。。。
http {
	include			mime.types;
	default_type	application/octet-stream; # 用来配置nginx响应前端请求默认的MIME类型
	sendfile		on; # 使用sendfile传输文件,可以大大提升Nginx处理静态资源的性能
	keepalive_timeout	65;	# 用来设置长连接的超时时间
	keepalive_requests 100;	# 用来设置一个keep-alive连接使用的次数
		# 为什么要使用keepalive?
		# HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开
		# 如果客户端向服务端发送多个请求,每个请求都要重新创建一次连接,效率相对来说比较慢,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率,但是这个连接与不能一直保持,这样连接如果过多,也会使服务端的性能下降,这个时候就需要我们设置其超时时间。
	
	server {
		listen		80;
		server_name	localhost; # 这里的localhost,代表该服务器的IP
		location / {
			root	html;
			index	index.html index.htm;
		}
		error_page	500 502 503 504 /50x.html;
		location = /50x.html {
			root	html;
		}
	}
}

4、Nginx命令配置到系统环境

  • 修改/etc/profile文件
vim /etc/profile
在最后一行添加:
export PATH=$PATH:/usr/local/nginx/sbin
  • 使之立即生效
source /etc/profile
  • 执行nginx命令
nginx -V

5、Nginx静态资源部署

Nginx静态资源的配置指令

listen指令

listen用来配置监听端口

listen address:port [default_server];
listen 127.0.0.1:8080;	// 监听指定的IP和端口
listen 127.0.0.1;		 // 监听指定IP的所有端口
listen 8080;			 // 监听指定端口上的连接
listen *:8080;			 // 监听指定端口上的连接 

default_server属性是标识符,用来将此虚拟主机设置成默认主机。如果没有匹配到对应的address:port,则会默认执行。
如果没有指定默认,默认找第一个server

server_name指令

用来设置虚拟主机服务名称。

语法:server_name name...;
name可以提供多个值,中间用空格分隔
server_name "";

配置方式有三种:
精准匹配
通配符匹配
正则表达式匹配

常见的正则表达式

代码 说明
^ 匹配搜索字符串开始位置 在有些位置是取反的意思。
$ 匹配搜索字符串结束位置
. 匹配除换行符\n之外的任何单个字符
\ 转义字符,将下一个字符标记为特殊字符
[abc] 字符集,与任意一个指定字符匹配
[a-z] 字符范围,匹配只当范围内的任意字符
\w 与以下任意字符匹配A-Z a-z 0-9 和下划线,等效于[A-Za-z0-9] (单词字符)
\W 非单词字符
\d 数字字符匹配,等效于[0-9]
\D 非数字字符
{n} 正好匹配n次
{n,} 至少匹配n次
{n,m} 匹配至少n次至多m次
* 零次或多次,等效于{0,}
+ 一次或多次,等效于{1,}
? 零次或一次,等效于{0,1}

location指令

用来设置请求的URI

语法:location [ = | ~ | ~* | ^~ | @] uri{...}
位置:server,location

~ 用于表示当前uri中包含了正则表达式,并且区分大小写
~* 用于表示当前uri中包含了正则表达式,并且不区分大小写

^~ 用于不包含正则表达式的uri前面,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。
	不加符号,匹配顺序是找到最后一个符合条件的匹配


# 空格分开,访问路径以/abc开头都可匹配
location /abc{
	default_type text/plain;
	return 200 "access success";
}
# =分开,访问路径必须精确匹配
location =/abc{
	default_type text/plain;
	return 200 "access success";
}

root和alias指令

root的处理结果是:root路径+location路径。
alias的处理结果是:使用alias路径替换location路径。
alias是一个目录别名的定义,root则是最上层目录的含义。
如果location路径是以/结尾,则alias也必须是以 /结尾,root没有要求。

index指令

设置网站的默认首页

index file...;

例子:
location / {
	root /usr/loal/nginx/html;
	index index.html index.htm;
}
访问该location的时候,可以通过http://ip:port/,地址后面如果不添加任何内容,则默认依次访问index.html和index.htm,找到第一个来进行返回。

error_page指令

设置网站的错误页面

语法:error_page code... [=[response]] uri;
当出现对应的响应code后,如何来处理。

方式一:
error_page 404 http://www.baidu.com

方式二:
error_page 404 /50x.html;
location =/50x.html{
	root html;
}

方式三:
error_page 404 @jump_to_error;
# location进行指定错误信息。
location @jump_to_error {
	defaule_type text/plain;
	return 404 "Not Found...";
}

可选项=[response]的作用是用来将相应代码更改为另外一个
error_page 404 =200 /50x.html;
location =/50x.html{
	root html;
}
这样的话,当放回404找不到对应的资源的时候,在浏览器上可以看到,最终返回的状态码是200,这块需要注意下,编写error_page后面的内容,404后面要加空格,200前面不能加空格。
静态资源优化配置语法
sendfile on;
tcp_onpush on;
tcp_nodelay on;

sendfile 用来开启高效的文件传输模式

语法:sendfile on|off;
默认:sendfile off;

tcp_nopush 该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输效率

语法:tcp_nopush on|off;
默认:tcp_nopush off;

tcp_nodelay 该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的实时性

语法:tcp_nodelay on|off;
默认:tcp_nodelay on;
静态资源的缓存处理

什么是缓存

缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常他不像系统主存那样使用DRAM技术,而使用昂贵但快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。

什么是web缓存

web缓存是指一个web资源(如html页面,图片,js,数据等)存在于web服务器和客户端(浏览器)之间的副本。缓存会根据缓存机制决定是直接使用副本相应访问请求,还是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过的网站的网页,当再次访问这个URL地址的饿时候,如果网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页,只有当网站明确标识资源已经更新,浏览器才会再次下载网页。

二、Nginx的跨域问题解决

1、同源策略

同源:协议、域名(IP)、端口相同即为同源。

http://192.168.220.131/users/1
https://192.168.220.131/users/1
非同源,协议不同

http://192.168.220.131/users/1
http://192.168.220.131:8080/users/1
非同源,端口不同

http://192.168.220.131/users/1
http://192.168.220.132/users/1
非同源,IP不同

http://192.168.220.131/users/1
http://192.168.220.131:80/users/1
同源,http协议默认80端口,https协议默认443端口

2、跨域问题

简单描述如下:

有两台服务器,分别为A/B,如果从服务器A的页面发送异步请求到服务器B获取数据,如果服务器A和服务器B不满足同源策略,就会出现跨域问题。

解决方案

语法:add_header name value...
位置:http、server、location

此处用来解决跨域问题,需要添加两个头信息
一个是Access-Control-Allow-Origin 允许跨域访问的源地址信息,可以配置多个,用逗号隔开,也可用*代表所有源
一个是Access-Control-Allow-Methods 允许跨域访问的请求方式,值可以为GET/POST/PUT/DELTE...,可以全部设置,也可以根据需要设置,多个用逗号分隔。
在server{
	location /{
		add_header Access-Control-Allow-Origin http://127.0.0.1;
		add_header Access-Control-Allow-Methods GET,POST,PUT,DELTE;
	}
}

3、静态资源防盗链

什么是资源盗链

资源盗链指的是此内容不在自己服务器上,而是通过技术手段,绕过别人的限制将别人的内容放到自己页面上最终展示。以此来盗取大网站的空间和流量。简而言之就是用别人的东西成就自己网站。

Nginx防盗链的具体实现

语法:valid_referers none|blocked|server_names|string...
位置:server、location

none:如果Header中的Referer为空,则允许访问。
blocked:在Header中的Referer不为空,但是该值被防火墙或代理进行伪装过,如不带“http://"、"https://"等协议头的资源允许访问。
server_names:指定具体的域名或者IP
string:可以支持正则表达式和*的字符串。如果是正则表达式,需要以~开头表示。

ngxin会通过查看referer自动和valid_referers后面的内容进行匹配,如果匹配成功,就将$invalid_referer变量置0,如果没有匹配到,则为1,不区分大小写。

三、Rewrite功能配置

Rewrite是Nginx服务器提供的,主要作用是用来实现URL的重写。

注意:Nginx服务器的Rewrite功能的实现依赖于PCRE(正则表达式库)的支持,因此在编译安装Nginx服务器之前,需要安装PCRE库。Nginx使用的是ngx_http_rewrite_module模块来解析和处理Rewrite功能的相关配置。

  • 后面用到在看。。。

四、Nginx反向代理

1、正向代理

正向代理:代理服务器代理的是客户端,帮助客户端去请求服务器,返回数据给到客户端。此时客户端的访问服务器的ip、url路径是不变的。服务器端不知道实际请求的客户端,只知道代理服务器。

nginx中$host获取的是访问的url中的ip
$request_uri获取的是访问路径ip端口后面的所有部分

没有设置正向代理之前,客户端直接访问数据服务器,数据服务器记录的是客户端的ip地址。
设置正向代理后,客户端访问的地址不变,但是该请求会转发到代理服务器,由代理服务器代为访问数据服务器。数据服务器记录的是代理服务器的ip地址。


代理服务器的nginx配置:
server {
	listen	82;
	resolver 8.8.8.8; # 设置DNS的IP,用来解析proxy_pass中的域名
	location / {
						# 所要访问服务端的url地址
		proxy_pass http://$host$request_uri; # $host客户端访问服务端的IP地址
	}
}

代理服务器配置完成后,还需要在客户端配置代理服务器。

2、反向代理

反向代理:代理服务器代理的是服务器端,在代理服务器会通过配置proxy_pass rul ,进行反向代理实现。客户端请求的地址是代理服务器的IP地址,代理服务器在将客户请求请求到数据服务器。服务器知道实际请求的客户端是谁。

反向代理模块的指令是由ngx_http_proxy_module模块进行解析。安装Nginx的时候自动装到Nginx中了。

常用指令:

proxy_pass

proxy_set_header

proxy_redirect

proxy_pass

该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。
语法:proxy_pass URL;
位置:location

URL:为要设置的被代理服务器地址,包含传输协议(http,https://)、主机名称或IP地址加端口号、URI等要素。

例如:
	proxy_pass http://www.baidu.com;
	proxy_pass http://132.168.200.146:8082;
	
	proxy_pass 后面url结尾加/和不加/的区别:
	如果location /server{
		# 当客户端访问的路径是:http://132.168.200.133:8082/server/index.html(代理服务器IP)
		# 如果不加/,则访问路径是proxy_pass http://132.168.200.146:8082/server/index.html;
		proxy_pass http://132.168.200.146:8082;
		
		#如果加/,则访问路径是proxy_pass http://132.168.200.146:8082/index.html;
		proxy_pass http://132.168.200.146:8082/;
	}

proxy_set_header

该指令可以更改Nginx服务器接收到的客户端的请求头信息,然后将新的请求头发送给代理的服务器。

语法:proxy_set_header field value;
默认值:proxy_set_header Host $proxy_host;
	   proxy_set_header Connection cloes;
位置:http、server、location



用法举例:
客户端访问路径:http://192.168.11.22:8080/server
代理服务器192.168.11.22:
server {
	listen	8080;
	server_name localhost;
	location /server {
		proxy_pass http://192.168.11.11:8080/; # 被代理的服务器url
		proxy_set_header username TOM; # 设置客户端请求的请求头username的值
	}
}
被代理服务器192.168.11.11:
server {
	listen	8080;
	server_name localhost;
	default_type text/plain;	# 设置类型为文本输出在浏览器
	return 200 $http_username;
	# 此处会在浏览器页面输出代理服务器设置的username的值。
}

nginx.conf修改后,执行
nginx -t	测试配置文件语法是否正确
nginx -s reload	重新加载配置文件。	-s(signal)

proxy_redirect (redirect:改变方向、改变方向、重新寄送)

该命令用来重置头信息中的“Location”和“Refresh”的值。

语法:proxy_redirect redirect replacement;(replacement:替代者,替换品)
	 proxy_redirect default;
	 proxy_redirect off;
默认值:proxy_redirect default;
位置:http、server、location


# 如果请求的资源不存在
if(!-f $request_filename) {
	# 返回22机器的index.html页面
	return 302 http://192.168.11.22/;
}

proxy_redirect redirect replacement;

redirect:目标,location值
replacement:要替换的值

proxy_redirect default;

default;
将location块的uri变量作为replacement,
将proxy_pass变量作为redirect进行替换。

proxy_redirect off;

关闭该功能。

3、nginx添加SSL的支持

(1)完成–with-http_ssl_module模块的增量添加

将原有的/usr/local/nginx/sbin/nginx(这是一个二进制可执行文件) 进行备份;目的是防止升级失败,备份后能恢复到升级之前的版本。
	mv nginx nginxold
拷贝nginx之前的配置信息。
	执行命令 ./nginx -V(不仅可以看到nginx的版本,还能看到nginx的所有配置信息),将configure arguments:的配置信息复制备份。
在nginx的安装源码进行配置指定对应模块	./configure --with-http_ssl_module;这里还要把第二步拷贝的配置信息一起加上。
	cd到nginx的安装目录下面,执行命令: ./configure (这后面跟的是第二步复制备份的配置信息),将--with-http_ssl_module追加在后面即可。
通过make模板进行编译
	在安装目录下不动,执行make命令,编译成功后会生成一个objs目录,其中会有一个新的二进制可执行文件nginx。
将objs下面的nginx(二进制可执行文件)移动到/usr/local/ngins/sbin/目录下
	cd objs/
	cp nginx /usr/local/nginx/sbin/
在源码目录下执行 make upgrade进行升级,这个可以实现不停机添加新模块的功能。
	cd ../	回退到安装目录
	执行命令:make upgrade 回撤
最后执行命令:nginx -V
查看配置信息configure arguments后面有么有新增模块 --with-http_ssl_module

五、Nginx负载均衡

问题:

1、服务端接收请求的时候,超出了最高的并发处理能力,该如何解决。

2、服务端如果宕机了,该如何解决。

1、负载均衡概述

早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大,并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器及进行型性能的水平扩展及避免单点故障出现。那么如何将不同用户的请求流量分发到不同的服务器上呢?

2、负载均衡的作用

  • 解决服务器的高并发压力,提高应用程序的处理性能。单台服务器的并发处理能力是有限的。
  • 提供故障转移,实现高可用。
  • 通过添加或减少服务器数量,增强网站的可扩展性。
  • 在负载均衡器上进行过滤,可以提高系统的安全性。

3、负载均衡常用的处理方式

方式一:用户手动选择

在网站页面上提供不同线路,不同服务器连接方式,让用户自己选择访问的具体的服务器。

方式二:DNS轮询方式

DNS
域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与IP地址的互相转换。

一个域名可以分配多个IP

优点:投入成本低
缺点:可靠性低、负载不均衡

方式三:四/七层负载均衡

首先了解一个概念:OSI(open system interconnection),叫开放式系统互联模型。这个是由国际标准化组织ISO指定的一个不基于具体机型、操作系统或公司的网络体系结构。该模型将网络通信的工作分为七层。

应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

所谓四层负载均衡指的是OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡;

所谓的七层负载均衡指的是在应用层,主要是基于虚拟的URL或主机IP的负载均衡。

区别

四层负载均衡数据包时在底层就进行了分发,而七层负载均衡数据包则是在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的要高。
四层负载均衡不识别域名,七层识别。
Nginx七层负载均衡

Nginx要实现七层负载均衡,需要用到proxy_pass代理模块配置,Nginx默认安装支持这个模块,所以不需要在做处理。

Nginx的负载均衡是在Nginx的反向代理基础上把用户的请求根据指定的算法分发到一组【upstream虚拟服务池】。

单台服务器已经不足以支撑我们的业务,所以需要增加机器,这个时候就需要用到upstream配置服务器组。

upstream指令

该指令用来定义一组服务器,它们可以时监听不同端口的服务器,也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1。

语法:upstream name {...}
位置:http

server指令

该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者unix socket

语法:server name [paramerters]
位置:upstream

样例:

http {
# 配置服务器组
	upstream backend {
		server 192.168.200.123:9001;
		server 192.168.200.123:9002;
		server 192.168.200.123:9003;
	}

	server {
		listen 8081;
		server_name localhost;
		location / {
		# 监听进来之后,跳转到服务器,就到这个服务器组中。backend就是上面配置的服务器组的名称
			proxy_pass http://backend;
		}
	}
}

负载均衡状态

代理服务器在负责均衡调度中的状态有以下几个:

down 			当前的server暂时不参与负载均衡
backup			预留的备份服务器
max_fails		允许请求失败的次数
fail_timeout	经过max_fails失败后,服务暂停时间
max_conns		限制最大的接收连接数


down:将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡
	该状态一般会对需要停机维护的服务器进行设置。
	
backup:将该服务器标记为备份服务器,当主服务器不可用时,会用来处理请求。
Linux提供专门来操作firwwall的工具 firewall-cmd

max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。

max_fails和fail_timeout
max_fails=number:设置允许请求代理服务器失败的次数,默认为1;
fail_timeout=time:设置经过max_fails失败后,服务器暂停的时间,默认是10秒。  

4、负载均衡策略

Nginx的upstream支持如下六种方式的分配算法

轮询		默认方式 
weight		权重方式
ip_hash		依据IP分配方式
least_conn 	依据最少连接方式 
url_hash	依据URL分配方式
fair		依据响应时间方式	第三方模块

轮询 upstream模块负载均衡默认的策略。每个请求会按时间顺序逐个分配到不同的后端服务器。不需要额外的配置。

weight加权【加权轮询】

weigth=number:用来设置服务器的权重,默认为1,权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所以此策略比较适合服务器的硬件配置差别比较大的情况。
upstream backend{
    # 如果weight值一致,就是普通轮询,如果不一致,就是加权轮询。
    server 132.168.01.200:8001 weight=1;
    server 132.168.01.200:8002 weight=2;
    server 132.168.01.200:8003 weight=3;
}
server {
    listen 8080;
    server_name localhost;
    location /{
    	proxy_pass http://backend;
    }
}

ip_hash

当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某一个IP的用户在后端web服务器A上登录后,在访问该站点的其他URL,能保证其访问的还是后端web服务器A。

upstream backend{
	ip_hash;
	server 132.168.01.200:8001;
    server 132.168.01.200:8002;
    server 132.168.01.200:8003;
}

缺点:使用ip_hash指令,无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到请求多,有些后端服务器接收的请求少,而且设置后端服务器权重等方法将不起作用。

least_conn

最少连接方式,把请求转发给连接数较少的后端服务器,轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况,least_conn这种方式就可以达到更好的负载均衡效果。
upstream backend{
	least_conn;
	server 132.168.01.200:8001;
    server 132.168.01.200:8002;
    server 132.168.01.200:8003;
}
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。
同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。
而使用url_hash,可以使得同一个url(也就是用一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。

upstream backend{
	hash &request_uri;
	server 132.168.01.200:8001;
    server 132.168.01.200:8002;
    server 132.168.01.200:8003;
}

你可能感兴趣的:(nginx,学习,服务器)