继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Nginx 核心配置文件 nginx.conf 基础全解析

王家大少
关注TA
已关注
手记 30
粉丝 26
获赞 79

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+ 版本)。
  • 示例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)。
    • 日志级别(从低到高):debuginfonoticewarnerrorcritalertemerg。设置某一级别后,会记录该级别及更高级别的日志。
  • 生产建议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(性能较差,仅用于兼容)。

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 类型的映射(如 .htmltext/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.comwww2.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 后,需通过以下步骤使配置生效:

  1. 检查语法错误(必做):

    /usr/local/nginx/sbin/nginx -t
    

    输出 syntax is oktest is successful 表示无错误。

  2. 重载配置(不中断服务):

    /usr/local/nginx/sbin/nginx -s reload
    

六、总结

nginx.conf 的核心是层级配置,从全局到具体路径,每层配置都有明确的作用范围:

  • 全局块:控制 Nginx 整体性能(如工作进程数量)。
  • 事件块:优化网络连接(如最大并发数)。
  • HTTP 块:配置 HTTP 服务核心功能(如虚拟主机、代理、压缩)。
  • Server 块:定义单个站点的基础信息(如域名、根目录)。
  • Location 块:细化 URL 路径的处理规则(如静态文件、反向代理)。

对于初学者,建议先掌握 worker_processeslistenserver_namerootlocation 等核心参数,再通过实际场景(如部署静态网站、配置反向代理)加深理解。后续可逐步学习 HTTPS 配置、负载均衡等高级功能。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP