• Nginx


    Nginx

    三个同类产品 nginx、lighttpd和Apache

    正向代理和反向代理

    正向代理

    正向代理:当客户端无法访问外部资源的时候(由于诸如墙这样的原因),可以通过一个正向代理去间接地访问,所以客户端需要配置代理服务器的ip。
    正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
    正向代理 :即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端。

    正向代理的作用:

    1. 访问原来无法访问的资源,如google
    2. 可以做缓存,加速访问资源
    3. 对客户端访问授权,上网进行认证
    4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

    反向代理

    反向代理:(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器,客户端是无感知代理的存在。
    反向代理 :即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端。

    反向代理的作用

    1. 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
    2. 负载均衡,通过反向代理服务器来优化网站的负载

    图解

    Nginxi简介

    Nginx详解系列文章
    Nginx深度讲解 (含监控zabbix)
    死磕nginx系列

    Nginx是什么?它是一个开源、高性能的WEB服务器软件和代理服务器软件,由俄罗斯人Igor Sysoev 开发实现。它的功能主要分三类,第一是它作为一个WEB服务软件使用;第二它可作为一个反向代理服务器使用,邮件代理服务(通常邮件代理用的非常少);第三它可以基于upstream 或stream模块实现负载均衡,这种负载均衡是基于前面的反向代理增加的功能,它可以基于http协议进行应用层代理,也可以基于tcp协议进行伪四层代理(它不是真正意义上的四层代理,因为它工作在应用层);

    Nginx提供的功能

    • 正向代理
    • 反向代理(负载均衡)
    • Web Cache(缓存)
    • 限流

    Nginx的优点

    1. 高并发。静态小文件
    2. 占用资源少。2万并发、10个线程,内存消耗几百M。
    3. 功能种类比较多。web,cache,proxy。每一个功能都不是特别强。
    4. 支持epoll模型,使得nginx可以支持高并发。
    5. nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
    6. 利用nginx可以对IP限速,可以限制连接数。
    7. 配置简单,更灵活。

    Nginx的程序架构

    Nginx是master/worker架构,由一个master主控进程和一个或多个worker进程组成;master进程主要功能是负责加载和分析配置文件、管理worker进程、平滑升级;worker进程主要负责处理并响应客户端的请求。每个worker进程依靠各种模块以流水线的形式实现各种功能处理;面向客户端网络IO连接请求,nginx的worker进程是基于事件驱动模型使用epoll机制来实现一个worker进程可以处理响应多路请求,如果是BSD系统,它可以使用kevent事件驱动模型实现一个worker进程处理并响应多路请求,从而实现高并发请求处理;面向本地磁盘IO连接请求,它是基于高级IO的sendfile机制,AIO异步机制和mmap内存映射机制,内核直接构建响应报文来完成磁盘IO的高级特性;面向网络IO它不是真正意义上的实现一个纯异步的功能,对于网络IO的第一阶段(数据从磁盘到内核内存)是非阻塞,异步模式,第二阶段(内核内存到进程内存)依然是阻塞的,所以从某种意义上讲它在网络IO上不是一个真正意义上的异步机制,对于磁盘IO它是一个纯异步机制;当客户端发送一个请求到Nginx服务器时,由一个worker进程接收请求,首先它会基于某种策略(根据配置文件中配置),来确定用户请求是否查询本地缓存,如果配置文件中定义的有某某资源需要查询缓存,那么它就会去本地磁盘去查询缓存,如果有,就直接把缓存内容响应给客户端,如果本地缓存里没有客户端请求的资源,那么它会通过代理向后端发送请求,并将后端服务器返回的结果在本地缓存一份,然后再发送给客户端;这样一来当客户端或者其他客户端再来访问同一资源时,它就可以直接从本地缓存中响应客户端;这就是nginx缓存工作逻辑;除此之外,它还可以基于各种协议去代理后端服务器,前端客户端请求到达nginx服务器,它会根据配置文件中定义的规则,把客户端请求代理到后端服务器,从而实现反向代理服务器响应客户端请求;

    Nginx安装
    Nginx开机自启动
    配置Nginx开机启动遇到“/etc/sysconfig/network”文件命令找不到问题(注释掉),“/var/run/nginx.pid”中找不到“nginx.pid”文件问题(Nginx安装时有设置路径,cp一份)

    Nginx基本配置

    主配置文件结构大致可以分为main段(全局配置段)和http配置段或者mail配置段或者stream段,后面的http配置段或mail配置段或stream配置段,主要看nginx用于什么功能,如果单纯的用于web服务器,那么后面的mail和stream配置段就可以不要了,也就是说有关web的配置我们必须要在http配置段配置;同样的如果nginx用于邮件代理我们就需要把有关邮件代理的配置放到mail配置段,如果用于四层负载均衡,我们需要把对应的配置写到stream配置段;我们先说一下全局配置段吧

    main{ #(全局设置)
        http{ #服务器
            upstream{
                #(负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器)
            }
            server{ #(主机设置:主要用于指定主机和端口)
                location{} #(URL匹配特点位置的设置)
            }
        }
    }
    
    # eg.
    # main
    user nginx
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http{
        server{
    
        }
    }
    
    mail{
    
    }
    
    # tcp
    stream{
    
    }
    

    Nginx常用基本配置

    Nginx反向代理配置
    包含Nginx同构/异构处理

    Nginx负载均衡配置

    Nginx设置说明:
    server address [parameters]:此指令用于upstream配置段中,表示定义upstream配置段中的server成员,以及相关的参数;其中地址的格式支持IP地址加端口的形式,支持unix path路径,也支持主机名或域名加端口的形式;parameters表示参数,常用的参数有weight=number权重,默认是1,max_fails=number表示失败尝试最大次数;超出此处指定的次数,nginx将失败的server标记为不可用;fail_timeout=time表示设置将服务器标记为不可用状态的超时时长;max_conns表示当前的服务器的最大并发连接数;backup表示将服务器标记为“备用”,既所有服务器均不可用时,此服务器才会被启用,有点类似LVS里的sorry server的角色;down表示将服务器标记为“不可用”

    upstream webserverr {
        ip_hash;
        hash $request_uri;
        server 192.168.64.101:80 weight:5;
        server 192.168.64.102:80 weight:2 down;
        server 192.168.64.110:80 backup;
    }
    

    注意 :假如我们后端服务器有一台服务出现故障,nginx会不会把用户的请求调度到出现故障的服务器上呢?我们知道在lvs做调度器时,前端lvs会把用户的请求调度到出现故障的服务器上,我们需要借助keepalived或者其他辅助服务去实现对后端服务器做健康状态监测,才能把用户的请求不调度到有故障的后端服务器上,nginx会不会呢?
    nginx不会把用户的请求调度到有故障的服务器上,这是因为nginx自身就有对后端服务器做健康状态监测的机制,能够及时的发现后端服务器的健康状态,及时的将服务不可用的后端主机从集群中下线,当然这种下线是当服务不可用时,自动触发的动作,我们也可以人为的把后端服务器标记为不可用状态,通常在做灰度发布时可能用到,直接在服务器后面明确用down来标记该服务器,不接受任何请求;
    ip_hash 基于源地址hash算法,该配置表示同一源地址的客户端请求将会调度到后端某一台server上进行响应;
    hash $request_uri 基于用户请求的uri进行绑定,用户请求同一uri始终调度到某一server上响应,这样做的好处可以使缓存命中提高;

    nginx不管是基于http还是tcp调度用户请求都会自动对后端服务器做健康状态检测,当发现后端主机有服务不可用时,它就不会把用户的请求调度到有问题的主机上;

    有关nginx基于tcp做伪四层调度的方法,基本上同基于http协议的七层调度方法是一样的

    附一张效果图,开机自启动。

    负载均衡效果图
    ServerA:

    ServerB:

    Nginx配置:

    访问结果:

  • 相关阅读:
    大前端完整学习路线(详解)
    浅谈攻击Web应用常见的技术手段
    浅谈XSS跨站脚本攻击
    利用SQL注入漏洞登录后台
    1、MyBatis框架底层初涉
    1、用静态工厂方法代替构造器
    日志管理-log4j与slf4j的使用
    Java的值类型和引用类型
    自动任务调度
    2、Hibernate持久化编写
  • 原文地址:https://www.cnblogs.com/Nine4Cool/p/13721928.html
Copyright © 2020-2023  润新知