Nginx反向代理参考
# 定义一个上游服务器组,这是实现负载均衡和高可用的基础
# 常用度:极高
upstream my_backend_servers {
# 负载均衡策略 (默认为轮询)
# 1. 轮询 (默认): 每个请求按时间顺序逐一分配到不同的后端服务器
# server backend1.example.com;
# server backend2.example.com;
# 2. weight (权重): 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
server backend1.example.com weight=3;
server backend2.example.com weight=1;
# 3. ip_hash: 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题
# ip_hash;
# server backend1.example.com;
# server backend2.example.com;
# 4. least_conn (最少连接): 将请求分配给连接数最少的服务器
# least_conn;
# server backend1.example.com;
# server backend2.example.com;
# 健康检查相关参数
server backend1.example.com max_fails=3 fail_timeout=30s; # 在30秒内,如果与该服务器通信失败3次,则认为该服务器不可用,并在接下来的30秒内不再尝试
server backend2.example.com max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name your.domain.com; # 替换为您的域名
# ==================== 核心代理配置 (常用度: 极高) ====================
# 1. proxy_pass: 最核心的指令,指定后端服务器的协议和地址
# 可以是单个地址,也可以是上面定义的 upstream 块名称
location / {
proxy_pass http://my_backend_servers; # 将请求转发到名为 my_backend_servers 的上游服务器组
# proxy_pass http://127.0.0.1:8080; # 也可以直接指定单个后端服务
}
# 2. proxy_set_header: 重定义或添加发往后端服务器的请求头
# 这对于后端服务器获取客户端真实信息至关重要
location / {
proxy_pass http://my_backend_servers;
# 将客户端的真实 Host 头传递给后端
proxy_set_header Host $host;
# 将客户端的真实 IP 地址传递给后端,后端程序通常通过这个头获取用户IP
proxy_set_header X-Real-IP $remote_addr;
# X-Forwarded-For 是一个事实上的标准,用于记录请求经过的每一个代理服务器IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 如果客户端和 Nginx 之间是 HTTPS 连接,而 Nginx 和后端是 HTTP,这个头可以告诉后端原始协议
proxy_set_header X-Forwarded-Proto $scheme;
}
# 3. proxy_connect_timeout: 定义与后端服务器建立连接的超时时间
# 通常不应超过75秒
location / {
proxy_pass http://my_backend_servers;
proxy_connect_timeout 60s;
}
# 4. proxy_send_timeout: 定义向后端服务器发送请求的超时时间
# 这个超时是指在两次成功的写操作之间的间隔时间,而不是整个传输时间
location / {
proxy_pass http://my_backend_servers;
proxy_send_timeout 60s;
}
# 5. proxy_read_timeout: 定义从后端服务器读取响应的超时时间
# 这个超时是指在两次成功的读操作之间的间隔时间
location / {
proxy_pass http://my_backend_servers;
proxy_read_timeout 60s;
}
# ==================== 缓存配置 (常用度: 高) ====================
# 1. proxy_cache_path: 定义缓存文件的存储路径、级别、键等
# 只能放在 http 块中,这里作为示例展示
# /path/to/cache: 缓存存放目录
# levels=1:2: 缓存目录层级,例如 /path/to/cache/c/29
# keys_zone=my_cache:10m: 定义一个名为 my_cache 的共享内存区,大小为10MB,用于存储缓存键和元数据
# inactive=60m: 缓存如果在60分钟内没有被访问,则被删除
# max_size=1g: 缓存总大小上限为1GB
# proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
# 2. proxy_cache: 启用缓存,并指定使用哪个 keys_zone
location / {
proxy_pass http://my_backend_servers;
proxy_cache my_cache; # 使用上面定义的 my_cache 缓存区
}
# 3. proxy_cache_valid: 为不同的响应状态码设置不同的缓存时间
location / {
proxy_pass http://my_backend_servers;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m; # 200和302的响应缓存10分钟
proxy_cache_valid 404 1m; # 404的响应缓存1分钟
}
# 4. proxy_cache_key: 定义缓存键的组成,默认是 `$scheme$proxy_host$request_uri`
# 自定义缓存键可以实现更精细的缓存控制,例如根据不同用户或设备缓存不同内容
location / {
proxy_pass http://my_backend_servers;
proxy_cache my_cache;
# 例如,根据请求的URI和参数进行缓存
proxy_cache_key "$scheme$request_uri$is_args$args";
}
# 5. proxy_no_cache / proxy_bypass: 定义在何种条件下不缓存或绕过缓存
# 如果至少一个字符串不为空且不为“0”,则响应不会被缓存
location / {
proxy_pass http://my_backend_servers;
proxy_cache my_cache;
# 如果请求中包含 'nocache' 参数,或者 cookie 中包含 'no_cache',则不缓存
proxy_no_cache $arg_nocache $cookie_no_cache;
proxy_bypass $arg_nocache $cookie_no_cache;
}
# ==================== 缓冲区与响应体处理 (常用度: 中) ====================
# 1. proxy_buffering: 开启或关闭后端响应体的缓冲
# 开启时 (on),Nginx 会尽可能多地接收后端响应,然后一次性发送给客户端,有利于性能
# 关闭时 (off),响应会立即同步地传递给客户端,适用于需要即时响应的流式API
location / {
proxy_pass http://my_backend_servers;
proxy_buffering on;
}
# 2. proxy_buffer_size: 设置用于读取后端服务器响应第一部分的缓冲区大小
# 通常包含响应头和一些响应体,建议设置为 4k 或 8k
location / {
proxy_pass http://my_backend_servers;
proxy_buffer_size 4k;
}
# 3. proxy_buffers: 设置用于读取后端服务器响应的缓冲区数量和大小
location / {
proxy_pass http://my_backend_servers;
# 设置8个缓冲区,每个大小为4k
proxy_buffers 8 4k;
}
# ==================== SSL/TLS 卸载 (常用度: 中) ====================
# 当 Nginx 作为 HTTPS 入口,向后端发送 HTTP 请求时,这些配置很有用
location / {
proxy_pass http://my_backend_servers;
# 告诉后端客户端使用的是 HTTPS 协议
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-SSL on;
}
# ==================== 高级与特定场景配置 (常用度: 低) ====================
# 1. proxy_method: 指定转发给后端的请求方法
# 例如,可以将所有的 GET 请求都转换为 POST 请求发送到后端
location / {
proxy_pass http://my_backend_servers;
proxy_method POST;
}
# 2. proxy_ignore_headers: 指定哪些后端响应头可以被 Nginx 忽略
# 例如,忽略后端的 "Cache-Control", "Expires" 头,完全由 Nginx 的 proxy_cache 规则控制缓存
location / {
proxy_pass http://my_backend_servers;
proxy_ignore_headers Cache-Control Expires Set-Cookie;
}
# 3. proxy_intercept_errors: 决定是否将后端服务器的错误响应(>=400)传递给 Nginx 处理
# 开启后,可以使用 error_page 指令自定义错误页面
location / {
proxy_pass http://my_backend_servers;
proxy_intercept_errors on;
}
# 4. proxy_redirect: 修改后端服务器返回的 "Location" 和 "Refresh" 头
# 当后端返回的重定向地址是内网地址时,可以用它来修正为客户端可访问的公网地址
location / {
proxy_pass http://127.0.0.1:8080;
# 将后端返回的 http://127.0.0.1:8080/some/path 替换为 http://your.domain.com/some/path
proxy_redirect http://127.0.0.1:8080/ http://your.domain.com/;
}
# 5. proxy_bind: 强制代理连接使用指定的本地IP地址向外发起连接
# 在多网卡服务器上,可以指定从哪个IP出去访问后端
location / {
proxy_pass http://my_backend_servers;
proxy_bind 192.168.1.100; # 从 192.168.1.100 这个IP地址连接后端
}
# 6. proxy_http_version: 设置代理的 HTTP 协议版本
# 推荐使用 1.1 以支持 keep-alive 连接和后端服务器的 chunked 编码
location / {
proxy_pass http://my_backend_servers;
proxy_http_version 1.1;
# 当使用 HTTP/1.1 时,通常需要清理这个头,因为它的值为 "close" 会导致 keep-alive 失效
proxy_set_header Connection "";
}
}
评论已关闭