Nginx配置文件nginx.conf中文详解
Nginx的主配置文件nginx.conf是控制Nginx服务运行的核心文件,其配置结构清晰,采用"块级嵌套"语法,所有配置项均以分号;结尾。本文将从整体结构 和核心配置块两方面,结合实际场景示例对其进行详细解析。
一、配置文件整体结构
nginx.conf的整体结构可分为全局块 、events块 、http块 三大核心部分,其中http块内部又包含全局http配置 、server块 ,server块内部再嵌套location块。结构层级如下:
nginx
# 1. 全局块:影响Nginx整体运行的配置
全局配置项;
# 2. events块:影响Nginx与用户网络连接的配置
events {
事件相关配置项;
}
# 3. http块:HTTP服务的核心配置(可嵌套多个server块)
http {
全局HTTP配置项;
# 虚拟主机配置(一个server块对应一个虚拟主机)
server {
虚拟主机配置项;
# 路由匹配与请求处理(一个server可嵌套多个location)
location 匹配规则 {
路由相关配置项;
}
}
}
核心原则:配置块的作用域遵循"嵌套继承",子块会继承父块的配置,但子块可重写父块配置。
二、核心配置块详解
2.1 全局块
全局块位于配置文件最顶部,用于配置影响Nginx整个服务生命周期的参数,如工作进程数、进程PID存储路径、日志路径等。常见配置项如下:
| 配置项 | 含义 | 示例与说明 |
|---|---|---|
| worker_processes | 工作进程数,决定Nginx并发处理能力 | worker_processes 4; 推荐设置为CPU核心数(如4核CPU设为4),或设为auto自动适配 |
| worker_cpu_affinity | 工作进程与CPU核心绑定,减少进程切换开销 | worker_cpu_affinity 0001 0010 0100 1000; 4核CPU分别绑定4个进程(二进制位对应CPU核心) |
| worker_rlimit_nofile | 单个工作进程可打开的最大文件描述符数 | worker_rlimit_nofile 65535; 需与系统的ulimit -n值匹配,提升并发连接上限 |
| pid | Nginx主进程PID的存储路径 | pid /var/run/nginx.pid; 默认路径,便于进程管理(如停止、重启服务) |
| error_log | 错误日志的存储路径与日志级别 | error_log /var/log/nginx/error.log warn; 级别:debug < info < notice < warn < error < crit,生产环境推荐warn或error |
2.2 events块
events块用于配置Nginx的网络连接模型,仅影响Nginx与客户端的网络交互,不涉及HTTP协议相关配置。常见配置项:
| 配置项 | 含义 | 示例与说明 |
|---|---|---|
| use | 指定Nginx使用的事件模型 | use epoll; 推荐使用epoll(Linux系统),其他可选:select、poll,epoll支持高并发连接,性能最优 |
| worker_connections | 单个工作进程可同时处理的最大连接数 | worker_connections 10240; 结合worker_processes可计算最大并发数(如4*10240=40960),需小于worker_rlimit_nofile |
| multi_accept | 是否允许工作进程一次性接受多个新连接 | multi_accept on; 开启后提升连接接收效率,默认off |
| accept_mutex | 连接接收锁,避免多个进程争抢连接 | accept_mutex on; 高并发场景开启,默认on,可减少进程切换冲突 |
2.3 http块
http块是Nginx处理HTTP/HTTPS请求的核心配置块,可嵌套多个server块(对应虚拟主机),同时包含全局HTTP配置(如日志、压缩、缓存等)。
2.3.1 全局HTTP配置(http块直接子项)
| 配置项 | 含义 | 示例与说明 |
|---|---|---|
| include | 引入外部配置文件,简化主配置 | include mime.types; 引入MIME类型映射文件(指定不同文件的Content-Type);include conf.d/*.conf; 引入虚拟主机配置目录下的所有.conf文件 |
| default_type | 默认MIME类型,当无法匹配文件类型时使用 | default_type application/octet-stream; 表示默认以二进制流形式传输(如下载文件) |
| log_format | 自定义访问日志格式,可指定日志字段 | log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'; 常用字段含义:$remote_addr:客户端IP;$request:请求行(如GET /index.html HTTP/1.1);$status:HTTP状态码;$http_user_agent:客户端浏览器信息 |
| access_log | 访问日志的存储路径与使用的格式 | access_log /var/log/nginx/access.log main; 使用上面定义的main格式存储访问日志 |
| sendfile | 开启零拷贝传输,提升静态文件传输效率 | sendfile on; 跳过内核缓冲区与用户缓冲区的拷贝,直接从磁盘发送到网络,默认off |
| tcp_nopush | 与sendfile配合使用,合并TCP数据包发送 | tcp_nopush on; 开启后减少网络包数量,提升传输效率,需在sendfile on时生效 |
| tcp_nodelay | 关闭Nagle算法,立即发送小数据包 | tcp_nodelay on; 适用于交互性场景(如SSH),需在keepalive连接时生效 |
| keepalive_timeout | HTTP长连接超时时间 | keepalive_timeout 65; 客户端与服务器保持连接的时间,超过后关闭连接,默认75s |
| gzip | 开启Gzip压缩,减少传输流量 | gzip on; 配合以下配置使用:gzip_types text/plain text/css application/json application/javascript; 仅压缩指定类型的文件;gzip_min_length 1k; 仅压缩大于1KB的文件;gzip_comp_level 6; 压缩级别(1-9,级别越高压缩率越高但CPU消耗越大) |
2.3.2 server块(虚拟主机配置)
一个server块对应一个虚拟主机,可通过不同的域名或端口区分多个虚拟主机。核心配置项:
| 配置项 | 含义 | 示例与说明 |
|---|---|---|
| listen | 指定虚拟主机监听的端口和IP | 1. listen 80; 监听所有IP的80端口(HTTP默认端口);2. listen 192.168.1.100:8080; 监听指定IP的8080端口;3. listen 443 ssl; 监听443端口(HTTPS默认端口)并启用SSL |
| server_name | 指定虚拟主机对应的域名,支持通配符和正则 | 1. server_name www.example.com; 精确匹配域名;2. server_name *.example.com; 通配符匹配二级域名;3. server_name ~^www\.(.*)\.com$; 正则匹配(需以~开头) |
| root | 指定虚拟主机的网站根目录(静态文件存放路径) | root /usr/share/nginx/html; 客户端请求/index.html时,实际访问路径为/usr/share/nginx/html/index.html |
| index | 指定默认首页(索引页),多个值按顺序匹配 | index index.html index.htm index.php; 访问域名时,优先返回index.html,不存在则找index.htm,以此类推 |
| ssl_certificate | HTTPS证书路径(公钥) | ssl_certificate /etc/nginx/ssl/example.crt; 需与SSL端口(443)配合使用 |
| ssl_certificate_key | HTTPS证书私钥路径 | ssl_certificate_key /etc/nginx/ssl/example.key; 私钥需妥善保管,权限设为600 |
2.3.3 location块(路由匹配配置)
location块嵌套在server块内部,用于根据请求的URI路径进行匹配,执行不同的处理逻辑(如静态资源返回、反向代理、重定向等)。
1. 匹配规则优先级(从高到低)
-
精确匹配 :
location = /path {}仅匹配URI为/path的请求,优先级最高 -
前缀匹配(不正则) :
location ^~ /path {}匹配以/path开头的URI,不解析正则,优先级高于正则匹配 -
正则匹配(区分大小写) :
location ~ /Path {}以~开头,区分大小写匹配URI -
正则匹配(不区分大小写) :
location ~* /path {}以~*开头,不区分大小写匹配URI -
普通前缀匹配 :
location /path {}匹配以/path开头的URI,优先级最低 -
默认匹配 :
location / {}匹配所有未被前面规则匹配的请求
2. 常用配置场景示例
nginx
# 场景1:静态资源处理(匹配所有以/static/开头的请求)
location ^~ /static/ {
root /usr/share/nginx; # 实际路径:/usr/share/nginx/static/xxx
expires 7d; # 静态资源缓存7天,减少重复请求
add_header Cache-Control "public, max-age=604800"; # 缓存控制头
}
# 场景2:反向代理(将/api/开头的请求转发到后端服务)
location /api/ {
proxy_pass http://127.0.0.1:8080/; # 转发目标地址(末尾/需注意:若有/,则去掉URI中的/api/;若无,则保留)
proxy_set_header Host $host; # 传递客户端Host头到后端
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链IP
}
# 场景3:重定向(将HTTP请求重定向到HTTPS)
location / {
return 301 https://$host$request_uri; # 301永久重定向,$host为域名,$request_uri为请求路径
}
# 场景4:禁止访问指定文件(匹配.git目录,返回403禁止访问)
location ~ /\.git {
deny all; # 禁止所有请求访问
return 403;
}
# 场景5:PHP解析(配合FastCGI转发PHP请求)
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000; # 转发到PHP-FPM服务(默认9000端口)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 指定PHP脚本路径
include fastcgi_params; # 引入FastCGI参数配置
}
三、完整配置示例(生产环境简化版)
nginx
# 全局块
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log warn;
# events块
events {
use epoll;
worker_connections 10240;
multi_accept on;
}
# http块
http {
include 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"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
# Gzip压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss;
# 虚拟主机1:HTTP服务(重定向到HTTPS)
server {
listen 80;
server_name www.example.com example.com;
return 301 https://$host$request_uri;
}
# 虚拟主机2:HTTPS服务
server {
listen 443 ssl;
server_name www.example.com example.com;
# SSL配置
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3; # 支持的TLS版本
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
# 网站根目录与首页
root /usr/share/nginx/html;
index index.html index.htm;
# 静态资源缓存
location ^~ /static/ {
expires 7d;
add_header Cache-Control "public, max-age=604800";
}
# 反向代理API
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
return 403;
}
}
}
四、配置验证与重载
修改配置文件后,需先验证配置正确性,再重载服务(无需停止服务,不影响业务):
-
验证配置 :
nginx -t若输出"nginx: configuration file /etc/nginx/nginx.conf test is successful",表示配置无误 -
重载服务 :
nginx -s reload平滑重载配置,新请求将使用新配置,旧连接不受影响
注意事项:1. 所有配置项必须以分号结尾,否则会报错;2. 注释使用#开头,仅支持单行注释;3. 生产环境中,建议将虚拟主机配置拆分到conf.d/目录,通过include引入主配置,便于管理。
(注:文档部分内容可能由 AI 生成)