nginx 使用总结

总结一下常用的 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、图片、音乐、视频等等。
动态资源: 接口、后端代码。

实现动静分离的两种方法:

  1. 动静资源各自使用一个域名
    有跨域问题,可以通过给一个 location /url 指向静态服务器来解决
  2. 动静资源同域名,通过 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)
请求限流(限制处理速度,可以处理峰值)
  1. 没有加burst 和 nodelay 的情况:
    依照 rate 的速度来处理请求,超过 rate 处理能力范围的直接503。
  2. 加 burst 但不加 nodelay 的情况:
    依照 rate 的速度来处理请求,超过了(burst + rate)处理能力的请求直接503直接503,在缓冲队列中的请求会按照 rate 的速度慢慢处理。
  3. 同时加 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;     #开启文件预压缩
}

你可能感兴趣的:(nginx 使用总结)