# Nginx

:一个轻量级的 HTTP 服务器。

  • 官方文档 (opens new window)
  • 读音相当于 engine x 。
  • 于 2004 年发布,采用 C 语言开发。
  • 特点:
    • 一般用作静态服务器,处理静态文件的效率高。也可用作动态服务器,支持 FastCGI、WSGI 应用。
    • 支持 HTTP、HTTPS 协议,还支持 IMAP、POP3、SMTP 协议。
    • 支持反向代理、负载均衡。支持第四层的 TCP 代理、第七层的 HTTP 代理。

# 部署

  • 用 yum 安装:

    yum install nginx
    

    然后用 systemctl 启动:

    systemctl start nginx
    systemctl enable nginx
    

    或者手动启动:

    nginx                     # 启动 nginx 服务器。默认作为守护进程运行
          -c /root/nginx.conf # 使用指定的配置文件。默认使用 /etc/nginx/nginx.conf
          -g 'daemon off;'    # 加上指令,这里是要求在前台运行
          -t                  # 不启动,而是测试配置文件的语法是否正确
          -T                  # 测试配置文件,并打印当前配置
          -s stop             # 让 Nginx 立即终止
          -s quit             # 让 Nginx 优雅地终止。这会等 worker 进程处理完当前的 HTTP 请求,即没有正在使用的 TCP 连接,才终止 worker
          -s reload           # 重新加载配置文件。这会先创建新 worker 进程,而旧 worker 进程会优雅地终止
    
  • 或者用 docker-compose 部署:

    version: '3'
    
    services:
      nginx :
        container_name: nginx
        image: nginx:1.23
        restart: unless-stopped
        ports:
          - 80:80
        volumes:
          - /etc/localtime:/etc/localtime:ro
          # - ./nginx.conf:/etc/nginx/nginx.conf
          - ./dist:/usr/share/nginx/html
    

# 原理

  • Nginx 主进程启动之后,会创建多个 worker 子进程负责处理 HTTP 请求。

  • Nginx 处理每个 HTTP 请求的过程分为 11 个阶段(phase):

    post-read       # 在读取了 HTTP 请求之后开始执行
    server-rewrite  # 执行在 server 内、location 外配置的 rewrite 指令
    find-config     # 选择一个 location 来处理 HTTP 请求
    rewrite         # 执行在 location 内配置的 rewrite 指令
    post-rewrite    # 如果请求的 URI 被 rewrite 了,则将请求回退到 find-config 阶段重新处理
    preaccess       # 执行 limit_rate 等指令,限制访问效率
    access          # 执行 allow、deny、auth 等指令,控制访问权限
    post-access     # 执行 satisfy any 指令
    try-files       # 检查 URI 指向的本机文件是否存在
    content         # 生成 HTTP 响应报文
    log             # 记录日志
    
  • Nginx 官方提供了多种模块,每种模块包含多种可执行的指令(directives)。

    • Nginx 启动时,会加载所有配置文件,拆分为不同阶段的指令,按阶段顺序执行,而不是按配置文件的顺序执行。
    • 用户可以自定义模块,注册到某个阶段。
    • find-config、post-rewrite、post-access 三个阶段不支持注册模块。