nginx高性能web服务器

web服务基础介绍

一、Web服务核心流程

客户端 Web服务器 应用处理 HTTP请求 (Request) 请求处理 生成响应 HTTP响应 (Response) 客户端 Web服务器 应用处理

二、互联网发展里程碑

关键事件时间轴
1994-01-01 1996-01-01 1998-01-01 2000-01-01 2002-01-01 2004-01-01 2006-01-01 2008-01-01 第一根专线开通 中国黄页上线 阿里巴巴创立 淘宝网上线 支付宝创立 双十一启动 里程碑 中国互联网发展历程

三、Web服务器演进

Apache工作模式对比

模式 并发处理方式 优点 缺点 适用场景
Prefork 多进程(select) 稳定可靠 高内存消耗 低并发场景
Worker 多进程+多线程 内存占用少 Keepalive资源浪费 中等并发
Event 事件驱动(epoll) 高并发性能 无线程安全控制 高并发长连接场景

Nginx核心优势

nginx 复制代码
# Nginx典型应用架构示例
http {
    upstream app_servers {
        server 10.0.0.101:8080 weight=5;
        server 10.0.0.102:8080;
    }
    
    server {
        listen 80;
        server_name example.com;
        
        # 静态资源直返
        location ~* \.(jpg|css|js)$ {
            root /data/static;
            expires 30d;
        }
        
        # 动态请求代理
        location /api {
            proxy_pass http://app_servers;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
四、用户体验关键指标

性能影响研究数据

  1. 8秒定律:页面加载>8秒 → 30%用户放弃
  2. 亚马逊:延迟100ms → 1%交易损失
  3. Google:延迟500ms → 20%流量下降
  4. 79%用户不会再次访问慢速网站
  5. 40%用户在3秒延迟后离开

性能影响因素矩阵
用户体验 客户端因素 服务端因素 硬件配置 网络速率 地理距离 网络带宽 硬件性能 架构设计 并发处理

五、服务端I/O深度解析

磁盘I/O性能计算

python 复制代码
# 机械磁盘IOPS计算公式
def calculate_iops(rpm):
    seek_time = 9  # 7200RPM寻址时间(ms)
    rotational_latency = 60000 / rpm / 2  # 旋转延迟
    total_latency = seek_time + rotational_latency
    return 1000 / total_latency

print(f"7200RPM磁盘IOPS: {calculate_iops(7200):.1f}")  # 75.9
print(f"15000RPM磁盘IOPS: {calculate_iops(15000):.1f}") # 166.6

网络I/O处理流程

  1. 请求接收:TCP三次握手建立连接
  2. 数据处理
    • 内核空间 → 用户空间数据拷贝
    • 应用层请求处理
  3. 响应返回
    • 用户空间 → 内核空间拷贝
    • 内核 → 网卡传输
六、I/O模型演进

五种I/O模型对比
I/O模型 阻塞I/O 非阻塞I/O 多路复用I/O 信号驱动I/O 异步I/O 进程挂起等待 轮询消耗CPU select/poll/epoll 内核信号通知 全程无阻塞

Epoll核心优势代码解析

c 复制代码
// Epoll高效实现原理
int epoll_create(int size);  // 创建epoll实例

struct epoll_event {
    uint32_t events;    // EPOLLIN/EPOLLOUT等
    epoll_data_t data;  // 用户数据
};

// 注册监控事件
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event);

// 等待事件就绪
int n = epoll_wait(epfd, events, MAX_EVENTS, timeout);
for (int i = 0; i < n; i++) {
    process_event(events[i]); // 仅处理活跃连接
}
七、零拷贝技术

传统vs零拷贝对比
传统方式 4次拷贝 2次CPU切换 零拷贝 2次拷贝 0次CPU切换

sendfile实现原理

nginx 复制代码
http {
    sendfile on;  # 启用零拷贝
    tcp_nopush on; # 优化包传输
    
    server {
        location /largefile {
            # 直接内核空间到网卡传输
            sendfile_max_chunk 1m; # 分块传输
        }
    }
}
八、关键性能公式
  1. 并发连接计算

    复制代码
    最大并发 = worker_processes × worker_connections
  2. 文件描述符限制

    bash 复制代码
    # 系统级限制检查
    cat /proc/sys/fs/file-max
    
    # 进程级限制设置
    worker_rlimit_nofile 65535;
  3. Keepalive优化

    nginx 复制代码
    http {
        keepalive_timeout 65 60;  # 服务器超时65s,客户端60s
        keepalive_requests 1000;  # 单连接最大请求数
    }

二:Nginx架构和安装

2.1 Nginx概述
  1. Nginx介绍

    • Nginx(engine X)由俄罗斯开发者Igor Sysoev于2002年创建,分为社区版和商业版(Nginx Plus)。
    • 2019年被F5 Networks以6.7亿美元收购。
    • 核心功能:高性能HTTP/HTTPS反向代理服务器、邮件代理服务器、TCP/UDP代理服务器,解决C10K问题(单机10万并发连接)。
    • 官网:http://nginx.org
  2. 二次发行版

    • Tengine :淘宝基于Nginx开发的增强版,支持大流量场景(如淘宝、天猫)。
    • OpenResty :集成Lua脚本的高性能Web平台(章亦春团队开发)。
  3. 功能介绍

    • 静态资源服务器(HTML/图片/JS/CSS)。
    • HTTP/HTTPS反向代理。
    • 动态资源代理(FastCGI/uWSGI/SCGI)。
    • TCP/UDP请求转发。
    • IMAP4/POP3邮件代理。
  4. 基础特性

    • 模块化设计,高扩展性。
    • 高可靠性,支持热部署(不停机更新配置/版本)。
    • 低内存消耗:1万keep-alive连接仅需2.5MB内存。
    • 事件驱动模型(epoll)、异步I/O、零拷贝(sendfile)。
  5. Web服务功能

    • 虚拟主机(server块)。
    • 支持keep-alive和管道连接复用。
    • 访问日志定制、URL重写、路径别名。
    • IP/用户访问控制、速率/并发限制。

2.2 Nginx架构和进程
  1. 进程结构

    • Master进程
      • 管理Worker进程,加载配置、绑定端口、平滑升级。
      • 接收外部信号(如reload/stop),监控Worker状态(异常时自动重启)。
    • Worker进程
      • 实际处理请求(平等、独立),数量建议等于CPU核心数。
      • 功能:接收请求、I/O调用、缓存查询、响应结果。

    Master进程 Worker 1 Worker 2 Worker N 处理HTTP请求 FastCGI调用 访问缓存

  2. 进程间通信

    • Master与Worker:通过单向管道传递指令(如进程ID、文件描述符)。
    • Worker之间:依赖Master中转信息,或通过共享内存 (如upstream zone)通信。
  3. HTTP连接建立

    • Master初始化监听Socket → fork多个Worker → Worker竞争接受新连接(避免惊群)。
    • 与传统多进程/多线程模型对比:
      • 传统:每连接独占线程,资源消耗大。
      • Nginx:单线程处理多连接(事件驱动),高效复用资源。
  4. HTTP处理流程

    plaintext 复制代码
    1. 接收请求 → 解析请求行/头 → 匹配Server块
    2. URL重写 → IP访问控制 → 生成响应
    3. 内容处理 → 日志记录 → 返回数据

2.3 Nginx模块介绍
  • 核心模块 :进程管理、错误日志、配置文件解析(ngx_core_module)。
  • 标准HTTP模块 :端口配置、编码设置、响应头控制(ngx_http_core_module)。
  • 可选HTTP模块:SSL支持、压缩、GeoIP解析(需编译时启用)。
  • 邮件模块 :POP3/IMAP/SMTP协议支持(ngx_mail_module)。
  • Stream模块 :TCP/UDP反向代理(ngx_stream_module)。
  • 第三方模块:JSON/Lua扩展(如OpenResty)。

模块分类图

复制代码
核心模块 → HTTP模块 → 邮件模块 → Stream模块 → 第三方模块

2.4 Nginx安装
  1. 版本选择

    • Mainline:开发版(奇数版本,如1.19)。
    • Stable:稳定版(偶数版本,如1.20)。
    • Legacy:旧稳定版(如1.18)。
  2. 编译安装步骤

    bash 复制代码
    # 1. 安装依赖
    dnf install gcc pcre-devel zlib-devel openssl-devel -y
    useradd -s /sbin/nologin -M nginx
    
    # 2. 解压并编译
    tar zxf nginx-1.24.0.tar.gz
    cd nginx-1.24.0
    ./configure \
      --prefix=/usr/local/nginx \
      --user=nginx --group=nginx \
      --with-http_ssl_module \     # 启用HTTPS
      --with-http_v2_module \      # HTTP/2支持
      --with-http_realip_module \  # 客户端真实IP透传
      --with-stream \              # TCP/UDP代理
      --with-pcre                  # 正则支持
    
    # 3. 安装
    make && make install
  3. 目录结构

    • conf/:配置文件(核心:nginx.conf)。
    • html/:默认Web资源(可更改路径)。
    • logs/:日志(访问日志/错误日志/PID文件)。
    • sbin/:可执行文件(nginx命令)。
  4. 验证与命令

    bash 复制代码
    # 查看版本
    /usr/local/nginx/sbin/nginx -v
    
    # 测试配置
    nginx -t
    
    # 启停命令
    nginx -s reload  # 重载配置
    nginx -s quit    # 优雅停止
  5. Systemd服务文件

    ini 复制代码
    [Unit]
    Description=The NGINX HTTP Server
    After=network.target
    
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/bin/kill -s QUIT $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    bash 复制代码
    systemctl daemon-reload
    systemctl start nginx

2.5 平滑升级与回滚
  1. 升级流程

    用户 Nginx Nginx Master 新Master 旧Worker 旧Master 发送USR2信号 重命名pid为nginx.pid.oldbin 启动新进程(旧Master子进程) 发送WINCH信号(平滑停止) 发送QUIT信号(关闭) 用户 Nginx Nginx Master 新Master 旧Worker 旧Master

  2. 操作示例

    bash 复制代码
    # 1. 备份旧二进制文件
    cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
    
    # 2. 编译新版本(仅make不install)
    cd nginx-1.26.1
    ./configure [参数同旧版]
    make
    
    # 3. 替换二进制文件
    cp -f objs/nginx /usr/local/nginx/sbin/
    
    # 4. 触发升级
    kill -USR2 旧Master_PID     # 启动新Master
    kill -WINCH 旧Master_PID     # 关闭旧Worker
    
    # 5. 验证后清理旧Master
    kill -QUIT 旧Master_PID
  3. 回滚步骤

    bash 复制代码
    # 1. 恢复旧二进制文件
    mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx
    
    # 2. 重启旧Worker
    kill -HUP 旧Master_PID
    
    # 3. 关闭新Master
    kill -WINCH 新Master_PID
    kill -QUIT 新Master_PID

关键点

  • 升级时新旧进程并存,旧进程处理存量请求。
  • 回滚需确保旧配置兼容性。

Nginx 核心配置详解


3.1 配置文件结构与说明

核心组成
  1. 主配置文件nginx.conf
  2. 子配置文件 :通过 include conf.d/*.conf 加载
  3. MIME类型文件mime.types(定义文件扩展名与类型的映射)
  4. 其他协议配置 :如 fastcgi_params(FastCGI参数)
配置文件格式规则
  • 指令以分号 ; 结尾,指令与值间用空格分隔。
  • 指令块用 {} 组织,可嵌套(如 httpserverlocation)。
  • 使用 # 添加注释,$ 引用变量。
  • 支持正则表达式(如 location 匹配)。
主配置文件结构
nginx 复制代码
# 全局配置段(main block)
user nginx nginx;                      # 运行用户和组
worker_processes auto;                 # 工作进程数(推荐 = CPU核心数)
error_log /var/log/nginx/error.log;    # 错误日志路径
pid /run/nginx.pid;                    # PID文件路径

# 事件驱动配置(event block)
events {
    worker_connections 1024;           # 单个工作进程最大并发连接数
    use epoll;                         # 事件驱动模型(Linux推荐epoll)
}

# HTTP协议配置(http block)
http {
    include mime.types;                # 导入MIME类型文件
    default_type application/octet-stream; # 默认MIME类型
    sendfile on;                       # 启用零拷贝传输
    keepalive_timeout 65;              # 长连接超时时间

    # 虚拟主机配置(server block)
    server {
        listen 80;                     # 监听端口
        server_name example.com;        # 域名
        root /var/www/html;             # 网站根目录

        # URL路径匹配(location block)
        location / {
            index index.html;          # 默认首页
        }
    }

    # 可扩展配置:mail、stream等
}

3.2 全局配置详解

关键指令
指令 作用 示例
worker_processes 工作进程数(推荐设为CPU核心数) worker_processes 4;
worker_cpu_affinity 绑定进程到CPU核心(减少上下文切换) worker_cpu_affinity 0001 0010;
error_log 错误日志路径和级别 error_log logs/error.log warn;
worker_rlimit_nofile 进程最大打开文件数 worker_rlimit_nofile 65535;
events.use 事件驱动模型(Linux用epoll use epoll;
优化配置示例
nginx 复制代码
user nginx nginx;
worker_processes auto;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log error;
pid /run/nginx.pid;
worker_rlimit_nofile 100000;

events {
    worker_connections 65535;
    use epoll;
    multi_accept on;  # 一次接受多个连接
}

3.3 HTTP块核心配置

基础指令
指令 作用 示例
include 导入其他配置文件 include conf.d/*.conf;
default_type 默认MIME类型(未知文件类型) default_type text/plain;
sendfile 启用零拷贝传输(提升静态文件性能) sendfile on;
keepalive_timeout 长连接超时时间 keepalive_timeout 30s;
虚拟主机配置(Server Block)
nginx 复制代码
server {
    listen 80;                          # 监听端口
    server_name www.example.com;         # 域名(支持通配符)
    root /data/web/html;                # 网站根目录
    access_log /var/log/nginx/access.log; # 访问日志路径

    # 错误页面定制
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
}

3.4 Location块深度解析

匹配规则与优先级
符号 匹配规则 优先级 示例
= 精确匹配 最高 location = /logo.png { ... }
^~ 前缀匹配(不检查正则) location ^~ /static/ { ... }
~ 正则匹配(区分大小写) location ~ \.php$ { ... }
~* 正则匹配(不区分大小写) `location ~* .(jpg
无符号 通用前缀匹配 location / { ... }
root vs alias
  • root :路径 = root + location

    nginx 复制代码
    location /images/ {
        root /data/web;  # 文件路径:/data/web/images/logo.png
    }
  • alias :路径 = alias 替换 location

    nginx 复制代码
    location /static/ {
        alias /data/files/;  # 访问/static/1.txt → /data/files/1.txt
    }

3.5 高级配置实战

1. 账户认证
nginx 复制代码
location /admin {
    auth_basic "Admin Area";                     # 认证提示文字
    auth_basic_user_file /etc/nginx/.htpasswd;   # 密码文件路径
}

生成密码文件:

bash 复制代码
htpasswd -c /etc/nginx/.htpasswd admin
2. 自定义错误页面
nginx 复制代码
error_page 404 /404.html;
location = /404.html {
    root /data/web/errors;
    internal;  # 禁止直接访问
}
3. 文件下载服务
nginx 复制代码
location /download {
    autoindex on;                   # 启用目录列表
    autoindex_localtime on;         # 显示服务器本地时间
    limit_rate 1024k;               # 限速 1MB/s
}
4. 长连接优化
nginx 复制代码
http {
    keepalive_timeout 30s;          # 长连接超时
    keepalive_requests 1000;        # 单连接最大请求数
}
5. 防盗链配置
nginx 复制代码
location ~* \.(jpg|png)$ {
    valid_referers none blocked *.example.com;
    if ($invalid_referer) {
        return 403;                 # 非法引用返回403
    }
}

3.6 配置调试技巧

  1. 语法检查

    bash 复制代码
    nginx -t
  2. 热重载配置

    bash 复制代码
    nginx -s reload
  3. 查看版本与编译参数

    bash 复制代码
    nginx -V

关键提示

  • 修改配置后务必用 nginx -t 测试语法。
  • 生产环境建议使用 include 拆分配置(如 conf.d/*.conf)。
  • 避免在 location 中使用 if 进行复杂判断(影响性能)。

nginx的高级配置

4.1 Nginx 状态页

  • 功能:监控服务器全局状态(非虚拟主机)。

  • 依赖模块ngx_http_stub_status_module(编译时需添加 --with-http_stub_status_module)。

  • 配置示例

    nginx 复制代码
    location /nginx_status {
        stub_status;                  # 启用状态页
        auth_basic "Auth Login";       # 基础认证
        auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
        allow 192.168.0.0/16;          # 访问控制
        allow 127.0.0.1;
        deny all;
    }
  • 输出指标解析

    • Active connections:当前活动连接数(含 Reading + Writing + Waiting)。
    • accepts:Nginx 启动后接受的客户端请求总数。
    • handled:已处理的请求数(通常等于 accepts)。
    • requests:客户端发送的总请求数。
    • Reading:正在读取请求头的连接数(值高可能需优化性能)。
    • Writing:正在发送响应的连接数(反映并发压力)。
    • Waiting:空闲连接数(开启 keep-alive 时有效)。

4.2 Nginx 压缩功能

  • 功能:减少传输体积,提升加载速度(消耗 CPU 资源)。

  • 依赖模块ngx_http_gzip_module(默认内置)。

  • 关键配置指令

    nginx 复制代码
    gzip on;                          # 启用压缩
    gzip_comp_level 4;                # 压缩级别(1-9,建议4-5)
    gzip_min_length 1k;               # 最小压缩文件大小
    gzip_types text/css application/xml text/javascript; # 压缩文件类型
    gzip_vary on;                     # 响应头添加 `Vary: Accept-Encoding`
  • 适用场景:文本文件(HTML/CSS/JS/XML),图片视频类文件效果有限。


4.3 Nginx 版本隐藏

  • 安全优化:避免暴露版本信息被利用。
  • 修改方法
    1. 编辑 Nginx 源码文件 src/core/nginx.h

      c 复制代码
      #define NGINX_VERSION "1.0"     // 自定义版本号
      #define NGINX_VER "HAHA/" NGINX_VERSION  // 自定义服务器标识
    2. 重新编译安装 Nginx。


4.4 Nginx 变量使用

  • 内置变量 :直接调用

    • $remote_addr:客户端 IP
    • $request_uri:原始请求 URI(含参数)
    • $scheme:请求协议(HTTP/HTTPS)
  • 自定义变量

    nginx 复制代码
    location /test {
        set $name "timinglee";        # 定义变量
        echo $name;                   # 输出变量值
    }

五、Nginx Rewrite 相关功能

5.1 ngx_http_rewrite_module 模块指令
  1. if 指令

    • 作用:条件匹配,根据结果执行不同配置。

    • 语法

      nginx 复制代码
      if (条件) { ... }
    • 匹配规则

      • = / !=:字符串相等/不等
      • ~ / ~*:正则匹配(区分/不区分大小写)
      • !-e / !-f:文件或目录不存在
    • 示例

      nginx 复制代码
      location /test {
          if (!-e $request_filename) {
              return 404 "File not found";
          }
      }
  2. set 指令

    • 作用:定义变量。

    • 示例

      nginx 复制代码
      set $name "timinglee";
      echo $name;  # 输出 "timinglee"
  3. break 指令

    • 作用 :终止当前作用域内后续的 rewrite 指令。

    • 示例

      nginx 复制代码
      location /break {
          set $name lee;
          break;          # 后续 set 指令不执行
          set $port 80;   # 被跳过
      }
  4. return 指令

    • 作用:直接返回响应码或重定向。

    • 示例

      nginx 复制代码
      location /return {
          return 301 https://$host$request_uri;  # 永久重定向到 HTTPS
      }

5.2 rewrite 指令
  • 语法

    nginx 复制代码
    rewrite regex replacement [flag];
  • 常用 Flags

    Flag 作用 适用场景
    last 重写后重新匹配 location 多次重写
    break 终止当前重写,继续非 rewrite 指令 单次重写
    redirect 临时重定向(302) 测试环境
    permanent 永久重定向(301) 生产环境域名变更
实战案例
  1. HTTPS 自动跳转

    nginx 复制代码
    server {
        listen 80;
        if ($scheme = http) {
            rewrite ^ https://$host$request_uri permanent; 
        }
    }
  2. 旧域名重定向

    nginx 复制代码
    rewrite ^/old-url(.*)$ http://new.timinglee.org$1 permanent;
  3. 动静分离资源重写

    nginx 复制代码
    location ~* \.(jpg|css)$ {
        rewrite ^/static/(.*) /resources/$1 break;  # 重写静态资源路径
    }

六、高级功能

6.1 防盗链配置
  • 原理 :校验 Referer 头,阻止非授权站点资源盗用。

  • 配置示例

    nginx 复制代码
    location ~* \.(jpg|png)$ {
        valid_referers none blocked *.timinglee.org;
        if ($invalid_referer) {
            return 403 "Access Forbidden";
        }
    }
6.2 缓存加速
  1. Proxy Cache 配置

    nginx 复制代码
    proxy_cache_path /data/cache levels=1:2 keys_zone=mycache:10m max_size=10g;
    server {
        location / {
            proxy_cache mycache;
            proxy_cache_valid 200 302 10m;  # 缓存200/302响应10分钟
            proxy_pass http://backend;
        }
    }
  2. 效果对比

    • 未启用缓存:请求处理耗时 0.514s
    • 启用 Memcached:耗时降至 0.452s
    • 启用 srcache + Memcached:进一步降至 0.255s

七、Nginx 二次开发版本

7.1 OpenResty
  • 核心价值:通过 Lua 脚本扩展 Nginx,实现动态逻辑(如 API 网关、自定义认证)。

  • 安装步骤

    bash 复制代码
    ./configure --prefix=/apps/openresty --with-http_ssl_module
    make && make install
  • 基础示例 (Lua 输出):

    nginx 复制代码
    location /hello {
        content_by_lua_block {
            ngx.say("Hello, OpenResty!")
        }
    }

相关推荐
恒创科技HK3 分钟前
日本服务器哪些服务商是可以免费试用的?
运维·服务器
杜大帅锅15 分钟前
Linux搭建ftp服务器
linux·运维·服务器
电商API_1800790524725 分钟前
大规模调用淘宝商品详情 API 的分布式请求调度实践
服务器·数据库·分布式·爬虫
摸着石头过河的石头31 分钟前
手把手教你用VS Code玩转Gitee协作:从环境配置到高效提交
前端·visual studio code
张志鹏PHP全栈33 分钟前
Vue3第十八天,Vue3中的组件通信
前端·vue.js
小周同学:1 小时前
在 Vue2 中使用 pdf.js + pdf-lib 实现 PDF 预览、手写签名、文字批注与高保真导出
开发语言·前端·javascript·vue.js·pdf
m0_494716681 小时前
CSS中实现一个三角形
前端·css
teeeeeeemo2 小时前
跨域及解决方案
开发语言·前端·javascript·笔记
JSON_L2 小时前
Vue Vant应用-数据懒加载
前端·javascript·vue.js
可爱小仙子2 小时前
vue-quill-editor上传图片vue3
前端·javascript·vue.js