• Nginx技术研究系列1-通过应用场景看Nginx的反向代理


    随着我们业务规模的不断增长,整个系统规模由两年前的几十台服务器,井喷到现在2个数据中心,接近400台服务器,上百个WebApi站点,上百个域名。

    这么多的WebApi站点这么多的域名,管理和维护成本很高。

    后续随着系统规模的继续扩张,必须实现域名的统一规划,使用Nginx实现请求的反向代理和动态路由。

    从实际场景出发,看一看实际的场景是什么?

    http://api.***.com/action => http://192.168.0.11/api/action
    Header: ***                          Header: ***
    Body: ***                              Body: ***

    根据请求的Action动态解析对应的内网服务器地址,再实现服务的转发。

    一、 工欲善其事必先利其器,先科普一下Nginx

    1. HTTP基础功能

    • 处理静态文件,索引文件以及自动索引;
    • 反向代理加速(无缓存),简单的负载均衡和容错;
    • FastCGI,简单的负载均衡和容错;
    • 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
    • SSL 和 TLS SNI 支持;
    • 基于IP 和名称的虚拟主机服务;
    • Memcached 的 GET 接口;
    • 支持 keep-alive 和管道连接;
    • 灵活简单的配置;
    • 重新配置和在线升级而无须中断客户的工作进程;
    • 可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
    • 4xx-5xx 错误代码重定向;
    • 基于 PCRE 的 rewrite 重写模块;
    • 基于客户端 IP 地址和 HTTP 基本认证的访问控制;
    • PUT, DELETE, 和 MKCOL 方法;
    • 支持 FLV (Flash 视频);
    • 带宽限制;

    2. IMAP/POP3 代理服务功能

    • 使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
    • 使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
    • 认证方法:
    • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
    • IMAP: IMAP LOGIN;
    • SMTP: AUTH LOGIN PLAIN CRAM-MD5;
    • SSL 支持;
    • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

    3. 支持的操作系统

    • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
    • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
    • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
    • MacOS X (10.4) PPC;

    二、Nginx的核心应用场景

    1. 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,Nginx 为选择了 epoll and kqueue 作为开发模型.
    2. 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
    作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器

    3. Nginx 安装简单,配置文件非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。支持不间断服务的情况下进行软件版本的升级。

    我们对Nginix的实际应用场景:

    我们迁移.Net Core之后,前端使用Vue,我们将使用Nginx作为反向代理服务器和Http服务器

    WebApi站点反向代理用

    三、CentOS下安装部署Nginx

    1. 安装Make

    yum -y install gcc automake autoconf libtool make

    2. 安装g++

    yum install gcc gcc-c++

    3. 安装PCRE库

    wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz 
    tar -zxvf pcre-8.38.tar.gz
    cd pcre-8.34
    ./configure
    make
    make install

    4. 安装Zlib

    cd /usr/local/src
    wget http://zlib.net/zlib-1.2.11.tar.gz
    tar -zxvf zlib-1.2.11.tar.gz
    cd zlib-1.2.8
    ./configure
    make
    make install

    5. 下载解压SSL

    wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
    tar -zxvf openssl-1.0.2l.tar.gz

    6. 安装Nginx

    cd /usr/local/src
    wget http://nginx.org/download/nginx-1.4.2.tar.gz
    
    cd nginx-1.4.2
    ./configure --sbin-path=/usr/local/nginx/nginx 
    --conf-path=/usr/local/nginx/nginx.conf 
    --pid-path=/usr/local/nginx/nginx.pid 
    --with-http_ssl_module 
    --with-pcre=/opt/app/openet/oetal1/chenhe/pcre-8.37 
    --with-zlib=/opt/app/openet/oetal1/chenhe/zlib-1.2.8 
    --with-openssl=/opt/app/openet/oetal1/chenhe/openssl-1.0.1t
    make
    make install

    7. 启动Nginx,使用默认的Nginx.Conf文件

    sudo /usr/local/nginx/nginx

     四、 Nginx反向代理设置

    在设置Nginx反向代理之前,我们需要谨慎的规划URL的使用!!!
    为后续的业务扩展、水平伸缩打好基础,否则杂乱无章的URL使用,会导致路由配置极其复杂难用。
    先看Nginx的HTTP负载均衡的标准配置:

    Nginx中location对url匹配;

    语法:location [=|~|~*|^~] /uri/ { … }

    当匹配中符合条件的location,则执行内部指令;

    如果使用正则表达式,必须使用~*表明不区分大小写或者~区分大小写匹配;

    当匹配成功后,将停止往下匹配;如果没有找到,则使用常规自字符串处理结果;

    • =开头表示精确匹配
    • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
    • ~ 开头表示区分大小写的正则匹配;
    • ~* 开头表示不区分大小写的正则匹配
    • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

    举个示例:

    把xxx123.tk域名指向静态IP,这样就实现了在浏览器中
    输入xxx123.tk访问192.168.10.38的3000端口,
    输入xxx456.tk访问192.168.10.40的80端口的作用。

    同时,示例一个Nginx负载均衡配置

    五、Nginx动态路由

    在Nginx的设计中,每一个upstream维护了一张静态路由表,存储了backend的ip、port以及其他的meta信息。

    每次请求到达后,会依据location检索路由表,然后依据具体的调度算法(如round robin )选择一个backend转发请求。

    但这张路由表是静态的,如果变更后,则必须reload,经常reload的话这对SLA有较大影响。

    为了达到减少reload的目的,大多通过动态更新维护路由表来解决这个问题。

    各种google、百度之后,找到了几个线索:Nginx、Lua、Redis

    然后又发现了新大陆OpenResty:

    OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    下面几篇文章,我们继续研究上面这个新大陆。

    周国庆

    2017/10/1

  • 相关阅读:
    HTML <form> 标签的 method 属性(20161028)
    PHP数据访问增删查(20161028)
    PHP数据访问基础知识(20161028)
    java代理机制
    java 模拟实现消费者和生产者问题
    Single Number II
    从1到1000中随机取出900个不重复的随机数
    取苹果方式总数
    Net-SNMP(V3协议)安装配置笔记(CentOS 5.2)(转)
    单例模式
  • 原文地址:https://www.cnblogs.com/tianqing/p/7616735.html
Copyright © 2020-2023  润新知