nginx
nginx是一个高性能 轻量级 的web服务器
主要是静态服务器,可以支持动态请求的转发
采用多进程模型
负载均衡
upstream模块
upstream用在http/server模块下
7层负载均衡配置
- 方案
- url_hash
upstream server-test{
#hash $request_uri consistent;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
- ip_hash
upstream server-test{
#ip_hash;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
- robbin轮询默认
upstream server-test{
//相当于权重1:1
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
- weight 权重 默认是1 权重越大,优先匹配
upstream server-test{
//1:1 那么交替执行
//2:1 那么请求2次8081 请求1次8082
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=2;
}
- fair 按响应时间来分配请求
根据请求响应大小,以及加载时间长短 服务器性能 智能的负载均衡
需要安装第3方模块
upstream server-test{
fair;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
- 配置
- backup 备机,主有在主机宕机或是满负荷之后,才参与调度
- down 不参与负载均衡,主机宕机之后,也不参与,必须手动设置开启
- max_fails 请求失败的次数 失败n次后,转向下一个服务
- fail_timeout 请求失败后,等待的时间
- 节点失效判断
- 默认 是 connect_refuse time_out
- 可以通过proxy_next_upstream 配置 500 502 503 504 的错误 当失败数大于 max_fails 节点失效
7层代理
http模块
7层http转发和代理
- root
- alias
gzip模块
用在http模块下
- gzip on/off
gzip的开启和关闭
注意即便开启了gzip
也需要有Accept-Encoding头部中包含gzip
- gzip_min_length
满足大小的时候,才进行压缩,匹配的是Content-Length字段
- gzip_http_version
仅对指定版本的http请求进行压缩
- gzip_types
仅对指定的响应类型进行压缩 Content-Type
- gzip_vary
是否添加 “Vary: Accept-Encoding” 响应头
- gzip_disable
对user-agent进行正则匹配 满足要求的不压缩
比如图片一般不需要压缩
- gzip_comp_level
压缩级别
数值越大,压缩率越高,消耗的资源就越多,越慢
对于大文件 值应该大一点,可以减少RTT
- gzip_buffers
压缩时可以使用的缓存的大小
- gzip_proxied
启用和禁用代理请求的响应
因为有些代理可能不支持压缩和解压缩,解析不了响应
location模块
匹配模式
- 精确匹配
=
优先级最高
如: location = /aaa/bbb
- 正则匹配
^~
优先级第2
开头匹配
-
如 location ^~ /aaa/bbb
- ~*
优先级第3
按配置文件的顺序来匹配
匹配到则退出 不会匹配后面的
~ 正则匹配
^~ 正则前缀匹配
~* 正则不分大小写
!~ 不匹配
如 location ~ /aaa/bbb
- 直接跟path
优先级最低
正则匹配
最长匹配
如 location /aaa/bbb/
location /aaa/bbb/c
/aaa/bbb/c/d
优先匹配 /aaa/bbb/c 这条
如果没有/aaa/bbb/c,会选择 /aaa/bbb这条
https://www.jianshu.com/p/38810b49bc29
- 测试工具
https://detailyang.github.io/nginx-location-match-visible/
- location 结尾加 / 只和uri匹配有关 和uri替换无关
proxy_pass中结尾 / 和 uri替换有关
proxy_pass 端口号后面有/ 指明了uri资源的绝对路径 需要在这个目录下进行查找资源 会把location后面的uri替换掉
端口号后面无 / 仅指明了站点,没有指定资源,这个时候不会对locatin中的uri进行替换,会整个拼接
location /a {
这个就指明了资源路径,需要进行uri替换 必须要把 /a 替换掉 ,/a/b 会变成 http://1.1.1.1:80//b
proxy_pass http://1.1.1.1:80/;
这个就指明了资源路径,需要进行uri替换 必须要用 /c 把 /a 替换掉 ,/a/b 会变成 http://1.1.1.1:80/c/b
proxy_pass http://1.1.1.1:80/c;
这个指明了站点,没有指定资源,这时不需要替换 /a 。=> http://1.1.1.1:80/a/b
http://1.1.1.1:80 和 http://1.1.1.1:80/a 是等价的
proxy_pass http://1.1.1.1:80;
}
4层代理
stream 模块
–with-stream
stream{
upstream tcp_proxy {
hash $remote_addr consistent; #远程地址做个hash
server 192.168.10.4:22;
}
server {
listen 2222;
proxy_connect_timeout 1s; #后端链接空闲超时断开
proxy_timeout 10s; #后端连接超时时间
proxy_pass tcp_proxy;
}
}
访问限速
limit zone 模块
{
//为每一个远程地址记录定义一块内存区,用来存放会话信息 大小是10M
//这个支持http配置块
//超过内存大小后会返回503
limit_conn_zone $binary_remote_addr zone=one:10m;
}
{
//使用上面的的内存区
//这个支持http server location配置块
//http中表明1个远程地址只能有1个连接到这个服务 server1 server2也不能共享连接。
//一般不常用,如果http开放了多个服务,那么在访问其中一个服务时,其他服务就不能再访问
//server中表明1个远程地址同一个时刻在不同server间可以有多个会话 一般不常用。
//location中表明1个远程地址同一个时刻在不同location间可以有多个会话
limit_conn one 1;
}
超过限制的请求都会返回503
limit requests 模块
//指定时间内可以允许多少个请求
//1r/s 1s1个
//2r/s 500ms1个 并不是说1s2个 而是500ms内1个 时间均分
limit_req_zone $binary_remote_addr zone=two:10m rate=1r/s;
limit_req_zone $binary_remote_addr zone=two:10m rate=1r/s nodelay;
limit_req zone=two burst=5;
安全
- 启动用户
静态资源服务器一般都是直接面向客户端的,所以应当把权限压倒最小,直接用nginx用户启动,这样即使有漏洞,被利用的也是nginx的用户,而不是root用户
user nginx;
- 隐藏版本
隐藏版本不能从根本上解决问题,但是可以隐藏一部分问题,争取时间
server_tokens off;
平稳升级
- 替换旧文件
- 设置旧进程不再接受请求
kill -USR2 3760
- 关闭旧的进程
kill -WINCH 3760