nginx

Nginx 的配置文件(通常是 /etc/nginx/nginx.conf),它通过块(Block)和指令(Directive) 来告诉 Nginx 如何工作。 这些块由大括号 {} 包裹,形成了一个层次化的结构

1、Main Context(全局上下文)

  • 范围: 整个配置文件最外层的区域,不在任何 {} 内的区域。
  • 功能: 设置影响 Nginx 整体运行的指令。这些是最高级的配置,作用于所有其他部分。
  • 常见配置指令
    • user nginx nginx;: 设置运行 Nginx 工作进程的用户和用户组。为了安全,最好不要用 root
    • worker_processes auto;: 定义工作进程的数量。设置为 auto 可以让 Nginx 自动设置为 CPU 的核心数,性能最优
    • error_log /var/log/nginx/error.log warn;: 设置错误日志的文件路径和记录级别(如 debug, info, warn, error
    • pid /run/nginx.pid;: 指定存储 Nginx 主进程 ID 的文件位置
# 这就在 Main 上下文中
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# 接下来会进入 Events 和 Http 块
events {
    ...
}

http {
    ...
}

2、Events Context(事件上下文)

  • 范围: 包含在 events {}大括号内
  • 功能: 设置影响 Nginx 如何处理连接的指令,尤其与“网络连接”的处理模型有关。这个模块对性能至关重要
  • 常见配置指令
    • worker_connections 1024;每个工作进程同时能够处理的最大连接数。这个值不能超过系统的最大打开文件数限制(ulimit -n
    • use epoll;: 在 Linux 系统上,指定高效的事件驱动模型(如 epoll)。通常 Nginx 会自动选择最佳模型,一般不需要手动设置
events {
    # 每个工作进程可以处理 1024 个连接
    worker_connections 1024;
    # 使用 epoll 模型(高效)
    use epoll;
}

3、Http Context(HTTP 上下文)

  • 范围: 包含在 http {} 大括号内
  • 功能: 这是配置 HTTP 或 HTTPS 服务器的核心区域。所有与网页、反向代理、负载均衡等相关的配置都在这里定义。它可以包含多个 server
  • 常见配置指令
    • include /etc/nginx/mime.types;: 引入一个文件,该文件定义了文件扩展名和 MIME 类型(如 text/html, image/jpeg)的映射关系。这样浏览器才能正确解析文件类型
    • default_type application/octet-stream;: 如果找不到对应的 MIME 类型,就使用这个默认类型(通常是作为二进制流下载)
    • access_log /var/log/nginx/access.log;: 设置访问日志的路径和格式
    • sendfile on;: 开启高效的文件传输模式,提升静态文件服务性能
    • keepalive_timeout 65;: 保持连接的超时时间,单位是秒。减少重复建立连接的开销
    • gzip on;: 开启 Gzip 压缩,压缩传输的数据,节省带宽
http {
    # 引入 MIME 类型定义文件
    include mime.types;
    default_type application/octet-stream;

    # 开启日志和高效传输
    access_log /var/log/nginx/access.log;
    sendfile on;

    # 连接超时设置
    keepalive_timeout 65;

    # 开启压缩
    gzip on;

    # 接下来可以定义多个 Server(虚拟主机)
    server {
        ...
    }

    server {
        ...
    }
}

4、Server Context(服务器上下文 / 虚拟主机)

  • 范围: 包含在 http {} 块内的 server {} 大括号中。
  • 功能: 用来定义一个虚拟主机(Virtual Host)。这是实现“一台服务器上运行多个网站”的关键。Nginx 通过检查请求中的 Host 头来决定将请求交给哪个 server 块来处理。
  • 常见配置指令
    • listen 80;: 监听本机 80 端口(HTTP)
    • listen 443 ssl;: 监听 443 端口并启用 SSL(HTTPS)
    • server_name example.com www.example.com;: 定义这个虚拟主机的域名。可以写多个,用空格隔开。server_name 是区分不同虚拟主机的关键
    • root /var/www/example.com;: 设置这个网站的文件根目录。后续的 URI 查找都会基于这个路径
    • index index.html index.htm;: 定义默认的索引文件。当请求是一个目录时,Nginx 会按顺序查找这些文件
server {
    # 监听 80 端口
    listen 80;
    # 这个服务器块负责处理来自 example.com 和 www.example.com 的请求
    server_name example.com www.example.com;

    # 网站文件存放在 /var/www/example.com 目录下
    root /var/www/example.com;
    # 默认找 index.html 或 index.htm 文件
    index index.html;

    # 接下来可以定义 Location 块,处理不同的 URI
    location / {
        ...
    }
}

5、Location Context(位置上下文)

  • 范围: 包含在 server {} 块或其它 location {} 块内的 location [修饰符] 匹配模式 {} 大括号中。
  • 功能根据请求的 URI(网址中域名后的部分)来指定不同的处理规则。这是 Nginx 配置中最灵活、最强大的部分。你可以为不同的URL设置不同的行为,比如处理静态文件、转发给后端应用、进行访问控制等。
  • 匹配模式
    • location /images/ { ... }: 匹配任何以 /images/ 开头的 URI
    • location = /login { ... }精确匹配,只匹配 /login 这个 URI
    • location ~ \.php$ { ... }正则表达式匹配(区分大小写),匹配所有以 .php 结尾的 URI
    • location ~* \.(jpg|jpeg|png)$ { ... }正则表达式匹配(不区分大小写),匹配所有以 .jpg, .jpeg, .png 结尾的 URI
  • 常见配置指令
    • proxy_pass http://localhost:3000;反向代理,将匹配的请求转发到指定的后端服务器(如 Node.js, Java, Python 应用)
    • try_files $uri $uri/ /index.html;: 按顺序检查文件是否存在。常用于前端单页面应用(SPA)的路由处理
    • alias /path/to/files;: 定义另一个路径来替换匹配的 URI 部分,常用于静态资源服务
server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
    index index.html;

    # Location 1: 处理根请求,尝试找文件,找不到则返回 index.html(用于前端路由)
    location / {
        try_files $uri $uri/ /index.html;
    }

    # Location 2: 处理所有以 /api/ 开头的请求,并转发到后端 Java 服务
    location /api/ {
        # 将请求代理到本机的 8080 端口
        proxy_pass http://localhost:8080;
    }

    # Location 3: 用正则匹配所有图片文件,并设置浏览器缓存时间
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        expires 30d; # 设置浏览器缓存 30 天
    }
}
上下文(Context) 作用范围 主要功能
Main 全局 设置工作进程、日志、权限等全局参数
Events 全局 设置网络连接处理模型,影响性能
Http http {} 所有 HTTP 相关设置的容器,定义 MIME、日志格式等
Server http {} 定义一个虚拟主机(网站),通过 server_name 区分
Location server {} 根据 URI 匹配规则,指定详细处理行为(代理、静态文件等)
# Main Context
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;

# Events Context
events {
    worker_connections 1024;
}

# Http Context
http {
    include mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    sendfile on;
    keepalive_timeout 65;

    # 第一个 Server Context:静态网站
    server {
        listen 80;
        server_name my-site.com;
        root /var/www/my-site;
        index index.html;

        # Location Context for SPA
        location / {
            try_files $uri $uri/ /index.html;
        }
    }

    # 第二个 Server Context:反向代理到后端应用
    server {
        listen 80;
        server_name api.my-site.com;

        # Location Context for API
        location / {
            proxy_pass http://localhost:3000;
        }
    }
}
目的 命令 备注
启动 nginx 默认读取 /etc/nginx/nginx.conf
指定配置启动 nginx -c /path/nginx.conf 多实例场景常用
语法检查 nginx -t 修改配置后必做
热加载 nginx -s reload 0 中断生效
优雅停止 nginx -s quit 处理完当前连接后再退出
立即关闭 nginx -s stop 暴力杀进程
重新打开日志 nginx -s reopen 日志切割时用
查看编译参数 nginx -V 判断模块是否编译进去
查看进程 ps -ef | grep nginx master/worker 模型