Nginx 反向代理

正向代理:用于配置代理服务器,所有请求通过代理服务器发出,应用场景:翻墙 VPN; 反向代理:服务的端由一台代理服务器进行请求的转发,无需用户配置,用户无感知,应用场景:负载均衡;

Nginx 反向代理配置

server {
    listen 80;
    server_name www.example.com;
    root /var/www;
    location /o2blog_wx/ {
        # 反向代理我们通过proxy_pass字段来设置
        # 也就是当访问http://aotu.jd.com/o2blog_wx的时候经过Nginx反向代理到服务器上的http://127.0.0.1:3000
        # 同时由于解析到服务器上的时候o2blog_wx这个字段都要处理
        # 所以通过rewrite字段来进行正则匹配替换
        # 也就是http://aotu.jd.com/o2blog_wx/hello经过Nginx解析到服务器变成http://127.0.0.1:3000/hello
        proxy_pass http://127.0.0.1:3000;
        rewrite ^/o2blog_wx/(.*) /$1 break;

    }
}

//TODO: 待完善

server {
    ...
    location / {
        ...
        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_cache_path指令,配置缓存选项和路径
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
    listen 80;
    location /cache/ {
        proxy_pass http://127.0.0.1:3000;
        # 使用proxy_pass指令激活缓存
        proxy_cache my_cache;
        # 使用proxy_cache_key指令设置缓存key,默认值为:$scheme$proxy_host$uri$is_args$args;
        proxy_cache_key $scheme$proxy_host$uri;
        # 使用proxy_cache_use_stale指令,在原服务器响应超时或返回50x错误时,如果缓存文件中有缓存文件,会返回缓存文件
        # updating参数配合下面的proxy_cache_background_update指令使用,客户端请求的资源以及过期或者正在向后端服务请求更新都将返回缓存内容,直到后端响应后更新缓存
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_background_update on;
        # proxy_cache_lock指令配置当有多个客户端请求同一件时,只向后端服务器发送一次请求。
        proxy_cache_lock on;
        # 在响应头中添加缓存状态
        add_header X-Cache-Status $upstream_cache_status;
    }
}

proxy_cache_path 指令

Syntax:
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default: —
Context: http

缓存状态:

  • MISS:未命中
  • HIT:响应缓存的有效内容
  • BYPASS:响应内容为向后端服务请求的新内容,参考 proxy_cache_bypass 指令
  • EXPIRED:缓存内容已过期,响应内容为后端服务的新内容
  • STALE:响应内容为过期的缓存内容,因为后端服务不能正常响应
  • UPDATING:响应内容为过期的缓存内容,因为请求内容正在更新中
  • REVALIDATED:响应内容为缓存的有效内容,参考 proxy_cache_revalidate 指令

  • 缓存存放位置

  • levels: 设置缓存目录层级结构,Nginx 默认将所有缓存文件都放在一个目录中,但是在一个包含大量文件的目录中查找某一个文件是比较慢的,所有推荐使用两层目录结构进行存储。
  • keys_zone:Nginx 缓存会对缓存路径进行 MD5 计算,将计算出来的值作为缓存的 key。keys_zone 用来设置一块共享内存用来存储缓存的 key 和元数,据,这样 Nginx 就可以快速的判断某一个请求的缓存是否有效,不需要去遍历缓存文件。1MB 可以缓存 8,000 个 key。
  • max_size:设置缓存的磁盘上限,非必选属性。缓存用量超出后 Nginx 会开启一个进程清理掉最近最少使用的缓存内容。
  • inactive:设置缓存资源不活跃(不被访问)时间,超时后会被删除,默认值为 10m(十分钟)
  • use_temp_path:缓存文件首次写入时是否被写入临时缓存区,建议关闭,避免非必要的拷贝

然后 web 服务端就可以可以通过request.getHeader("X-Forwarded-For");来获得真实的用户 ip

相关阅读

ngx_http_proxy_module How to Set Up and Configure Basic Caching

results matching ""

    No results matching ""