Nginx 反向代理配置与基础使用指南

Nginx 是一个高性能的 Web 服务器和反向代理服务器,广泛用于处理高并发请求、负载均衡和静态文件服务。如果不了解反向代理是什么,可以参考这篇文章


1. 安装 Nginx

1.1 在 Ubuntu/Debian 上安装

sudo apt update && sudo apt install nginx

1.2 启动与验证

启动 Nginx 并设置开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

访问 http://你的服务器IP,若看到 Nginx 欢迎页面,说明安装成功。确保 80 端口未被占用。


2. Nginx 配置文件结构

  • 主配置文件/etc/nginx/nginx.conf(全局设置,通常无需修改)。
  • 站点配置文件/etc/nginx/sites-available/(配置文件存放处)和 /etc/nginx/sites-enabled/(启用的配置文件软链接)或 /etc/nginx/conf.d/(直接启用的配置文件)。

3. 典型使用场景

3.1 静态文件服务

场景:通过 example.com 提供静态文件(如 HTML、CSS)。

配置

server {
    listen 80;
    server_name example.com;
    
    location / {
        root /var/www/html;
        index index.html index.htm;
        try_files $uri $uri/ =404;
    }
}

关键字解释

  • listen 80;:监听 80 端口(HTTP 默认端口)。
  • server_name example.com;:处理该域名的请求。
  • root /var/www/html;:静态文件目录。
  • index index.html index.htm;:默认访问的文件顺序。
  • try_files:按顺序尝试查找文件,若都不存在则返回404。

3.2 反向代理

场景:将 example.com 的请求转发到 localhost:8080

配置

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://localhost: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;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 添加超时配置
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

关键字解释

  • proxy_pass:将请求转发到指定地址。
  • proxy_set_header:传递客户端信息(如真实 IP 和协议)。
  • 超时配置:防止长时间连接占用资源。

3.3 HTTP 重定向到 HTTPS

场景:强制所有 HTTP 请求跳转到 HTTPS。

配置

server {
    listen 80;
    server_name example.com;
    
    # 添加 $request_uri 确保路径和参数被保留
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    
    # 添加 SSL 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    
    location / {
        proxy_pass http://localhost: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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

关键字解释

  • return 301:永久重定向到 HTTPS。
  • listen 443 ssl;:启用 HTTPS。
  • ssl_certificatessl_certificate_key:指定证书和私钥路径。
  • ssl_protocolsssl_ciphers:指定加密协议和算法,提高安全性。

3.4 负载均衡

场景:将请求分发到多个后端服务器。

配置

upstream backend {
    # 添加负载均衡算法
    least_conn;
    server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.103:8080 max_fails=3 fail_timeout=30s;
    
    # 添加备用服务器
    server 192.168.1.104:8080 backup;
}

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 添加健康检查间隔
        health_check interval=10 fails=3 passes=2;
    }
}

关键字解释

  • upstream:定义后端服务器组。
  • least_conn:使用最少连接数算法分配请求。
  • max_failsfail_timeout:定义失败条件和超时时间。
  • backup:备用服务器,仅在主服务器不可用时使用。
  • health_check:定期检查后端服务器健康状态。

3.5 路径匹配与请求转发

场景:根据不同路径转发到不同服务。

配置

nginxCopyserver {
    listen 80;
    server_name example.com;
    
    # API 请求转发
    location /api/ {
        proxy_pass http://localhost:8080/;
        # 注意:proxy_pass 末尾有 / 会去除 location 匹配部分
    }
    
    # 静态资源处理
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        root /var/www/static;
        expires 7d;
        add_header Cache-Control "public, max-age=604800";
    }
    
    # 默认路由
    location / {
        proxy_pass http://localhost:3000;
    }
}

关键字解释

  • location /api/:匹配 /api/ 开头的路径。
  • location ~*:使用正则表达式匹配,不区分大小写。
  • expiresadd_header:设置缓存控制。

3.6 日志查看

server {
    listen 80;
    server_name example.com;
    
    # 自定义访问日志格式
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log warn;
    
    location / {
        proxy_pass http://localhost:8080;
    }
}
  • 访问日志/var/log/nginx/access.log 或自定义路径
  • 错误日志/var/log/nginx/error.log 或自定义路径

实时查看:

tail -f /var/log/nginx/access.log

4. 测试和重载配置

验证配置是否正确:

sudo nginx -t

重载配置:

sudo systemctl reload nginx