nginx可以处理静态资源,也可以反向代理处理动态资源。
反向代理对于用户来说,就是用户访问反向代理服务器就相当于访问真实的服务器。
反向代理的优势:
- 影藏真实服务器;
- 便于横向扩充后端动态服务;
- 动静分离,提升系统健壮性;
指令集
- upstream : 段名,以 { 开始, } 结束,中间定义上游服务URL;
- server : 定义上游服务地址;
- zone : 定义共享内存,用于跨worker子进程;
- keepalive : 对上游服务启用长连接;(限制每个worker子进程与上游服务器空闲长连接的最大数量;)
- keepalive_requests : 一个长连接最多请求个数;
- keepalive_timeout :空闲情形下,一个长连接的超时时长;
- hash : 哈希负载均衡算法;
- ip_hash : 依据IP进行哈希计算的负载均衡算法;
- least_conn : 最少连接数负载均衡算法;
- least_time : 最短响应时间负载均衡算法;
- random : 随机负载均衡算法;
- proxy_request_buffering:默认on,nginx完全接收包体后再发送给上游服务器;若off,需要建立大量连接,一边接收,一边发送;
- client_max_body_size:可以处理的请求体的大小,上传文件或者图片需要考虑调大改字段,避免发送失败;
- client_max_buffer_size:这个对应上面的proxy_request_buffering是否开启,如果开启了这个就是限制缓冲区大小的的相关指令;
proxy_pass URI 带/和不带/的区别
- 不带/意味着nginx不会修改用户URL,而是直接透传给上游的应用服务器;
- 带/意味着nginx会修改用户URL,修改方法:将location后的URL从用户URL中删除;
负载均衡算法简介
将请求代理到多台服务器去执行,就称之为负载均衡。
1)默认的nginx代理服务器是使用轮询算法的;
##配置上游服务器:
server {
listen 8081;
location / {
return 200 '应用服务器1';
}
}server {
listen 8082;
location / {
return 200 '应用服务器2';
}
}server {
listen 8083;
location / {
return 200 '应用服务器3';
}
}upstream back_end{
server 192.168.33.10:8081 weight=3; //权重最高
server 192.168.33.10:8082;
server 192.168.33.10:8083;
}
server {
listen 80;
server_name website.com;
charset utf-8;
root html;
location /balance {
proxy_pass http://back_end;
}
2) hash算法
- 将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值我们称之为哈希值;
- 散落明文哈希值的映射是不可逆的;也就是说通过哈希值是不可取为明文的;
通过hash $request_uri来分配请求,只要请求的URI不变,那么就永远将请求转发到唯一一个上游服务器;
upstream back_end{
hash $request_uri;
server 192.168.33.10:8081;
server 192.168.33.10:8082;
}
3)ip_hash算法
就是通过IP地址来进行hash;那么在同一个IP地址上总会得到一个唯一的hash值,就可以固定让某个客户端的所有请求都转发到一台上游服务器上了;
upstream back_end{
ip_hash; //这样就可以了
server 192.168.33.10:8081;
server 192.168.33.10:8082;
}
4)最少连接数算法
无论是轮询,hash,ip_hash都没有考虑到应用服务器的负载情况;只是将请求简单的分发;
如果服务器1处理能力将强,服务器2较弱,那么使用上面的方法就不合理了;
- 从上游服务器,挑选一台当前已建立连接数最少的去分配请求;
- 极端情形下(每台上游服务器处理的请求数量是相同的),最少连接数算法退化为rr算法,就是去轮询了;
upstream back_end{
zone test 10M; //定义个名称是test容量是10M的共享内存空间来记录连接数
least_conn;
server 192.168.33.10:8081;
server 192.168.33.10:8082;
}
容错机制
proxy_next_upstream_timeout 0;//0是无限等待。代理服务器将请求转发给应用服务器后需要等待的时间,如果超过这个值就可以将请求给下一个应用服务器了;
proxy_next_upstream_timeout 0; //0就是不限制调度的次数,如果设为3,就是失败后需要调度3次,超过3次就不调度了,直接给客户端返回错误;
缓存机制
proxy_cache_lock on;设置为on,之后三个相同源请求只有一个会被转发给上游服务器,其它的会进行等待;当上游服务器完全响应之后,nginx代理会缓存内容并响应给客户端,剩余的两个请求直接去缓存中读取响应内容即可;
proxy_cache_lock_age 5s; 假如有三个请求,当第一个请求5秒后没有响应,发送第二个,第二个也没有响应再发送第三个;也就是说这个请求合并是一个一个的发送的的
proxy_cache_use_stale;当无法从原始服务器获取最新的内容时,NGINX可以分发缓存中的陈旧(stale,编者注:即过期内容)内容