《Nginx 高性能 Web 服务器详解》

1.2 常见服务器产品介绍

  • Apache
    • Apache Web 服务器最初是由 NCSA httpd 1.3 服务器发展而来。
    • 特性全,运行速度快,性能稳定,扩展功能丰富。
    • 在设计时使用了以“进程”为基础的架构,这导致其在多处理器环境中性能有所下降。
  • Microsoft IIS
    • IIS 最初是 Windows NT 的可选包,最后内置在 Win 2000、Win XP Professional、Win Server 2003、2008、2012 中一起发行。
    • IIS 和 Windows Server 相结合,使其在网络应用服务器的管理、可用性、可靠性、安全性、性能和可扩展性等方面都大为增强了。
    • 6.0
      • 全新的 IIS 架构:新的内核监听模式、新的“应用程序隔离模式 – 工作进程隔离模式”,增强了应用程序池、工作进程以及 Web 管理服务等方面的功能
      • 增强了网络应用的开发与国际性支持。
    • 7.0
      • 增加了 SQL 数据库管理器
      • 日报报表可视化支持
      • 对 IIS 设置提供完全控制的配置编辑器、请求过滤器、.NET 授权规则编辑器以及 FastCGI 机制
      • 部署成本高
  • Tomcat
    • Tomcat 在英文中是 “公猫或其他雄性猫科动物”的意思。Tomcat 服务器最初是由 Sun 公司的软件架构师詹姆斯·邓肯·戴维森开发的,后变为开源项目,并由 Sun 公司将其贡献给了 Apache 软件基金会。
    • Tomcat 是 Sun 公司官方推荐的 Servlet 和 JSP 容器,在中小型系统和并发访问用户不是很多的场合下,其作为轻量级应用服务器,被广泛地使用。
    • Tomcat 作为轻量级的服务器软件,无法满足复杂业务场景的要求,也没有复杂和丰富的功能;但 Tomcat 是免费开源的,且体积小,安装和部署都很方便,系统资源占用率低,是主要的 Servlet 和 JSP 容器,在这方面它比绝大多数的商业应用软件服务器要好。
  • Lighttpd
    • Lighttpd 专门针对高性能网站,提供了一套安全、快速、兼容性良好并且灵活的 Web Server 环境。
    • 内存开销非常低、 CPU 占用率低、模块丰富,支持 FastCGI、Output Compress(输出压缩)、URL 重写等绝大多数 Apacha 具有的重要功能,是 Apache 的绝好替代者。
  • Nginx
    • Nginx 是一款免费开源的高性能 HTTP 服务器及反向代理服务器(Reverse Proxy)产品,还可以提供 IMAP/POP3 代理服务等功能。

1.3 Nginx 的功能特性

  • 基本 HTTP 服务
    • 处理静态文件;处理索引文件以及支持自动索引。
    • 打开并自行管理文件描述符缓存。
    • 提供反向代理服务,并且可以使用缓存加速反向代理,同时完成简单负载均衡及容错。
    • 提供远程 FastCGI 服务的缓存机制,加速访问,同时完成简单的负载均衡以及容错。
    • 使用 Nginx 的模块化特性提供过滤器功能。 Nginx 基本过滤器包括 gzip 压缩、ranges 支持、 chunked 响应、XSLT、SSI 以及图像缩放等。其中,针对包含多个 SSI 的页面,经由 FastCGI 或反向代理,SSI 过滤器可以并行处理。
    • 支持 HTTP 下的安全套接层安全协议 SSL 。
  • 高级 HTTP 服务
    • 支持基于名字和 IP 的虚拟主机设置。
    • 支持 HTTP/1.0 中 KEEP-Alive 模式和管线(PipeLined)模型连接。
    • 支持重新加载配置以及在线升级时,无须中断正在处理的请求。
    • 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转。
    • 提供 3xx ~ 5xx 错误代码重定向功能。
    • 支持重写(Rewrite)模块扩展。
    • 支持 HTTP DAV 模块,从而为 Http WebDAV 提供 PUT、DELETE、MKCOL、COPY 以及 MOVE 方法。
    • 支持 FLV 流和 MP4 流传输。
    • 支持网络监控,包括基于客户端 IP 地址和 HTTP 基本认证机制的访问控制、速度限制、来自同一地址的同时连接数或请求数限制等。
    • 支持嵌入 Perl 语言。
  • 邮件服务
    • 支持使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端,并支持 IMAP 认证方式和 POP3 认证方式。
    • 支持使用外部 HTTP 认证服务器认证用户后重定向连接到内部 SMTP 后端,并支持 SMTP 认证方式。
    • 支持邮件代理服务下的安全套接层安全协议 SSL 。
    • 支持纯文本通信协议的扩展协议 STARTTLS 。

1.4 常用功能介绍

  • HTTP 代理和反向代理
    • 支持判断表达式:通过使用正则表达式进行相关配置,可以实现根据不同的表达式,采取不同的转发策略。
    • 对后端返回情况进行了异常判断:如果返回结果不正常,则重新请求另一台主机,并自动剔除返回异常的主机。
    • 支持错误页面跳转功能。
  • 负载均衡
    • 内置策略
      • 轮询:将前端请求按顺序(时间顺序或排列次数)逐一分配到不同的后端节点上,对于出现问题的后端节点自动排除。
      • 加权轮询:在基本的轮询策略上考虑各后端节点接受请求的权重,指定各后端节点被轮询到的几率。
        • 加权轮询主要用于后端节点性能不均的情况。
      • IP hash:将前端请求的 IP 进行 hash 操作,然后根据 hash 结果将请求分配给不同的后端节点。
        • 好处是避免考虑前端用户的 session 在后端多个节点上共享的问题。
    • 扩展策略
      • url hash
        • 和 IP hash 类似,基于 url 的 hash 结果进行请求的转发。
        • 优点:如果后端有缓存服务器,能够提高缓存效率。
        • 缺点:不能自动排除异常节点。
      • fair
        • 将前端请求转发到一个最近负载最小的后台节点。Nginx 通过后端节点对请求的响应时间来判断负载情况。
  • Web 缓存
    • 主要有 Proxy_Cache 相关指令集和 FastCGI_Cache 相关指令集构成。
    • Proxy_Cache :主要用于在 Nginx 服务器提供反向代理服务时,对后端资源服务器的返回内容进行 URL 缓存。
    • FastCGI_Cache :主要用于对 FastCGI 的动态程序进行缓存。
    • 第三方模块 ngx_cache_purge 主要用于清理 Nginx 服务器上指定的 URL 缓存。

2.3 Nginx 服务的启停控制

Nginx 服务在运行时,会保持一个主进程和一个或多个 worker process 工作进程。

获取主进程的 PID 有两个途径:

  1. 在 Nginx 服务器启动以后,默认在 Nginx 服务器安装目录下的 logs 目录中会产生文件名为 nginx.pid 的文件,此文件中保持的就是 Nginx 服务主进程的 PID 。
    cat nginx.pid
      
  2. 使用 ps 工具
    ps -ef | grep nginx
      

Nginx 服务可接收的信号:

信号作用
TERM 或 INT快速停止 Nginx 服务器
QUIT平缓停止 Nginx 服务器
HUP使用新的配置文件启动进程,之后平缓停止原有进程,也就是所谓的“平滑重启”
USR1重新打开日志文件,常用于日志切割
USR2使用新版本的 Nginx 文件启动服务,之后平缓停止原有 Nginx 进程,也就是所谓的“平滑升级”
WINCH平缓停止 worker process ,用于 Nginx 服务器平滑升级

向 Nginx 服务主进程发送信号:

  1. 使用 nginx 二进制文件
    nginx -g SIGNAL
      
  2. 使用 kill 命令发送信号
    kill SIGNAL PID
      
    kill SIGNAL `filepath of nginx.pid`
      

启动 Nginx 服务

nginx
  

停止 Nginx 服务

nginx -g TERM | IINT | QUIT
  

重启 Nginx 服务

nginx -g HUP [-c newConfFile]
  

升级 Nginx 服务

如需更换安装路径,可先执行如下命令:

nginx -p newInstallPath
  

平滑升级 Nginx :

nginx -g USR2
  

查看新的 Nginx 服务状态:

ps -ef | grep nginx
  

平滑停止旧服务信号:

nginx -g WINCH
  

2.4 Nginx 服务器基础配置指令

默认的 Nginx 服务器配置文件存放在安装目录的 conf 目录中,主配置文件名 nginx.conf

下面是 1.19.4 版本默认的 nginx.conf 文件:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
  
  1. 全局块

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
      
  2. events 块

    events {
        worker_connections  1024;
    }
      
  3. http 块

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    }
      
  4. server 块

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    }
      
  5. location 块

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    }
      

mime.types 默认的内容:

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}