nginx 使用笔记

nginx

nginx是一个高性能 轻量级 的web服务器
主要是静态服务器,可以支持动态请求的转发
采用多进程模型

文档

负载均衡

upstream模块

upstream用在http/server模块下

7层负载均衡配置

  • 方案
  1. url_hash
upstream server-test{
        #hash $request_uri consistent;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
}

  1. ip_hash

upstream server-test{
#ip_hash;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}

  1. robbin轮询默认

upstream server-test{
//相当于权重1:1
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}

  1. 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;
}

  1. fair 按响应时间来分配请求

根据请求响应大小,以及加载时间长短 服务器性能 智能的负载均衡
需要安装第3方模块

upstream server-test{
		fair;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
}
  • 配置
  1. backup 备机,主有在主机宕机或是满负荷之后,才参与调度
  2. down 不参与负载均衡,主机宕机之后,也不参与,必须手动设置开启
  3. max_fails 请求失败的次数 失败n次后,转向下一个服务
  4. fail_timeout 请求失败后,等待的时间
  • 节点失效判断
  1. 默认 是 connect_refuse time_out
  2. 可以通过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;

安全

  1. 启动用户

静态资源服务器一般都是直接面向客户端的,所以应当把权限压倒最小,直接用nginx用户启动,这样即使有漏洞,被利用的也是nginx的用户,而不是root用户

user nginx;
  1. 隐藏版本

隐藏版本不能从根本上解决问题,但是可以隐藏一部分问题,争取时间

server_tokens off;

平稳升级

  1. 替换旧文件
  2. 设置旧进程不再接受请求

kill -USR2 3760

  1. 关闭旧的进程

kill -WINCH 3760

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值