Nginx 核心配置:反向代理/静态资源/限流/SSL/负载均衡实战指南

服务器 服务器产品
反向代理是Nginx最常用的功能之一,通过将客户端请求转发至后端服务器,可实现负载均衡、隐藏真实服务地址、统一入口等效果。

前言

Nginx作为高性能的HTTP和反向代理服务器,已成为企业级应用架构的核心组件。本文从基础环境到高级配置,全面覆盖了Nginx的反向代理、静态资源、限流、SSL和负载均衡四大核心功能。

基础环境准备

# 安装Nginx
yum install -y nginx

# 启动并设置开机自启
systemctl start nginx
systemctl enable nginx

# 验证服务状态
systemctl status nginx

核心配置文件路径

  • 主配置文件:/etc/nginx/nginx.conf
  • 虚拟主机配置目录:/etc/nginx/conf.d/(推荐将站点配置放在此目录,以.conf结尾)
  • 日志目录:/var/log/nginx/(access.log 记录访问日志,error.log 记录错误日志)

反向代理配置

反向代理是Nginx最常用的功能之一,通过将客户端请求转发至后端服务器,可实现负载均衡、隐藏真实服务地址、统一入口等效果。

基础反向代理配置

场景:将http://example.com的请求转发至后端192.168.1.100:8080服务。 创建站点配置文件/etc/nginx/conf.d/proxy.conf:

server {
    listen 80;
    server_name example.com;  # 你的域名或服务器IP

    # 日志配置
    access_log /var/log/nginx/proxy_access.log main;
    error_log /var/log/nginx/proxy_error.log warn;

    # 反向代理核心配置
    location / {
        proxy_pass http://192.168.1.100:8080;  # 后端服务地址
        proxy_set_header Host $host;  # 传递客户端请求的Host头
        proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递代理链IP
        proxy_set_header X-Forwarded-Proto $scheme;  # 传递请求协议(http/https)
    }
}

带缓存的反向代理(优化性能)

为减少后端服务压力,可配置Nginx缓存静态资源(如图片、JS、CSS):

http {
    # 全局缓存配置(放在http块中)
    proxy_cache_path /var/cache/nginx/proxy_cache 
                    levels=1:2 
                    keys_zone=PROXY_CACHE:10m 
                    max_size=10g 
                    inactive=7d 
                    use_temp_path=off;

    server {
        # ... 其他配置同上 ...

        location ~* \.(jpg|jpeg|png|gif|js|css)$ {  # 匹配静态资源后缀
            proxy_pass http://192.168.1.100:8080;
            proxy_cache PROXY_CACHE;  # 启用缓存,关联上述keys_zone
            proxy_cache_valid 200 304 1d;  # 200/304状态码缓存1天
            proxy_cache_valid any 10m;  # 其他状态码缓存10分钟
            proxy_cache_key "$host$request_uri$is_args$args";  # 缓存键值(确保唯一性)
            add_header X-Cache-Status $upstream_cache_status;  # 响应头显示缓存状态(HIT/MISS)
        }
    }
}

静态资源访问配置

场景:将服务器/data/static目录下的资源(图片、JS、CSS 等)通过http://example.com/static/路径对外提供访问。 创建站点配置文件/etc/nginx/conf.d/static.conf:

server {
    listen 80;
    server_name example.com;  # 你的域名或服务器IP

    # 日志配置(单独记录静态资源访问日志,便于分析)
    access_log /var/log/nginx/static_access.log main;
    error_log /var/log/nginx/static_error.log warn;

    # 静态资源核心配置:匹配 /static/ 路径的请求
    location /static/ {
        # 指向服务器本地静态资源目录(末尾必须加 /,与 location 路径对应)
        root /data/;  
        try_files $uri$uri/ /index.html;
        # 示例:访问 http://example.com/static/img/logo.png → 实际读取 /data/static/img/logo.png

        autoindex off;  # 禁用目录索引(避免暴露目录结构)
        expires 1d;     # 设置浏览器缓存时间(1天,减少重复请求)
        add_header Cache-Control "public, max-age=86400";  # 配合 expires 增强缓存策略
    }

    # 可选:直接匹配文件后缀(覆盖未通过 /static/ 路径访问的静态资源)
    location ~* \.(jpg|jpeg|png|gif|bmp|svg|js|css|ico|woff|woff2|ttf|eot)$ {
        root /data/;
        expires 7d;  # 字体、样式文件可设置更长缓存(7天)
        add_header Cache-Control "public, max-age=604800";
    }
}
  • root的作用是定义资源根目录,Nginx会将location匹配到的完整路径(包括location本身定义的路径),直接拼接在root指定的路径之后,形成最终的文件真实路径。
  • alias 的作用是为location路径设置别名,Nginx会将location匹配到的路径(即location定义的路径部分)直接替换为alias指定的路径,剩余的请求路径(若有)再拼接到alias路径后。

静态资源压缩配置(优化传输速度)

http {
    # 全局 Gzip 压缩配置
    gzip on;  # 启用 Gzip 压缩
    gzip_min_length 1k;  # 仅压缩大于 1KB 的文件(小文件压缩收益低)
    gzip_buffers 4 16k;  # 压缩缓冲区大小
    gzip_http_version 1.1;  # 支持的 HTTP 版本
    gzip_comp_level 6;  # 压缩等级(1-9,等级越高压缩率越高但消耗 CPU 越多,推荐 6)
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss image/svg+xml;  # 需压缩的文件类型
    gzip_vary on;  # 向客户端返回压缩标识(让浏览器知道资源已压缩)
    gzip_proxied any;  # 对代理请求也启用压缩

    # 其他配置(如反向代理、负载均衡等)...
}

静态资源防盗链配置

server {
    listen 80;
    server_name example.com;

    location /static/ {
        root /data/;
        expires 1d;

        # 防盗链核心配置:仅允许指定域名引用资源
        valid_referers none blocked example.com *.example.com;  # 允许的引用域名(none 表示直接访问,blocked 表示无 referer 的请求)
        if ($invalid_referer) {
            return 403;  # 非法引用时返回 403 禁止访问
            # 可选:返回自定义图片(如防盗链提示图),需将 return 403 替换为:
            # rewrite ^/ /static/img/anti-hotlink.png last;
        }
    }
}

限流配置

Nginx 通过ngx_http_limit_req_module和ngx_http_limit_conn_module模块实现限流,分别对应请求数限流和连接数限流。

求数限流(漏桶算法)

场景:限制单个IP每秒最多发起10个请求,超过部分返回503错误。

http {
    # 定义限流池:名为one,容量10,每秒放10个请求(rate=10r/s)
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 应用限流池one,允许突发请求数为5(超过容量时排队)
            limit_req zone=one burst=5 nodelay;
            # 限流后返回的错误页面(可选)
            limit_req_status 503;
            proxy_pass http://192.168.1.100:8080;
        }
    }
}

连接数限流

场景:限制单个IP同时最多建立20个连接,每个连接最多发起10个请求。

http {
    # 定义连接数限流池:名为conn,容量20
    limit_conn_zone $binary_remote_addr zone=conn:10m;

    server {
        # ... 其他配置 ...

        location / {
            limit_conn conn 20;  # 单个IP最大连接数
            limit_conn_per_ip 20;  # 同limit_conn,部分版本支持
            limit_req zone=one burst=5 nodelay;  # 结合请求数限流
            proxy_pass http://192.168.1.100:8080;
        }
    }
}

SSL 配置

server {
    listen 443 ssl http2;  # 启用HTTPS和HTTP/2
    server_name example.com;

    # SSL证书路径
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL优化配置
    ssl_protocols TLSv1.2 TLSv1.3;  # 禁用不安全的TLS版本
    ssl_prefer_server_ciphers on;  # 优先使用服务器端加密套件
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";  # 安全加密套件
    ssl_session_cache shared:SSL:10m;  # SSL会话缓存
    ssl_session_timeout 1d;  # 会话超时时间
    ssl_stapling on;  # 启用OCSP stapling(减少证书验证时间)
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;  # DNS解析器

    # 强制HTTP跳转HTTPS(可选,单独配置一个80端口的server)
    server {
        listen 80;
        server_name example.com;
        return 301 https://$host$request_uri;  # 永久重定向
    }

    # 反向代理配置(同第二部分)
    location / {
        proxy_pass http://192.168.1.100:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

负载均衡配置

定义负载均衡池

在nginx.conf的http块中定义后端服务器集群

http {
    # 定义负载均衡池,名为backend
    upstream backend {
        # 后端服务器1,权重为2(权重越高,分配到的请求越多)
        server 192.168.1.100:8080 weight=2;
        # 后端服务器2,权重为1,max_fails=3表示3次连接失败标记为不可用
        server 192.168.1.101:8080 weight=1 max_fails=3 fail_timeout=30s;
        # 后端服务器3,backup表示仅当其他节点不可用时才启用
        server 192.168.1.102: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;
        }
    }
}

常用负载均衡算法

  • 轮询(默认):按顺序分发请求,适合后端服务器性能一致的场景;
  • 加权轮询(weight):按权重比例分发,权重越高分配越多请求;
  • IP哈希(ip_hash):根据客户端IP哈希值固定分配至某台服务器,可实现会话保持;
  • 最少连接(least_conn):将请求分发至当前连接数最少的服务器,适合后端服务器性能差异较大的场景
责任编辑:武晓燕 来源: 一安未来
相关推荐

2019-07-09 15:10:02

Nginx反向代理负载均衡

2015-06-05 11:26:58

nginx运维

2012-12-07 10:14:48

Nginx负载均衡

2019-06-19 15:34:39

Nginx反向代理负载均衡

2017-12-18 12:04:02

Nginx代理均衡

2019-11-04 15:35:53

Nginx反向代理负载均衡

2019-09-18 10:39:08

负载均衡反向代理TCP

2019-05-22 14:42:43

SSLNginx反向代理

2020-07-28 15:10:34

Nginx反向代理负载均衡

2023-02-20 08:27:17

2021-01-13 07:15:41

云原生反向代理网关

2013-04-22 11:29:14

Nginx

2019-10-10 15:59:14

Nginx反向代理负载均衡

2020-10-22 08:05:46

Nginx

2023-10-17 08:36:28

Nginx代理服务器

2021-03-01 06:15:53

nginx

2022-07-01 07:33:24

nginx反向代理测试

2018-10-14 08:39:52

NginxTomcat服务器

2018-11-05 09:34:43

2023-02-24 15:28:07

点赞
收藏

51CTO技术栈公众号