秒懂Nginx

Nginx

概念

  • 正向代理 和 反向代理

    • 正向代理是客户端与正向代理客户端在同一局域网,客户端发出请求,正向代理 替代客户端向服务器发出请求。服务器不知道谁是真正的客户端,正向代理隐藏了真实的请求客户端。代理多数是帮助内网 client 访问外网 server 用的。
      反向代理:服务器与反向代理在同一个局域网,客服端发出请求,反向代理接收请求 ,反向代理服务器会把我们的请求分转发到真实提供服务的各台服务器Nginx就是性能非常好的反向代理服务器,用来做负载均衡. 代理将来自外网客户端的请求转发到内网服务器,从外到内。
      

能做什么

反向代理

  • 正向代理:特定情况下,代理用户访问服务器,需要用户手动的设置代理服务器的ip和端口号。
  • 反向代理:是用来代理服务器,代理用户要访问的目标服务器。代理服务器接受请求,然后将请求转发给内部网络的服务器(服务集群模式),并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器。

负载均衡

  • Nginx 可使用的负载均衡策略有:轮询(默认)、 权重、 ip_hash、 url_hash(第三方)、least_conn, fair(第三方)。

  • 负载均衡用于从 “upstream” 模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的 upstream 模块是这样的,模块内的 server 是服务器列表:

    • #动态服务器组
      upstream dynamic_zuoyu {
          server localhost:8080;  #tomcat 7.0
          server localhost:8081;  #tomcat 8.0
          server localhost:8082;  #tomcat 8.5
          server localhost:8083;  #tomcat 9.0
      }
      在 upstream 模块配置完成后,要让指定的访问反向代理到服务器列表:
      
      #其他页面反向代理到tomcat容器
      location ~ .*$ {
          index index.jsp index.html;
          proxy_pass http://dynamic_zuoyu;
      }
      

动静分离

  • 常用于前后端分离,Nginx 提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高

  • Nginx 可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在 Nginx 上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理

  • 拿我们 Java 来说 jsp、servlet 等就是动,因为他们离开我们的 web 服务器的支持就会无法正常工作。而css、html、jpg、js 等文件就是静了。因为离开 web 服务器他一样能正常的工作。

  • Nginx如何做动静分离

    Nginx 根据客户端请求的 url 来判断请求的是否是静态资源,如果请求的 url 包含 jpg、png,则由 Nginx 处理。如果请求的 url 是 .php 或者 .jsp 等等,这个时候这个请求是动态的,将转发给 tomcat 处理。

    总结来说,Nginx 是通过 url 来区分请求的类型,并转发给不同的服务端

还能做什么

  • ip限流

    • 限制所有单个ip的访问频率

      http中的配置

      http {
          #$limit_conn_zone:限制并发连接数
          limit_conn_zone $binary_remote_addr zone=one1:10m;
          #limit_req_zone:请求频率
          #$binary_remote_addr:以客户端IP进行限制
          #zone=one:10m:创建IP存储区大小为10M,用来存储访问频率
          #rate=10r/s:表示客户端的访问评率为每秒10次
          limit_req_zone $binary_remote_addr zone=one2:10m   rate=10r/s;  
      }
      

      server配置

      server {
              listen       80;
              server_name  localhost;
              location / {
                  #限制并发数2
                  limit_conn  one1  2;  
                  #burst:如果请求的频率超过了限制域配置的值,请求处理会被延迟
                  #nodelay:超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这个请求会被终止,并返回503
                  limit_req   zone=one2 burst=10 nodelay;
                  root   html;
                  index  index.html index.htm;
              }
      }
      
  • 配置黑白ip名单

    • 配置说明(黑名单 deny, 白名单 allow)

      1. 可新建一个配置文件,如 blockip.conf。在其中编写相关的 ip 限制语句,然后在 nginx.conf 中加入如下配置:

        # 配置ip限制策略
        include blockip.conf; 
        
      2. nginx 会根据配置文件中的语句,从上至下依次判断。因此,写在前面的语句可能会屏蔽后续的语句。除部分 ip 白名单外,屏蔽所有 ip 的错误示例:

        deny all; # 该语句已经禁止所有ip的访问,后续的配置不会生效
        allow 123.45.25.6;
        allow 123.68.52.125;
        allow 123.125.25.106;
        

        正确示例:

        # 允许部分ip访问
        allow 123.45.25.6;
        allow 123.68.52.125;
        allow 123.125.25.106;
        # 禁止其余ip访问
        deny all; 
        
      3. 屏蔽策略文件可以放在 http, server, location, limit_except 语句块中,我们可以根据需要合理的配置。

      放置位置效果
      httpnginx 中所有服务起效
      server指定的服务起效
      location满足的 location 下起效
      limit_except指定的 http 方法谓词起效

Nginx开启gzip压缩

  • Nginx 开启 Gzip 压缩功能, 可以使网站的 css、js 、xml、html 文件在传输时进行压缩,提高访问速度, 进而优化 Nginx 性能。
  • gzip 不一定适用于所有文件的压缩。例如,文本文件压缩得非常好,通常会缩小两倍以上。另一方面,诸如 JPEG或 PNG 文件之类的图像已经按其性质进行压缩,使用 gzip 压缩很难有好的压缩效果或者甚至没有效果

配置项

Nginx rewrite 常用的全局变量如下:

变量说明
$args存放了请求 url 中的请求指令。比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的arg1=value1&arg2=value2
$content_length存放请求头中的 Content-length 字段
$content_type存放了请求头中的 Content-type 字段
$document_root存放了针对当前请求的根路径
$document_uri请求中的 uri,不包含请求指令 ,比如比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 /server/source
$host存放了请求 url 中的主机字段,比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 www.myweb.name。如果请求中的主机部分字段不可用或者为空,则存放 nginx 配置中该 server 块中 server_name 指令的配置值
$http_user_agent存放客户端的代理
$http_cookiecookie
$limit_ratenginx 配置中 limit_rate 指令的配置值
$remote_addr客户端的地址
$remote_port客户端与服务器端建立连接的端口号
$remote_user变量中存放了客户端的用户名
$request_body_file存放了发给后端服务器的本地文件资源的名称
$request_method存放了客户端的请求方式,如 get,post 等
$request_filename存放当前请求的资源文件的路径名
$requset_uri当前请求的 uri,并且带有指令
$query_string$args 含义相同
$scheme客户端请求使用的协议,如 http, https, ftp 等
$server_protocol客户端请求协议的版本,如 ”HTTP/1.0”, ”HTTP/1.1”
$server_addr服务器的地址
$server_name客户端请求到达的服务器的名称
$server_port客户端请求到达的服务器的端口号
$uri$document_uri
  • 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
  • 2.$remote_user :用来记录客户端用户名称;
  • 3.$time_local : 用来记录访问时间与时区;
  • 4.$request : 用来记录请求的url与http协议;
  • 5.$status : 用来记录请求状态;成功是200;
  • 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • 7.$http_referer :用来记录从那个页面链接访问过来的;
  • 8.$http_user_agent :记录客户端浏览器的相关信息

Nginx epoll

为什么 epoll 快,比较一下 Apache 常用的 select 和 Nginx 常用的 epoll:

select

  1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048,因此 Select 模型的最大并发数就被相应限制了。自己改改这个 FD_SETSIZE? 想法虽好,可是先看看下面吧。
  2. 效率问题,select 每次调用都会线性扫描全部的 FD 集合,这样效率就会呈现线性下降,把 FD_SETSIZE 改大的后果就是,大家都慢慢来,什么?都超时了。
  3. 内核/用户空间,内存拷贝问题,如何让内核把 FD 消息通知给用户空间呢?在这个问题上 select 采取了内存拷贝方法,在 FD 非常多的时候,非常的耗费时间。

总结为:1、连接数受限 2、查找配对速度慢 3、数据由内核拷贝到用户态消耗时间。

epoll

  1. Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 查看。
  2. 效率提升,Epoll 最大的优点就在于它只管你 “活跃” 的连接 ,而跟连接总数无关,因此在实际的网络环境中,Epoll 的效率就会远远高于 select 和 poll。
  3. 内存共享,Epoll 在这点上使用了 “共享内存”,这个内存拷贝也省略了

Nginx多进程

Nginx 是通过基于异步及非阻塞的事件驱动模型和多进程机制实现高性能的。

  1. 进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低编程的复杂度,降低开发成本;
  2. 采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinBin_Bang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值