第2章:核心概念理解

2.1 Nginx架构解析

2.1.1 主进程与工作进程模型

Nginx采用了多进程模型,主要包含两种类型的进程:

  1. 主进程(Master Process)

    • 负责管理工作进程
    • 处理配置文件的加载和解析
    • 接收信号并向工作进程发送指令
    • 维护Nginx的运行状态
  2. 工作进程(Worker Processes)

    • 实际处理客户端请求
    • 每个工作进程都是单线程的
    • 采用事件驱动模型处理并发连接
    • 数量通常设置为CPU核心数

进程启动流程

  1. 启动Nginx时,首先创建主进程
  2. 主进程读取并解析配置文件
  3. 主进程创建指定数量的工作进程
  4. 工作进程开始监听端口,处理客户端请求

查看Nginx进程

ps aux | grep nginx

预期输出

root      1234  0.0  0.1  12345  6789 ?        Ss   10:00   0:00 nginx: master process /usr/sbin/nginx
www-data  1235  0.1  0.2  23456  7890 ?        S    10:00   0:01 nginx: worker process
www-data  1236  0.1  0.2  23456  7891 ?        S    10:00   0:01 nginx: worker process
www-data  1237  0.1  0.2  23456  7892 ?        S    10:00   0:01 nginx: worker process
www-data  1238  0.1  0.2  23456  7893 ?        S    10:00   0:01 nginx: worker process

2.1.2 事件驱动与非阻塞I/O

Nginx的高性能主要得益于其事件驱动模型非阻塞I/O设计:

  1. 事件驱动模型

    • 工作进程通过事件循环处理请求
    • 使用epoll(Linux)、kqueue(BSD/macOS)或select(Windows)等事件通知机制
    • 每个工作进程可以同时处理数千个并发连接
  2. 非阻塞I/O

    • 当处理I/O操作时(如读取文件、网络通信),工作进程不会阻塞等待
    • 而是继续处理其他请求,直到I/O操作完成
    • 这种设计大幅提高了并发处理能力

事件处理流程

  1. 客户端请求到达Nginx
  2. 工作进程接收请求并注册一个事件
  3. 工作进程继续处理其他请求
  4. 当请求数据准备好时,事件被触发
  5. 工作进程处理该请求,返回响应

2.1.3 配置文件结构解析

Nginx的配置文件采用了层次化的结构,主要包含以下几个层次:

  1. 全局块:定义全局配置项,影响整个Nginx服务器
  2. events块:配置事件驱动模型的相关参数
  3. http块:配置HTTP服务器的相关参数,包含多个server块
  4. server块:配置虚拟主机,包含多个location块
  5. location块:配置URL路径的处理规则

简化的配置文件结构

# 全局块
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# events块
events {
    worker_connections 1024;
    use epoll;
}

# http块
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # server块
    server {
        listen 80;
        server_name example.com;
        
        # location块
        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

2.2 配置文件语法基础

2.2.1 指令、块、上下文

Nginx配置文件的基本构建块是指令

  1. 指令

    • 单行配置,由名称和值组成
    • 以分号(;)结尾
    • 示例:worker_processes auto;
    • 由大括号({})包围的一组配置
    • 可以嵌套其他块
    • 示例:events { ... }
  2. 上下文

    • 指令和块生效的范围
    • 常见上下文:maineventshttpserverlocation
    • 指令只能在特定上下文中使用

常见指令及其上下文

指令 上下文 作用
worker_processes main 设置工作进程数量
worker_connections events 设置每个工作进程的最大连接数
listen server 设置监听端口
server_name server 设置虚拟主机域名
root http, server, location 设置文档根目录
index http, server, location 设置默认索引文件

2.2.2 变量与继承规则

Nginx支持变量,用于在配置中动态引用值:

  1. 内置变量

    • 由Nginx自动设置,以$开头
    • 示例:
      • $request_uri:完整的请求URI
      • $remote_addr:客户端IP地址
      • $http_user_agent:客户端浏览器信息
      • $status:HTTP响应状态码
  2. 自定义变量

    • 使用set指令定义
    • 示例:set $my_var "hello";
  3. 变量使用

    • 可以在配置文件中直接使用变量
    • 示例:access_log /var/log/nginx/$server_name.access.log;
  4. 继承规则

    • 子上下文会继承父上下文的配置
    • 子上下文中的配置会覆盖父上下文的配置
    • 示例:在http块中设置的root会被server块中的root覆盖

2.2.3 主配置文件nginx.conf详解

主配置文件的主要部分

  1. 全局配置

    # 运行Nginx的用户
    user www-data;
    
    # 工作进程数量,通常设置为CPU核心数
    worker_processes auto;
    
    # 错误日志路径和级别
    error_log /var/log/nginx/error.log warn;
    
    # PID文件路径
    pid /run/nginx.pid;
  2. 事件配置

events {
# 每个工作进程的最大连接数
worker_connections 1024;

# 使用的事件驱动机制
use epoll;

# 允许同时接收多个连接
multi_accept on;

}


3. **HTTP核心配置**
```nginx
http {
 # 包含MIME类型定义
 include /etc/nginx/mime.types;
 
 # 默认MIME类型
 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系统调用,提高文件传输效率
 sendfile on;
 
 # 启用TCP_NOPUSH,提高网络传输效率
 tcp_nopush on;
 
 # 启用TCP_NODELAY,提高实时性
 tcp_nodelay on;
 
 # 长连接超时时间
 keepalive_timeout 65;
 
 # 启用gzip压缩
 gzip on;
 
 # 包含额外的配置文件
 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*;
}

2.2.4 配置文件验证与重载

  1. 验证配置文件语法

    sudo nginx -t
  2. 重载配置文件(不重启服务)

    sudo systemctl reload nginx

    或使用信号:

    sudo nginx -s reload
  3. 重启Nginx服务

    sudo systemctl restart nginx
  4. 停止Nginx服务

    sudo systemctl stop nginx

章节总结

在本章中,我们学习了:

  1. Nginx架构

    • 主进程与工作进程的职责
    • 事件驱动与非阻塞I/O模型
    • 进程启动流程
  2. 配置文件结构

    • 全局块、events块、http块、server块、location块
    • 指令、块、上下文的概念
    • 变量的使用和继承规则
  3. 配置文件操作

    • 主配置文件nginx.conf的详细解析
    • 配置文件验证方法
    • 重载和重启Nginx的命令

实践练习

  1. 查看当前Nginx的进程状态
  2. 尝试修改nginx.conf,调整worker_processes数量
  3. 验证配置文件语法是否正确
  4. 重载Nginx配置,观察进程变化
  5. 查看错误日志和访问日志的内容

延伸阅读


下一章第3章:静态网站服务

« 上一篇 Nginx初识 下一篇 » 静态网站服务