总结一下常用的 nginx 功能
常用的 nginx 功能
- 静态服务器
- 根据域名分发路径
- 反向代理
- 动静分离
- 负载均衡
- 跨域
- 限流
- 缓存
- HTTP2.0
- gzip
静态服务器
nginx 基本功能,类似于 tomcat
根据域名分发路径
通过添加更多的 server 配置项来实现
server {
listen 80;
server_name www.baidu1.com;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.google1.com;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
反向代理
客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器
此时反向代理服务器和目标服务器对外就是一个服务器
暴露的是代理服务器地址,隐藏了真实服务器IP地址,提高了服务器的安全性。
通过 location 的 proxy_pass 属性实现
# 访问 http://www.baidu.com,指向 http://127.0.0.1:8080
server {
listen 80;
server_name www.baidu.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm index.jsp;
}
}
动静分离
静态资源: html、js、css、图片、音乐、视频等等。
动态资源: 接口、后端代码。
实现动静分离的两种方法:
- 动静资源各自使用一个域名
有跨域问题,可以通过给一个 location /url 指向静态服务器来解决 - 动静资源同域名,通过 location /url 来区分
无跨域问题,但是动静资源同服务器不利于整体应用效率的提升,动态资源偏执行,静态资源偏访问
负载均衡
解决高并发的问题,将客户端请求分配到不通的服务器上
upstram XXX: 表示负载均衡服务器,也是通常再说的上游服务器。
upstram server 状态:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1,weight越大,负载的权重就越大。
3.max_fails 允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout 请求失败次数消耗完(max_fails)后,暂停的时间。
5.backup 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用
负载均衡算法:
- 轮询
- 权重
- ip绑定。
轮询算法
默认使用轮询算法,按照 upstream 的顺序从上往下,如果服务器 down
掉,能自动剔除。
127.0.0.1:8083 -> 127.0.0.1:8082 -> 127.0.0.1:8081 -> 127.0.0.1:8083
# ****************轮询算法*****************
upstream loadBalance {
server 127.0.0.1:8083;
server 127.0.0.1:8082;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.taobao.com;
location / {
proxy_pass http://loadBalance;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
权重算法
为服务器配置被访问的比例,数字越大表示轮到的概率越大
8083、8082 、8081 被访问的概率比为3:2:1
# ****************权重算法*****************
upstream loadBalance {
server 127.0.0.1:8083 weight=3;
server 127.0.0.1:8082 weight=2;
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name www.taobao.com;
location / {
proxy_pass http://loadBalance;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
PS:权重算法是指分配的概率,不代表6个请求中连续的3个都在8083
例如:[8083,8082,8081,8083,8083,8082]
因此轮询算法 ≠ weight等于1的权重算法
# 下面两者不等价
upstream loadBalance {
server 127.0.0.1:8083;
server 127.0.0.1:8082;
server 127.0.0.1:8081;
}
upstream loadBalance {
server 127.0.0.1:8083 weight=1;
server 127.0.0.1:8082 weight=1;
server 127.0.0.1:8081 weight=1;
}
IP算法
第一次访问时,nginx会将ip通过哈希算法,算出值,然后分配到一个服务器。
之后的每一次访问都是去请求那个第一次访问的服务器。(无session问题)
upstream loadBalance {
server 127.0.0.1:8082;
server 127.0.0.1:8081;
ip_hash;
}
server {
listen 80;
server_name www.taobao.com;
location / {
proxy_pass http://loadBalance;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
跨域
http {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
限流
限流限制的是客户端的IP请求的并发连接数和客户端的IP每秒被允许的请求数。
- 请求限流(漏桶、令牌桶)(ngx_http_limit_req_module)
- 流量限制(ngx_stream_limit_conn_module)
- 服务端限流(ngx_http_upstream_module)
请求限流(限制处理速度,可以处理峰值)
- 没有加burst 和 nodelay 的情况:
依照 rate 的速度来处理请求,超过 rate 处理能力范围的直接503。 - 加 burst 但不加 nodelay 的情况:
依照 rate 的速度来处理请求,超过了(burst + rate)处理能力的请求直接503直接503,在缓冲队列中的请求会按照 rate 的速度慢慢处理。 - 同时加 burst 和 nodelay 的情况:
可以爆发出一个峰值处理能力(burst + rate),对于峰值处理数量之外的请求直接503。在完成峰值请求之后,缓冲队列不能再放入请求。如果rate=10r/m,且这段时间内没有请求再到来,则每6 s 缓冲队列就能回复一个缓冲请求的能力,直到回复到能缓冲 burst 个请求为止。
# $binary_remote_addr 客户端请求的IP地址;
# mylimit 自定义的缓存区变量名,后跟缓存区大小;
# rate 请求频率,每秒允许多少请求;
# limit_req 与 limit_req_zone 对应
# burst 被缓存的请求数
# nodelay 不延迟处理
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
listen 70;
location / {
# 同一个 IP 每秒只能发送一次请求(1r/s),这里配置了缓存3个请求,即一秒内最多 4 个请求响应成功,其它请求则返回503错误
limit_req zone=mylimit burst=3 nodelay;
proxy_pass http://localhost:7070;
}
}
}
流量限制(限制并发连接数和处理速度)
# $binary_remote_addr 客户端请求的IP地址;
# myconn 自定义的缓存区变量名,后跟缓存区大小;
# limit_rate 限制传输速度
# limit_conn 与 limit_conn_zone 对应,限制网络连接数
http {
limit_conn_zone $binary_remote_addr zone=myconn:10m;
server {
listen 70;
location / {
# 每个 IP 只允许一个连接
limit_conn myconn 1;
# 限制传输速度(如果有N个并发连接,则是 N * limit_rate)
limit_rate 1024k;
proxy_pass http://localhost:7070;
}
}
}
服务端限流
upstream loadBalance {
server 127.0.0.1:8080 max_conns=10;
server 127.0.0.1:8081 max_conns=10;
}
缓存
HTTP2.0
gzip
http {
gzip on; #开启gzip功能
gzip_min_length 1024; #响应页面数据上限
gzip_buffers 4 16k; #缓存空间大小
gzip_http_version 1.1; #http协议版本
gzip_comp_level 4; #压缩级别4
gzip_types text/plain application/x-javascript text/css application/xml text/javascript;
gzip_vary on; #启用压缩标识
gzip_static on; #开启文件预压缩
}