第2章:核心概念理解
2.1 Nginx架构解析
2.1.1 主进程与工作进程模型
Nginx采用了多进程模型,主要包含两种类型的进程:
主进程(Master Process)
- 负责管理工作进程
- 处理配置文件的加载和解析
- 接收信号并向工作进程发送指令
- 维护Nginx的运行状态
工作进程(Worker Processes)
- 实际处理客户端请求
- 每个工作进程都是单线程的
- 采用事件驱动模型处理并发连接
- 数量通常设置为CPU核心数
进程启动流程:
- 启动Nginx时,首先创建主进程
- 主进程读取并解析配置文件
- 主进程创建指定数量的工作进程
- 工作进程开始监听端口,处理客户端请求
查看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 process2.1.2 事件驱动与非阻塞I/O
Nginx的高性能主要得益于其事件驱动模型和非阻塞I/O设计:
事件驱动模型
- 工作进程通过事件循环处理请求
- 使用epoll(Linux)、kqueue(BSD/macOS)或select(Windows)等事件通知机制
- 每个工作进程可以同时处理数千个并发连接
非阻塞I/O
- 当处理I/O操作时(如读取文件、网络通信),工作进程不会阻塞等待
- 而是继续处理其他请求,直到I/O操作完成
- 这种设计大幅提高了并发处理能力
事件处理流程:
- 客户端请求到达Nginx
- 工作进程接收请求并注册一个事件
- 工作进程继续处理其他请求
- 当请求数据准备好时,事件被触发
- 工作进程处理该请求,返回响应
2.1.3 配置文件结构解析
Nginx的配置文件采用了层次化的结构,主要包含以下几个层次:
- 全局块:定义全局配置项,影响整个Nginx服务器
- events块:配置事件驱动模型的相关参数
- http块:配置HTTP服务器的相关参数,包含多个server块
- server块:配置虚拟主机,包含多个location块
- 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配置文件的基本构建块是指令和块:
指令
- 单行配置,由名称和值组成
- 以分号(;)结尾
- 示例:
worker_processes auto;
块
- 由大括号({})包围的一组配置
- 可以嵌套其他块
- 示例:
events { ... }
上下文
- 指令和块生效的范围
- 常见上下文:
main、events、http、server、location - 指令只能在特定上下文中使用
常见指令及其上下文:
| 指令 | 上下文 | 作用 |
|---|---|---|
worker_processes |
main | 设置工作进程数量 |
worker_connections |
events | 设置每个工作进程的最大连接数 |
listen |
server | 设置监听端口 |
server_name |
server | 设置虚拟主机域名 |
root |
http, server, location | 设置文档根目录 |
index |
http, server, location | 设置默认索引文件 |
2.2.2 变量与继承规则
Nginx支持变量,用于在配置中动态引用值:
内置变量
- 由Nginx自动设置,以
$开头 - 示例:
$request_uri:完整的请求URI$remote_addr:客户端IP地址$http_user_agent:客户端浏览器信息$status:HTTP响应状态码
- 由Nginx自动设置,以
自定义变量
- 使用
set指令定义 - 示例:
set $my_var "hello";
- 使用
变量使用
- 可以在配置文件中直接使用变量
- 示例:
access_log /var/log/nginx/$server_name.access.log;
继承规则
- 子上下文会继承父上下文的配置
- 子上下文中的配置会覆盖父上下文的配置
- 示例:在http块中设置的
root会被server块中的root覆盖
2.2.3 主配置文件nginx.conf详解
主配置文件的主要部分:
全局配置
# 运行Nginx的用户 user www-data; # 工作进程数量,通常设置为CPU核心数 worker_processes auto; # 错误日志路径和级别 error_log /var/log/nginx/error.log warn; # PID文件路径 pid /run/nginx.pid;事件配置
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 配置文件验证与重载
验证配置文件语法
sudo nginx -t重载配置文件(不重启服务)
sudo systemctl reload nginx或使用信号:
sudo nginx -s reload重启Nginx服务
sudo systemctl restart nginx停止Nginx服务
sudo systemctl stop nginx
章节总结
在本章中,我们学习了:
Nginx架构:
- 主进程与工作进程的职责
- 事件驱动与非阻塞I/O模型
- 进程启动流程
配置文件结构:
- 全局块、events块、http块、server块、location块
- 指令、块、上下文的概念
- 变量的使用和继承规则
配置文件操作:
- 主配置文件nginx.conf的详细解析
- 配置文件验证方法
- 重载和重启Nginx的命令
实践练习
- 查看当前Nginx的进程状态
- 尝试修改nginx.conf,调整worker_processes数量
- 验证配置文件语法是否正确
- 重载Nginx配置,观察进程变化
- 查看错误日志和访问日志的内容
延伸阅读
下一章:第3章:静态网站服务