nginx常用功能有三:正反代理、负载均衡、动静分离。
近一年的时间,一头扎在B/S结构的项目上,nginx常见的应用形式基本都能接触到一点点,这里简单总结下,便于日后自己复习。
用一个例子来说明:
A是一名顾客,要买一套房子;B是中介,手里有C的房源信息;C是房屋的拥有者,准备出售房屋。理论上A直接找C买了房子就可以了,但是A和C互相不认识,A和C无法达成交易。A找了B,B找了C,这样就可以实现A和C的交易了。在这个例子中,B的角色就是一个代理的角色。
正向代理和反向代理
A找C买房,即A——>C这个方向是正向,那么C——>A就是反向。
如果A是不固定的,C是固定的,即房源只有一套。B是为卖房者代理,这里的B就是反向代理。
如果A是固定的,即只有一个顾客,C是不固定的,有若干套房源。B为买房者代理,这里的B就是正向代理。
目的:实现Server_1 访问 Server_3。
现状:服务器1无法直接访问服务器3;找来服务器2,既可以访问服务器1,也可以访问服务器3;
实现:在服务器上使用nginx将server_3进行一次代理,server_1访问server_2,透过代理可实现访问到server_3
server {
resovler 8.8.8.8; #必须要有resovler,且不能有hostname
resoler_timeout 30s;
listen 8080;
location / {
proxy_pass http://$http_host$request_url; #定义代理的url
proxy_set_header Host $http_host;
proxy_buffers 256 4k; #配置缓存大小
proxy_max_temp_file_size 0; #关闭磁盘缓存读写减少I/O
proxy_connect_timeout 30; #设置连接超时时长
proxy_cache_valid 200 302 10m; #设置http不同状态的缓存时长
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}
server {
listen 8081;
server_name localhost; #非域名访问,可以不用设置
location / {
proxy_pass http://192.168.28.10:80;
proxy_set_header $http_host; #代理后,携带host信息
proxy_set_header X-Real-IP $remote_addr; # X-Real-IP 真实的客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # X-Forwarded-For 记录经过所有代理(匿名除外)
}
}
负载均衡:所谓负载均衡,是将高负载均衡散落到多台服务器上,实现压力的均衡。
下面举4个负载均衡的示例,一起看下:
upstream的负载均衡,后面加上一个自定义的字符串,字符串可在后面的server中被引用;
weight是权重,可以根据机器配置定义权重。
weigth参数表示权值,权值越高被分配到的几率越大。
upstream myserver {
server 192.168.28.11:80 weight=3;
server 192.168.28.12:80 weight=2;
server 192.168.28.13:80 weight=3;
}
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
简而言之,同一个IP发起的请求,会分配给同一个服务上。看示例:
upstream myserver {
ip_hash;
server 192.168.28.14:80;
server 192.168.28.15:80;
}
此种方式,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
fair功能的使用,需要依赖第三方的组件,在nginx编译的时候,需要将此功能编译好。
upstream myserver {
server 192.168.28.16:80;
server 192.168.28.17:80
fair;
}
此种方式,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
url_hash功能的使用,需要依赖第三方的组件,在nginx编译的时候,需要将此功能编译好。
在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream backend {
server 192.168.28.18:3128;
server 192.168.28.19:3128;
hash $request_uri;
hash_method crc32;
#}
看个例子:
upstream myserver {
server 192.168.28.21:80;
server 192.168.28.22:80 weight=2;
server 192.168.28.24:80 down;
server 192.168.28.25:80 backup;
server 192.168.28.26:80 weight=3 max_fails=3 fail_timeout=15; #3次失败,关闭15s
}
每个设备的状态情况如下表所示:
序号 | 状态 | 描述 |
---|---|---|
1 | down | 表示单前的server暂时不参与负载 |
2 | weight | 权重,weight越大,负载的权重就越大 |
3 | max_fails | 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 |
4 | fail_timeout | max_fails次失败后,暂停的时间 |
5 | backup | 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻 |
在一个网页页面中,存在动态资源和静态资源的区分。使用 可以看到:
在 ( F12 ) 的检查页面中,动态资源和动态资源具有明显的分类。具体如下
资源类型 | 资源描述 | 备注 |
---|---|---|
动态资源 | XHR(XMLHttpRequest)/fetch | 后端资源 |
静态资源 | js文件、img图片、media媒体文件、font字体文件、doc文本文件 | 前端资源 |
所谓动静分离,即将动态资源和静态资源分离,我们使用nginx可以实现。
在nginx的实现中,是使用一个server,创建多个location。每个location可以指定不同的路径,从而实现对不同服务的访问。
下面是一个完整的动静分离nginx配置,请仔细阅读:
server {
listen 8080;
server_name localhost;
#静态资源
location / {
root /home/dist; #定义静态资源文件
index index.htm index.html; #定义index文件名,默认访问的文件
tryfiles $uir $uri/ /index.html; #优先访问根目录下的index.html文件
}
#动态资源
location /server {
proxy_set_header Host $host; #把原http请求的host字段也转发出来,明确访问的是哪个域名的资源。
proxy_set_header REMOTE-HOST $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录每一层转发的代理IP,目的是找到原始IP。
proxy_pass http://192.168.28.10; #反向代理的地址
}
}