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 生成)

相关推荐
weixin_431697201 小时前
onlyoffice预览nginx代理的静态文件
运维·nginx
杨云龙UP1 小时前
从0搭建Oracle ODA NFS异地备份:从YUM源到RMAN定时任务的全流程
linux·运维·数据库·oracle
DN金猿1 小时前
恢复 Linux 上误删除的文件
linux·运维·服务器
6***A6632 小时前
Nginx 反向代理配置
运维·nginx
远瞻。2 小时前
【环境配置】Ubuntu系统安装cuda
linux·运维·ubuntu
kyle~2 小时前
Linux---<unistd.h>类Unix系统编程核心头文件
linux·运维·unix
bendan502 小时前
服务通过docker部署后,调用确定相互调用的URL
运维·docker·容器
闲人编程2 小时前
OpenAPI/Swagger规范与API文档自动化
运维·自动化·json·swagger·schema·openapi·codecapsule
python百炼成钢2 小时前
55.Linux ADC框架(IIO续)
linux·运维·服务器·驱动开发