nginx基础学习记录

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

使用未定义的服务名称阻止处理请求 return 444

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值