整体配置介绍

Nginx配置文件(conf/nginx.conf)整体分为三部分

http块中可以配置多个Server块,每个Server块中可以配置多个location块

全局块

Events块

HTTP块

在 Nginx 配置中,http 块是一个核心的配置容器,用于定义所有与 HTTP 协议相关的设置。它是 Nginx 作为 Web 服务器或反向代理时的主要配置上下文。

http 块的基本结构

# 主配置文件 nginx.conf

# 全局配置段 (在events和http之外)
user nginx nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;

events {
    worker_connections 1024;
}

# http 块开始
http {
    # HTTP 全局配置
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log /var/log/nginx/access.log;
    
    # 服务器块
    server {
        listen 80;
        server_name example.com;
        # 服务器配置...
    }
    
    # 可以包含其他配置文件
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
# http 块结束

http 块的主要配置指令

1. 基础设置

http {
# MIME 类型include mime.types;
    default_type application/octet-stream;

# 日志配置access_log /var/log/nginx/access.log combined;
    error_log /var/log/nginx/error.log warn;

# 编码charset utf-8;
}

2. 性能优化

http {
# 连接超时keepalive_timeout 65;
    keepalive_requests 100;

# 发送文件优化sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

# 缓冲区大小client_body_buffer_size 128k;
    client_max_body_size 10m;

# 开启 Gzip 压缩gzip on;
    gzip_types text/plain text/css application/json application/javascript;
}

3. 上游服务器(负载均衡)

http {
# 定义上游服务器组upstream backend {
        server 192.168.1.10:8080 weight=3;
        server 192.168.1.11:8080 weight=2;
        server 192.168.1.12:8080 backup;
    }

# 或者使用负载均衡算法upstream load_balancer {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
}

4. 缓存配置

http {
# 代理缓存proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
                     max_size=1g inactive=60m;

#  FastCGI 缓存fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2
                       keys_zone=fcgi_cache:10m max_size=1g;
}

继承机制

当 root 出现在不同层级时,遵循以下规则:

场景 1:只有 server 块中的 root

nginx

server {
    listen 80;
    server_name example.com;
    root /var/www/main;# 默认根目录

    location / {
# 隐式继承 root /var/www/main;try_files $uri $uri/ =404;
    }

    location /images/ {
# 隐式继承 root /var/www/main;# 文件路径: /var/www/main/images/logo.png}
}

结果:所有 location 都使用 /var/www/main 作为根目录。

场景 2:server 和 location 中都有 root

nginx

server {
    listen 80;
    server_name example.com;
    root /var/www/main;# 默认根目录

    location / {
# 使用继承的 root /var/www/maintry_files $uri $uri/ =404;
    }

    location /blog/ {
        root /var/www/blog;# 覆盖继承的 root# 文件路径: /var/www/blog/article.html}

    location /static/ {
# 使用继承的 root /var/www/main# 文件路径: /var/www/main/static/style.css}
}

结果

场景 3:只有 location 中的 root

nginx

server {
    listen 80;
    server_name example.com;
# 没有 server 级的 root

    location / {
        root /var/www/website;
        try_files $uri $uri/ =404;
    }

    location /api/ {
# 错误:没有定义 root!proxy_pass <http://backend>;
    }
}

结果/api/ location 会报错,因为没有定义 root

路径解析的差异

使用 root 时:

nginx

server {
    root /var/www/main;

    location /images/ {
# 请求: /images/photo.jpg# 文件路径: /var/www/main/images/photo.jpg}
}

使用 alias 时(对比):

nginx

server {
    location /images/ {
        alias /var/www/images/;
# 请求: /images/photo.jpg# 文件路径: /var/www/images/photo.jpg}

    location /static/ {
        alias /var/www/assets/;
# 请求: /static/css/style.css# 文件路径: /var/www/assets/css/style.css}
}

实际应用的最佳实践

模式 1:统一根目录 + 特殊例外

nginx

server {
    listen 80;
    server_name example.com;
    root /var/www/primary;# 主要根目录

# 大部分内容使用主要根目录location / {
        try_files $uri $uri/ /index.html;
    }

# 用户上传的文件在单独目录location /uploads/ {
        root /var/user-uploads;
# 文件路径: /var/user-uploads/uploads/avatar.jpg}

# 旧版本存档在另一个位置location /legacy/ {
        root /var/old-website;
# 文件路径: /var/old-website/legacy/page.html}
}

模式 2:模块化内容组织

nginx

server {
    listen 80;
    server_name myapp.com;
    root /var/www/myapp;

# 前端静态资源location / {
        try_files $uri $uri/ /index.html;
    }

# API 代理(不需要 root)location /api/ {
        proxy_pass <http://localhost:3000>;
    }

# 管理后台使用不同的应用location /admin/ {
        root /var/www/admin-panel;
        try_files $uri $uri/ /admin/index.html;
    }

# 文档使用第三方工具生成location /docs/ {
        root /var/www/documentation;
        index index.html;
    }
}

模式 3:多租户架构

nginx

server {
    listen 80;
    server_name ~^(www\\.)?(?<tenant>.+)\\.company\\.com$;

# 动态根目录基于租户子域名root /var/www/tenants/$tenant;

    location / {
        try_files $uri $uri/ /index.html;
    }

# 所有租户共享的静态资源location /shared/ {
        root /var/www/shared-assets;
    }
}

关键总结

  1. 继承关系location 继承 server 的 root,但可以覆盖
  2. 路径计算root 指令会将 location 路径包含在最终文件路径中
  3. 默认值:在 server 级设置 root 作为默认值是好的实践
  4. 异常处理:如果某个 location 不需要文件服务(如代理),就不需要 root
  5. 灵活性:这种设计允许在同一虚拟主机内服务来自不同目录的内容