nginx
简介(包含优缺点)
-
体积小、配置简单、可缓存、稳定性强、单线程异步处理非阻塞、健康检查、跨平台、好移植、高并发、动静分离、负载均衡、反向代理、应用广泛;处理动态文件不够有优势可进行反向代理的 web 服务器;大量支持并发(官方测 5 万),配置简单上手快
-
用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议
原理
处理 http 请求
-
多进程机制(单线程)
-
master 单进程、worker 多个(亲缘性 CPU 内核)
- 1、nginx 启动时,会启动 master 主进程,建立好需要 listen 的 socket(listenfd)之后,再 fork 出对应数量的 worker 进程
- 2、nginx 的 master 主进程通过 for 循环的方式处理请求信号,worker 进程通过 for 循环的方式处理请求
- 3、所有 worker 的 listenfd 在新连接到来时均为可读状态,master 向可接收 worker 发出信号;所有 worker 开始抢占 accept_mutex 互斥锁,抢到的 worker 启动进程,在读事件里调用 accept 确认接收连接,然后开始接收、处理、响应请求,提供数据;响应结束之后,断开连接
-
单线程的原因
- 异步非阻塞处理请求,不会为每个请求分配 CPU 和内存资源,节省大量资源,减少 CPU 上下文切换,得以支持更高并发;
-
-
异步非阻塞
- epoll 队列:异步 IO 处理队列,非阻塞
基本配置
分块说明:
1、全局块:配置影响 nginx 全局的指令。一般有运行 nginx 服务器的用户组,nginx 进程 pid 存放路径,日志存放路径,配置文件引入,允许生成 worker process 数等。
2、events 块:配置影响 nginx 服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http 块:可以嵌套多个 server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type 定义,日志自定义,是否使用 sendfile 传输文件,连接超时时间,单连接请求数等。
4、server 块:配置虚拟主机的相关参数,一个 http 中可以有多个 server。
5、location 块:配置请求的路由,以及各种页面的处理情况。
location 匹配规则
- ~ 区分大小写
- ~* 不区分大小写
- !~* 取不区分大小写的对立
- / 通配符
- ^~ 以…开头
基础命令
- -s signal Send signal to a master process: stop, quit, reopen, reload.
- -c filename Specify which configuration file NGINX should use instead of the default.指定 NGINX 应该使用哪个配置文件而不是默认值
- -g directives Set global directives.设置全局指令
通常用处及配置
虚拟主机
把一台真实的物理服务器主机分割成多个逻辑存储单元,每个逻辑存储单元无物理实体,但都能像真实物理主机一样在网络上工具,具有 ip 地址、独立域名及完整的 internet 服务器(www、ftp、E-mail 等)功能。
基于域名、端口、ip
虚拟主机三种类型及配置
负载均衡
-
策略配置
-
ip_hash
-
weight
-
least_conn 最少连接
- 下个请求被分配到活动连接数量最少的服务器
-
轮询 round_robin
- 每个请求逐一按时间顺序分配到不同后端服务器,若其 down 掉,自动去除
-
配置模块:ngx_http_upstream_server_module ()
upstream virtualServer {
# round_robin # 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
# least_conn # 下一个请求分配到连接最少的主机
# ip_pash; # 固定ip请求分组,有助于用户session的存储校验
localhost:8081 weight 3; # weight 侧重比例
localhost:8082;
localhost:8083 backup; # backup 其他都挂掉开启
}
server {
location / {
http_pass http://$virtualServer
}
}
动静分离
- 配置示例
#动态访问请求转给tomcat应用处理
location ~ .(jsp|page|do)?$ { #以这些文件结尾的
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://tomcat地址;
}
#设定访问静态文件直接读取不经过tomcat
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { #以这些文件结尾的
expires 30d;
root /data/web/html ;
}
反向代理
正反向代理:
(作用在客户端/服务端)客户端是否在发起请求时知晓资源的具体来源地址;(通常正向代理与客户端同域)
proxy_pass
补充测试方式:
客户端主机:10.0.10.159 通过 ab 命令模拟并发访问:
[root@10.0.10.159 ~]#ab -n 10 -c 10 http://10.0.10.158/download/index.html
-n:总请求数:10
-c:单个时刻并发 10
gzip
http 块下配置,基本属性如下:
gzip on
gzip_types text/plain application/x-javascript text/css application/xml; # 压缩类型,默认值 text/html;
gzip_http_version 1.0 # 默认1.1,大部分浏览器已支持解压,默认即可
gzip_min_length 1k # 默认值0,最少起压值
gzip_buffers 4 16k # 默认值4 4k/8k,开辟对应空间作为压缩流缓存,默认申请与原始数据大小相同的内存
gzip_comp_level 2 # 默认值1,量级,小快,大势必占内存慢,但大传输快
gzip_vary on # 是否允许经过的服务器进行缓存
# 图片视频不建议压缩,非但减小,在压缩过程还会消耗cpu和内存资源
gzip_proxied[off|expired|nocache|nostore|private|no_last_modified|no_etag|auth|any] ...
# 默认值:off Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。 off - 关闭所有的代理结果数据的压缩 expired - 启用压缩,如果header头中包含 "Expires" 头信息 no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息 no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息 private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息 no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息 no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息 auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息 any - 无条件启用压缩
流量及连接数控制
-
正常、异常流量
-
ngx_http_limit_req_module 模块(漏桶算法 leaky bucket)
-
配置示例
limit_req_zone $binary_remote_addr zone=limitZone:10m rate=10r/s; # $binary_remote_addr -> 198.168.2.1 # 10m:对应大小的存储ip地址访问信息空间 # rate ip访问速率 server { location / { # limit_req zone=limitZone # 正常流量 limit_req zone=limitZone brust=20 nodelay # 异常流量 # brust=20 nodelay 每个用户额外扩大20个连接队列位置,处理下一波时间依旧按照rate } }
-
漏桶算法
-
令牌桶算法
-
令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送
-
-
连接数
-
ngx_http_limit_conn_module 模块
-
配置示例
limit_conn_zone $binary_remote_addr zone=perip:10m # 每个ip limit_conn_zone $server_name zone=perserver:10m # 每个服务器 server { location / { limit_conn perip 10; limit_conn perserver 100; } }
-
-
通用概念
- zone、m
其他
编辑实际遇到问题
root vs alias
1.使用 alias 时,目录名后面一定要加”/“,指定的目录是准确的,给 location 指定一个目录;root 目录名后面不加”/“,指定目录的上级目录,并且该上级目录要含有 locatoin 指定名称的同名目录。 2.使用 alias 标签的目录块中不能使用 rewrite 的 break。
3.alias 在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
4.alias 只能位于 location 块中,root 可配置块:http、server、loaction、if
nginx 配置 root、alias 区别
指令
-
stub_status
- 获取进程的状态,连接进度及个数
-
sub_filter
- 替换响应的内容
报错码
- 502 bad gateway 网关错误;已经与后端建立了连接,但超时;
- 503 服务器短暂不可连,临时超载或维护
- 504 gateway time-out 网关超时;与后端连接未建立,超时。
url 保留双斜线
- merge_slashes [on/off]
获取时间
添加模块
ngx_http_upstream_module
- fastcgi
- proxy
- uwsgi
- memcached
- scgi