Nginx 的配置文件 nginx.conf
是控制 Nginx 行为的核心,其结构清晰、功能强大。对于初学者来说,理解这份文件的结构和关键参数是掌握 Nginx 的第一步。本文将以源码安装的 Nginx(默认路径 /usr/local/nginx/conf/nginx.conf
)为例,详细解析配置文件的基础结构和常用参数。
一、nginx.conf 的整体结构
Nginx 配置文件采用层级嵌套结构,最外层为全局配置,内层通过大括号 {}
划分不同功能块。整体结构如下:
# 1. 全局块(main block)
...
# 2. 事件块(events block)
events {
...
}
# 3. HTTP 块(http block)
http {
# 3.1 HTTP 全局配置
...
# 3.2 虚拟主机配置(server 块,可多个)
server {
# 3.2.1 虚拟主机基础配置
...
# 3.2.2 URL 路径匹配配置(location 块,可多个)
location / {
...
}
}
}
- 核心逻辑:从外到内,配置范围逐渐缩小(全局 → 网络连接 → HTTP 服务 → 单个站点 → 具体 URL 路径)。
- 注释规则:以
#
开头的行为注释,不影响 Nginx 运行。
二、全局块(main block)
全局块位于配置文件最顶部,不包含在任何大括号内,用于配置影响 Nginx 整体运行的参数。
1. worker_processes
:工作进程数量
worker_processes 1; # 默认值为 1
- 作用:定义 Nginx 启动的工作进程数量(实际处理请求的进程)。
- 取值建议:
- 推荐设置为服务器 CPU 核心数(如 4 核 CPU 设为
4
),充分利用多核性能。 - 设为
auto
时,Nginx 会自动检测 CPU 核心数(需 Nginx 1.3.8+ 版本)。
- 推荐设置为服务器 CPU 核心数(如 4 核 CPU 设为
- 示例:
worker_processes 4;
(4 核 CPU 最佳实践)。
2. 错误日志配置(error_log
)
# error_log logs/error.log; # 默认路径,级别为 error
# error_log logs/error.log notice; # 级别为 notice(包含 notice 及更高级别)
# error_log logs/error.log info; # 级别为 info(包含 info 及更高级别)
- 作用:记录 Nginx 运行中的错误、警告等信息,用于排查问题。
- 参数说明:
- 路径:如
logs/error.log
(相对路径,实际为/usr/local/nginx/logs/error.log
)。 - 日志级别(从低到高):
debug
→info
→notice
→warn
→error
→crit
→alert
→emerg
。设置某一级别后,会记录该级别及更高级别的日志。
- 路径:如
- 生产建议:
error_log /var/log/nginx/error.log warn;
(平衡日志详细度和磁盘占用)。
3. 进程 ID 文件(pid
)
# pid logs/nginx.pid; # 默认路径
- 作用:指定存储 Nginx 主进程 ID(PID)的文件路径。
- 用途:Nginx 管理命令(如停止、重启)需通过该文件获取主进程 ID。
- 默认路径:源码安装默认在
logs/nginx.pid
(即/usr/local/nginx/logs/nginx.pid
)。
4. 其他全局参数(了解即可)
worker_rlimit_nofile
:每个工作进程允许打开的最大文件数(如worker_rlimit_nofile 65535;
,建议与系统限制一致)。worker_priority
:工作进程优先级(值越小优先级越高,如worker_priority -5;
)。
三、事件块(events block)
事件块用于配置 Nginx 与客户端的网络连接参数,影响并发处理能力,格式为 events { ... }
。
1. worker_connections
:最大连接数
events {
worker_connections 1024; # 默认值为 1024
}
- 作用:定义单个工作进程允许同时建立的最大连接数(包括客户端请求、后端代理等)。
- 最大并发估算:理论最大并发数 =
worker_processes × worker_connections
(实际受系统限制)。 - 建议值:服务器内存充足时可设为
10240
(如worker_connections 10240;
)。
2. use
:网络 I/O 模型
events {
use epoll; # Linux 推荐使用 epoll 模型
worker_connections 1024;
}
- 作用:指定 Nginx 处理网络连接的 I/O 模型,影响连接效率。
- 取值建议:
- Linux 系统:
epoll
(高效,默认自动选择)。 - BSD 系统:
kqueue
。 - Windows 系统:
select
(性能较差,仅用于兼容)。
- Linux 系统:
3. multi_accept
:批量接受连接
events {
multi_accept on; # 默认 off
worker_connections 1024;
}
- 作用:
on
表示工作进程会一次性接受所有新连接,提高连接建立效率。 - 建议:高并发场景下开启(
on
)。
四、HTTP 块(http block)
HTTP 块是配置的核心,包含所有与 HTTP 服务相关的配置(如请求处理、虚拟主机、代理等),格式为 http { ... }
。
1. HTTP 全局配置(http 块内,server 块外)
(1)引入 MIME 类型定义
http {
include mime.types; # 引入 MIME 类型映射文件
default_type application/octet-stream; # 默认 MIME 类型
...
}
- 作用:
mime.types
定义了文件扩展名与 MIME 类型的映射(如.html
→text/html
),Nginx 通过它向客户端返回正确的Content-Type
响应头。 - 默认类型:
application/octet-stream
(无法识别类型时,视为二进制文件)。
(2)访问日志配置(access_log
)
http {
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 logs/access.log main; # 使用 main 格式记录访问日志
...
}
- 作用:记录所有 HTTP 请求的详细信息(如客户端 IP、请求路径、状态码等)。
log_format
常用变量:$remote_addr
:客户端 IP 地址。$request
:请求行(如GET /index.html HTTP/1.1
)。$status
:响应状态码(如 200、404)。$http_user_agent
:客户端浏览器标识(如 Chrome、Safari)。
(3)性能优化参数
http {
sendfile on; # 启用高效文件传输模式(推荐开启)
tcp_nopush on; # 配合 sendfile 使用,减少网络包数量
tcp_nodelay on; # 长连接下立即发送小数据包,减少延迟
keepalive_timeout 65; # 长连接超时时间(秒)
...
}
sendfile on
:启用 Linux 的sendfile
系统调用,直接在内核中传输文件数据,跳过用户态到内核态的拷贝,大幅提升静态文件传输速度(必开)。keepalive_timeout
:客户端与服务器建立连接后,若 65 秒内无新请求则自动断开,避免空闲连接占用资源。
(4)Gzip 压缩(gzip
)
http {
gzip on; # 启用 Gzip 压缩(默认 off)
gzip_comp_level 5; # 压缩级别(1-9,5 为平衡值)
gzip_types text/plain text/css application/json; # 需压缩的文件类型
...
}
- 作用:对文本类文件(HTML、CSS、JS 等)压缩后传输,减少网络带宽消耗(图片等二进制文件不建议压缩)。
2. 虚拟主机配置(server 块)
server
块用于定义单个虚拟主机(站点),一个 http
块内可包含多个 server
块(实现多站点),格式为 server { ... }
。
(1)listen
:监听端口与 IP
server {
listen 80; # 监听所有 IP 的 80 端口(HTTP 默认端口)
# listen 192.168.230.130:80; # 仅监听指定 IP 的 80 端口
# listen 443 ssl; # 监听 HTTPS 端口(需配合 SSL 配置)
...
}
- 作用:指定虚拟主机监听的端口和 IP,Nginx 通过
listen
判断哪个server
块处理请求。
(2)server_name
:域名/主机名
server {
listen 80;
server_name www.example.com example.com; # 绑定多个域名(空格分隔)
...
}
- 作用:当多个
server
块监听同一端口时,Nginx 通过请求头中的Host
字段匹配server_name
,找到对应的站点。 - 特殊用法:
- 通配符:
*.example.com
(匹配所有子域名)。 - 正则:
~^www\d+\.example\.com$
(匹配www1.example.com
、www2.example.com
等)。
- 通配符:
(3)root
:网站根目录
server {
listen 80;
server_name www.example.com;
root /usr/local/nginx/html; # 网站文件存放路径
...
}
- 作用:指定站点的根目录,访问
http://www.example.com/index.html
时,Nginx 会去root
目录下寻找index.html
。
(4)index
:默认首页
server {
...
root /usr/local/nginx/html;
index index.html index.htm; # 优先查找 index.html,不存在则找 index.htm
...
}
- 作用:访问站点根目录(如
http://www.example.com/
)时,自动返回index
定义的文件。
(5)错误页面配置(error_page
)
server {
...
error_page 404 /404.html; # 404 错误返回 /404.html
error_page 500 502 503 504 /50x.html; # 多个错误码共用一个页面
...
}
- 作用:自定义错误页面(路径相对于
root
目录)。
3. URL 路径匹配(location 块)
location
块用于配置不同 URL 路径的处理规则(如静态文件、反向代理),一个 server
块内可包含多个 location
块,格式为 location [匹配规则] 路径 { ... }
。
(1)匹配规则类型(优先级从高到低)
规则符号 | 含义 | 示例 |
---|---|---|
= |
精确匹配(优先级最高) | location = /login { ... } |
^~ |
前缀匹配(不匹配正则) | location ^~ /static/ { ... } |
~ |
正则匹配(区分大小写) | location ~ \.php$ { ... } |
~* |
正则匹配(不区分大小写) | location ~* \.jpg$ { ... } |
无符号 | 普通前缀匹配(优先级最低) | location /static { ... } |
(2)常用参数示例
① 静态文件处理
server {
...
root /usr/local/nginx/html;
# 匹配所有路径(默认规则)
location / {
try_files $uri $uri/ /index.html; # 尝试访问文件,不存在则返回 index.html
}
# 匹配 /static/ 开头的路径(如 CSS、JS、图片)
location ^~ /static/ {
expires 1d; # 缓存 1 天,减少重复请求
}
}
② 反向代理(proxy_pass
)
server {
...
# 匹配 /api/ 开头的路径,转发到后端服务
location /api/ {
proxy_pass http://127.0.0.1:8080/; # 后端服务地址
proxy_set_header Host $host; # 传递客户端 Host 信息
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP
}
}
- 作用:Nginx 作为代理服务器,将客户端请求转发到后端应用(如 Tomcat、Node.js),实现前后端分离或负载均衡。
③ 访问控制(allow
/deny
)
location /admin/ {
allow 192.168.230.1; # 允许指定 IP 访问
deny all; # 拒绝其他所有 IP
}
五、配置生效与验证
修改 nginx.conf
后,需通过以下步骤使配置生效:
-
检查语法错误(必做):
/usr/local/nginx/sbin/nginx -t
输出
syntax is ok
和test is successful
表示无错误。 -
重载配置(不中断服务):
/usr/local/nginx/sbin/nginx -s reload
六、总结
nginx.conf
的核心是层级配置,从全局到具体路径,每层配置都有明确的作用范围:
- 全局块:控制 Nginx 整体性能(如工作进程数量)。
- 事件块:优化网络连接(如最大并发数)。
- HTTP 块:配置 HTTP 服务核心功能(如虚拟主机、代理、压缩)。
- Server 块:定义单个站点的基础信息(如域名、根目录)。
- Location 块:细化 URL 路径的处理规则(如静态文件、反向代理)。
对于初学者,建议先掌握 worker_processes
、listen
、server_name
、root
、location
等核心参数,再通过实际场景(如部署静态网站、配置反向代理)加深理解。后续可逐步学习 HTTPS 配置、负载均衡等高级功能。
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章