目录
Nginx 是一个高性能的 HTTP 和反向代理服务器,其核心功能由配置文件
nginx.conf
控制。本文将深入解析 Nginx 配置文件的结构、语法和最佳实践,帮助您全面掌握 Nginx 的配置方法。
1. Nginx 配置文件基础结构
Nginx 配置文件采用层次化的块结构,主要由指令(directives)和上下文(contexts)组成。指令分为简单指令和块指令,上下文则定义了指令的作用范围。
1.1 基本语法规则
- 指令以分号(
;
)结尾 - 块指令用大括号(
{}
)包围 #
开头表示注释- 支持变量(
$variable_name
) - 支持包含其他配置文件(
include
)
1.2 主要配置上下文
以下是 Nginx 配置的主要上下文结构:
# 全局上下文 (Main Context)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# 事件上下文 (Events Context)
events {
worker_connections 1024;
}
# HTTP 上下文 (HTTP Context)
http {
# 服务器上下文 (Server Context)
server {
# 位置上下文 (Location Context)
location / {
root /usr/share/nginx/html;
index index.html;
}
}
# 可以包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}
2. 全局上下文(Main Context)详解
全局上下文是配置文件的最高层级,包含影响 Nginx 整体运行的指令。
2.1 核心指令
指令 | 说明 | 默认值 | 示例 |
---|---|---|---|
user |
设置 worker 进程的用户和组 | nobody | user nginx nginx; |
worker_processes |
worker 进程数量 | 1 | worker_processes auto; (根据CPU核心数自动设置) |
error_log |
错误日志路径和级别 | logs/error.log error | error_log /var/log/nginx/error.log warn; |
pid |
主进程 PID 文件位置 | nginx.pid | pid /run/nginx.pid; |
worker_rlimit_nofile |
worker 进程能打开的最大文件描述符数量 | 系统限制 | worker_rlimit_nofile 65535; |
2.2 性能优化配置示例
user www-data;
worker_processes auto;
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log crit;
pid /run/nginx.pid;
# 加载动态模块
load_module modules/ngx_http_geoip_module.so;
load_module modules/ngx_stream_geoip_module.so;
3. Events 上下文详解
Events 上下文包含影响连接处理的指令。
3.1 核心指令对比
指令 | 说明 | 默认值 | 推荐值 (高并发场景) |
---|---|---|---|
worker_connections |
每个 worker 进程的最大连接数 | 512 | 1024-4096 |
use |
指定事件模型 | 自动选择 | use epoll; (Linux) |
multi_accept |
是否一次接受所有新连接 | off | on |
accept_mutex |
是否启用连接接受互斥锁 | on | off (高并发) |
3.2 优化配置示例
events {
worker_connections 4096;
multi_accept on;
use epoll;
accept_mutex off;
}
4. HTTP 上下文详解
HTTP 上下文包含所有 HTTP 相关的配置,是最常用的配置块。
4.1 核心指令
http {
# MIME 类型映射
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
# 服务器配置
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}
4.2 HTTP 核心指令说明
指令 | 说明 | 性能影响 | 安全影响 |
---|---|---|---|
sendfile |
使用内核零拷贝发送文件 | 高 (减少CPU和内存使用) | 无 |
tcp_nopush |
仅在数据包满时才发送 | 中 (减少网络包数量) | 无 |
tcp_nodelay |
禁用 Nagle 算法 | 高 (减少延迟) | 无 |
keepalive_timeout |
保持连接的超时时间 | 高 (影响连接复用) | 中 (长时间连接可能被攻击) |
gzip |
启用响应压缩 | 高 (减少传输量) | 低 (可能暴露CRIME漏洞) |
5. Server 上下文详解
Server 上下文定义虚拟主机的配置,一个 HTTP 上下文中可以有多个 server 块。
5.1 核心配置
server {
listen 80;
server_name example.com www.example.com;
# 根目录和索引文件
root /var/www/example.com;
index index.html index.htm;
# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 日志
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
# 位置块
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
include fastcgi_params;
}
}
5.2 Server 指令对比
指令 | 用途 | 示例 | 注意事项 |
---|---|---|---|
listen |
监听端口和IP | listen 80; listen 443 ssl; |
可指定IP如 listen 192.168.1.1:80; |
server_name |
匹配的域名 | server_name example.com *.example.com; |
支持通配符和正则 |
root |
文档根目录 | root /var/www/html; |
路径需绝对 |
index |
默认索引文件 | index index.php index.html; |
按顺序尝试 |
6. Location 上下文详解
Location 上下文用于匹配 URI 并定义如何处理请求,是 Nginx 最灵活强大的部分。