[nginx]-负载均衡和静态代理

nginx是什么

Nginx(engine x)是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。


nginx的组成


我们将nginx四个组成部分做一个生动的比较

  1. 二进制可执行文件:汽车
  2. 配置文件:驾驶员
  3. access.log:GPS轨迹
  4. error.log:黑匣子


nginx的安装

nginx在Linux下编译安装:

  1. 先解压tar文件
  2. 运行: ./configure —prefix=/usr/local/nginx(填写你自己的安装目录)
  3. make
  4. make install


配置文件的基本语法


配置文件conf/nginx.conf里有四种指令块:


nginx命令


nginx可以做什么?

nginx的两大作用:

  1. 做为静态代理服务器
  2. 做为反向代理服务器。


静态代理服务器

配置静态代理服务器

用vim/vi命令打开conf目录下的nginx.conf文件

这个配置文件的意思是:

nginx服务启动端口为8080,名字为geet.taohui.pub。

静态代理的方式有两种:
1.alias

1
2
3
location /request_path/image/ {
alias /local_path/image/;
}

这时候,当客户端请求 /request_path/image/cat.png 的时候,
Nginx把请求映射为/local_path/image/cat.png
对比root就可以知道怎么用了吧~~ :)

2.root

1
2
3
location /request_path/image/ {
root /local_path/image/;
}

这样配置的结果就是当客户端请求 /request_path/image/cat.png 的时候,
Nginx把请求映射为/local_path/image/request_path/image/cat.png


使用autoindex

在server指令块中添加autoindex on;指令,表示开启autoindex功能。
该功能可以查看静态服务器中的资源目录如(访问路径以/结尾)


资源压缩

静态资源服务器可以先将文件压缩,再传输,对于大文件可以提高传输效率,但是如果对于过小的文件,再进行压缩的话可能会耗时更多。

开启文件压缩:

配置参数含义:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
gzip
语法: gzip on|off
默认值: gzip off
作用域: http, server, location, if (x) location
开启或者关闭gzip模块

gzip_buffers
语法: gzip_buffers number size
默认值: gzip_buffers 4 4k/8k
作用域: http, server, location
设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。

gzip_comp_level
语法: gzip_comp_level 1..9
默认值: gzip_comp_level 1
作用域: http, server, location
gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。

gzip_min_length
语法: gzip_min_length length
默认值: gzip_min_length 0
作用域: http, server, location
设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
默认值是0,不管页面多大都压缩。
建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024

gzip_http_version
语法: gzip_http_version 1.0|1.1
默认值: gzip_http_version 1.1
作用域: http, server, location
识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。 注:21世纪都来了,现在除了类似于百度的蜘蛛之类的东西不支持自解压(百度就是SX,我就不说了),99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。

gzip_proxied
语法: gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...
默认值: gzip_proxied off
作用域: http, server, location
Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。
off - 关闭所有的代理结果数据的压缩
expired - 启用压缩,如果header头中包含 "Expires" 头信息
no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息
no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息
private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息
no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息
no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息
auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息
any - 无条件启用压缩

gzip_types
语法: gzip_types mime-type [mime-type ...]
默认值: gzip_types text/html
作用域: http, server, location
匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。

如果你希望压缩常规的文件类型,可以写成这个样子

1
2
3
4
5
gzip on;
gzip_min_length  1000;
gzip_buffers     4 8k;  
gzip_http_version 1.1;
gzip_types       text/plain application/x-javascript text/css text/html application/xml;


反向代理实现负载均衡

nginx中可以配置多台虚拟主机,在nginx中可以配置多个虚拟主机,也就是配置多个server指令块。
我们这里配置一台虚拟主机为上游服务,另外台主机作为代理服务器。

上游服务的配置:

将配置服务器设置为代理服务器的上游服务:

配置代理服务器:

重启一下nginx服务器,之后去访问8000端口,代理服务器会转发请求到上游服务器。这时候有一个问题出现了,我们去访问代理服务器,代理服务器再去访问上游服务器,那么我们实际要传递给上游服务器的请求头数据,并不会被上游服务器接受到,如remote_addr等参数,这时候我们可以在代理服务器中设置代理请求头来将参数传递给上有服务器:

1
2
3
4
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header 就是可设置请求头-并将头信息传递到服务器端,不属于请求头的参数中也需要传递时,重定义下即可!

这样我们就配好了反向代理服务了。如果被代理的服务有多台(实现集群),那么其运行的原理就如下图:


轮询

nginx的反向代理服务默认使用轮询的分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。

1
2
3
4
5
upstream backend {
server 192.168.1.101:8888;
server 192.168.1.102:8888;
server 192.168.1.103:8888;
}


Weighted Round Robin

轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。weight和访问比率成正比。

1
2
3
4
5
upstream backend {
server 192.168.1.101 weight=1;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=3;
}


ip_hash

每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题(这种解决方案并不完美)。

1
2
3
4
5
6
upstream backend {
ip_hash;
server 192.168.1.101:7777;
server 192.168.1.102:8888;
server 192.168.1.103:9999;
}

注意:
1、当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
2、导致负载不均衡。


fair

fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。如果需要使用这种调度算法,必须下载Nginx的upstr_fair模块。

1
2
3
4
5
6
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
fair;
}


url_hash

目前用consistent_hash替代url_hash,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。

1
2
3
4
5
6
7
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
hash $request_uri;
hash_method crc32;
}

其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
提示:url_hash用途cache服务业务,memcached,squid,varnish。特点:每个rs都是不同的。


缓存

因为nginx的性能远远领先于上游服务器的性能。我们可以给实时性要求不高的服务添加缓存,这样可以大大提高性能。
在localhost指令块里面配置:

1、proxy_cache_path
proxy_cache_path定义一个完整的缓存空间,指定缓存数据的磁盘路径、索引存放的内存空间以及一些其他参数,如缓存删除策略。

注意,该选项只能定义在http块上下文中。

如:

1
proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10;

缓存数据存储在/data/cache目录中;

levels:配置在该目录下再分两层目录,一层1个随机字符作为名称,二层2个随机字符作为名称,levels最多三层,每层最多两个字符,这是为了加快访问文件的速度;最后使用代理url的哈希值作为关键字与文件名,一个缓存数据如下:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;

keys_zone:用来为这个缓存区起名,并设置大小。指定名称为web,这个名称后面proxy_cache需要

引用;而10m就是内存空间的大小;

max_size:指定最大缓存数据磁盘空间的大小,最多缓存的数据大小,如果超过这个大小,就开始清理缓存数据,使用lru算法将最近最少使用的缓存数据清理掉。

inactive:在inactive指定的时间内,未被访问的缓存数据将从缓存中删除。

2、proxy_cache
proxy_cache用来引用上面proxy_cache_path定义的缓存空间,实现打开缓存功能,如下:

1
proxy_cache web; #引用上面定义上的缓存空间,同一缓存空间可以在几个地方使用

3、proxy_cache_valid
proxy_cache_valid设置不同响应代码的缓存时间,如:

1
proxy_cache_valid 200 302 10m;

响应状态码为200 302的数据缓存住到失效的时间为10分钟,不管有没有人来访问这些数据,10分钟后都将失效

1
proxy_cache_valid 404 1m;


配置日志输出格式

日志输出是我们查找错误和记录数据的重要手段,nginx可以自己配置输出的日志格式。

上图中注释的就是日志格式配置。我们先声明一个格式 log_format 取名为main 。

1
2
3
4
5
6
7
8
9
相关说明解释
1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
2.$remote_user :用来记录客户端用户名称;
3.$time_local : 用来记录访问时间与时区;
4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200,
6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.$http_referer :用来记录从那个页面链接访问过来的;
8.$http_user_agent :记录客户端浏览器的相关信息;

根据需求,也可以设置成JSON格式的输出:

1
2
3
4
5
6
7
8
9
10
11
12
log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';

配置日志输出地址和格式:

1
access_log logs/access.log main;

语法:access_log [地址] [格式]


Goaccess日志监听工具

Goaccess是一个工具 需要安装,功能很强大。(具体配置以后再做研究)


参考

缓存:https://www.cnblogs.com/meng6/p/7827827.html
静态代理压缩:https://blog.csdn.net/jessonlv/article/details/8016284
日志输出格式:https://blog.csdn.net/zhangruizhou001/article/details/53072174
alias与root区别:https://www.cnblogs.com/kevingrace/p/6187482.html
负载均衡策略:https://www.cnblogs.com/linjiqin/p/5494783.html
proxy_set_header:https://www.cnblogs.com/jsonhc/p/7199295.html?utm_source=itdadao&utm_medium=referral

-------------本文结束感谢您的阅读-------------