Nginx配置文件nginx.conf中文详解

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. 匹配规则优先级(从高到低)
  1. 精确匹配location = /path {} 仅匹配URI为/path的请求,优先级最高

  2. 前缀匹配(不正则)location ^~ /path {} 匹配以/path开头的URI,不解析正则,优先级高于正则匹配

  3. 正则匹配(区分大小写)location ~ /Path {} 以~开头,区分大小写匹配URI

  4. 正则匹配(不区分大小写)location ~* /path {} 以~*开头,不区分大小写匹配URI

  5. 普通前缀匹配location /path {} 匹配以/path开头的URI,优先级最低

  6. 默认匹配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;
        }
    }
}

四、配置验证与重载

修改配置文件后,需先验证配置正确性,再重载服务(无需停止服务,不影响业务):

  1. 验证配置nginx -t 若输出"nginx: configuration file /etc/nginx/nginx.conf test is successful",表示配置无误

  2. 重载服务nginx -s reload 平滑重载配置,新请求将使用新配置,旧连接不受影响

注意事项:1. 所有配置项必须以分号结尾,否则会报错;2. 注释使用#开头,仅支持单行注释;3. 生产环境中,建议将虚拟主机配置拆分到conf.d/目录,通过include引入主配置,便于管理。

(注:文档部分内容可能由 AI 生成)

相关推荐
Leinwin3 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382503 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇3 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7593 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣3 小时前
智能体选型实战指南
运维·人工智能
yy55274 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ4 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔6 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密6 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20156 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑