Nginx(“engine x”) 一个具有高性能的【HTTP】和【反向代理】的【web服务器】。同时也是一个【POP3/SMTP/IMAP代理服务器】。
由伊戈尔-赛索耶夫使用C语言编写。
开源
IIS
tomcat
Apache
Nginx
Lighttpd
Google Servers
Weblogic
Webshpere
速度快、并发量高
配置简单、扩展性强
高可靠性
热部署
成本低,BSD许可证
静态资源部署
Rewrite地址重写
正则表达式
反向代理
负载均衡
轮询、加权轮询、ip_hash、url_hash、fair
web缓存
环境部署
高可用的环境
用户认证模块。。。。
Nginx核心组成
Nginx二进制可执行文件
nginx.conf配置文件
error.log错误日志记录
access.log访问记录
wget 命令后面跟nginx的源码下载地址,即可进行下载
创建文件夹命令:
mkdir nginx/core : 如果没有nginx目录,会报错
mkdir -p nginx/core :如果没有nginx目录,会按照层级递归创建所需目录。
- 解压缩命令:
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 指定排除文件或目录不需要打包
- 进入资源文件中,发现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
- 编译
make
- 安装
make install
编译和安装命令可以放在一起一次执行
make && make install
- 安装nginx如果不指定服务器,默认路径在:/usr/local/nginx/目录下面,
该目录下面sbin/目录下面有个二进制可执行文件,nginx
执行./nginx即可启动nginx服务。
./nginx -v 可查看对应的nginx版本信息
- 验证nginx是否启动成功
- 访问对应的ip,看是否能看到nginx 的欢迎界面
- 如果无法访问,查看防火墙是否已关闭
systemctl status firewalld 查看防火墙状态
systemctl stop firewalld 关闭防火墙systemctl disable firewalld 永久关闭防火墙
systemctl start firewalld 开启防火墙
- 卸载nginx步骤
- 关闭nginx进程 ./nginx -s stop
- 删除安装的nginx rm -rf /usr/local/nginx
- 清除编译环境 make clean
Nginx是多进程的方式工作,一个master进程和多个worker进程。
Nginx master进程id的获取
方式一: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区别
调用命令为: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
方案一:使用Nginx服务信号完成Nginx的升级
方案二:使用Nginx安装目录的make命令完成升级
环境准备:将新版本的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
第一步:将旧版本的sbin目录下的nginx进行备份
mv nginx nginxold
第二步:将新版本安装目录编译后的objs目录下的nginx文件,拷贝到旧版本的sbin目录下
cp nginx /usr/local/nginx/sbin
第三步:进入到安装目录,执行make upgrade
make upgrade
第四步:查看是否更新成功
./nginx -v
目录默认在:/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;
}
}
}
vim /etc/profile
在最后一行添加:
export PATH=$PATH:/usr/local/nginx/sbin
source /etc/profile
nginx -V
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地址的饿时候,如果网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页,只有当网站明确标识资源已经更新,浏览器才会再次下载网页。
同源:协议、域名(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端口
简单描述如下:
有两台服务器,分别为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;
}
}
什么是资源盗链
资源盗链指的是此内容不在自己服务器上,而是通过技术手段,绕过别人的限制将别人的内容放到自己页面上最终展示。以此来盗取大网站的空间和流量。简而言之就是用别人的东西成就自己网站。
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是Nginx服务器提供的,主要作用是用来实现URL的重写。
注意:Nginx服务器的Rewrite功能的实现依赖于PCRE(正则表达式库)的支持,因此在编译安装Nginx服务器之前,需要安装PCRE库。Nginx使用的是ngx_http_rewrite_module模块来解析和处理Rewrite功能的相关配置。
正向代理:代理服务器代理的是客户端,帮助客户端去请求服务器,返回数据给到客户端。此时客户端的访问服务器的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地址
}
}
代理服务器配置完成后,还需要在客户端配置代理服务器。
反向代理:代理服务器代理的是服务器端,在代理服务器会通过配置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;
关闭该功能。
(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
问题:
1、服务端接收请求的时候,超出了最高的并发处理能力,该如何解决。
2、服务端如果宕机了,该如何解决。
早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大,并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器及进行型性能的水平扩展及避免单点故障出现。那么如何将不同用户的请求流量分发到不同的服务器上呢?
方式一:用户手动选择
在网站页面上提供不同线路,不同服务器连接方式,让用户自己选择访问的具体的服务器。
方式二:DNS轮询方式
DNS
域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与IP地址的互相转换。
一个域名可以分配多个IP
优点:投入成本低
缺点:可靠性低、负载不均衡
方式三:四/七层负载均衡
首先了解一个概念:OSI(open system interconnection),叫开放式系统互联模型。这个是由国际标准化组织ISO指定的一个不基于具体机型、操作系统或公司的网络体系结构。该模型将网络通信的工作分为七层。
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
所谓四层负载均衡指的是OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡;
所谓的七层负载均衡指的是在应用层,主要是基于虚拟的URL或主机IP的负载均衡。
区别
四层负载均衡数据包时在底层就进行了分发,而七层负载均衡数据包则是在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的要高。
四层负载均衡不识别域名,七层识别。
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秒。
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;
}