Nginx 配置详解与优化指南

一、Nginx 核心配置解析

1. 配置文件结构

main          # 全局配置(worker进程数、日志等)
events {      # 事件模型配置
    ...
}
http {        # HTTP服务配置
    server {  # 虚拟主机配置
        listen 80;
        server_name example.com;
        location / {  # URI路由配置
            ...
        }
    }
}

二、关键指令详解

1. 核心指令

指令 作用 示例
worker_processes worker进程数 worker_processes auto;
worker_connections 每个worker最大连接数 worker_connections 1024;
keepalive_timeout 长连接超时时间 keepalive_timeout 65;
gzip 启用压缩 gzip on;
access_log 访问日志路径 access_log /var/log/nginx/access.log;

2. 最大并发计算

最大并发 = worker_processes × worker_connections

示例:4核CPU,每个worker支持1024连接
4 × 1024 = 4096 并发连接


三、静态网站配置示例

1. 基础配置

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;  # 网站根目录
    index index.html index.htm;  # 默认首页

    location / {
        try_files $uri $uri/ =404;  # 文件存在性检查
    }

    location /images/ {
        expires 7d;  # 图片缓存7天
    }
}

2. 指令解析

  • root:定义请求的根目录,$uri会拼接到该路径后
  • index:当请求目录时,按顺序尝试返回的默认文件
  • location
    • = /path:精确匹配
    • ~ \.php$:正则匹配(区分大小写)
    • ^~ /static/:前缀匹配(不检查正则)

四、反向代理配置

1. 代理到后端应用

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;  # 传递原始主机头
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

upstream backend_server {
    server 192.168.1.100:8080 weight=5;
    server 192.168.1.101:8080;
    keepalive 32;  # 保持连接池
}

2. proxy_set_header Host $host 的作用

  • 保持原始请求的Host头(而非后端服务器地址)
  • 解决:
    • 虚拟主机识别问题
    • 重定向丢失域名问题
    • 应用生成绝对URL的需要

五、基于域名的虚拟主机

1. 多站点配置

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

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

2. 域名优势

  • 灵活性:同一IP托管多个网站
  • SEO优化:独立域名提升搜索排名
  • 安全性:隔离不同服务的cookie和会话
  • 维护性:独立配置和日志

六、本地测试配置(/etc/hosts)

1. 修改hosts文件

# /etc/hosts
127.0.0.1   site1.local
127.0.0.1   site2.local

2. 对应Nginx配置

server {
    listen 80;
    server_name site1.local;
    root /var/www/site1;
}

3. 测试流程

  1. 浏览器访问 http://site1.local
  2. 系统检查/etc/hosts解析到127.0.0.1
  3. Nginx根据server_name匹配响应

七、性能优化技巧

1. 静态资源优化

location ~* \.(jpg|png|css|js)$ {
    expires 30d;          # 缓存30天
    add_header Cache-Control "public";
    access_log off;        # 关闭日志
}

2. 动态内容优化

location ~ \.php$ {
    proxy_cache my_cache;
    proxy_cache_valid 200 5m;  # 缓存200响应5分钟
    proxy_pass http://php_backend;
}

3. 系统级优化

events {
    worker_connections 2048;
    multi_accept on;  # 同时接受所有新连接
}

http {
    sendfile on;       # 零拷贝传输
    tcp_nopush on;     # 优化数据包发送
}

八、完整示例:电商站点配置

worker_processes auto;

events {
    worker_connections 1024;
}

http {
    upstream backend {
        server 10.0.0.2:8000;
        server 10.0.0.3:8000 backup;
    }

    server {
        listen 80;
        server_name shop.example.com;

        root /var/www/shop;
        index index.html;

        location /static/ {
            expires 7d;
        }

        location /api/ {
            proxy_pass http://backend;
            proxy_set_header Host $host;
        }

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

关键总结

  1. server_name:实现基于域名的虚拟主机
  2. proxy_set_header Host $host:确保代理后域名一致性
  3. /etc/hosts:本地开发时模拟域名解析
  4. 性能公式:并发能力 = worker_processes × worker_connections
  5. 最佳实践
    • 静态资源启用缓存
    • 动态内容使用反向代理
    • 生产环境启用HTTPS
作者:admin  创建时间:2025-06-06 11:07
最后编辑:admin  更新时间:2025-06-07 09:49