# 代理服务器

代理分为正向代理跟反向代理;

  • 正向代理是为客户端做代理,代替客户端去访问服务器;
  • 反向代理是为服务器做代理,代替服务器接受客户端请求。

nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass`指令,只需要修改配置文件就可以实现反向代理。

# 反向代理

location / {
    add_header Access-Control-Allow-Origin *;
    # 处理跨域请求
    add_header Access-Control-Allow-Methods "OPTIONS";
    # 涉及预检请求,服务器需要允许该方法
    add_header Access-Control-Allow-Headers "Origin, Content-Type";
    # 请求头支持的传递字段
    proxy_pass http://localhost:3000;
    # 代理网路请求到本地3000端口
    # 重写主机名,防止后端真实的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能
    proxy_set_header Host  $host;
    proxy_set_header X-Forwarded-For  $remote_addr;
    # 重写服务器ip ,防止后端有防攻击策略的话,机器会被封掉
    proxy_add_x_forwarded_for: client ;
    # 保存请求端真实的IP
 }
# /etc/nginx/nginx.conf
server {
    listen 80;
    listen 443 ssl http2;
    server_name docs.gausszhou.top;
    location / {
        proxy_pass http://127.0.0.1:4999/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# 任意跨域代理

可以通过

  • http://a.com?URL=http://b.com/a.mp4
  • http://a.com/_proxy/http://b.com/a.mp4

转发到

  • http://b.com/a.mp4
server {
    listen 80;
    server_name proxy.domain.com; 

    # match _proxy
    location ~* ^/_proxy/ {

      # 能解析转发 URL 的 DNS
      resolver 114.114.114.114;

      # request uri 
      if ( $request_uri ~ "(/|=)(http.*)" ) {
          set $proxy_url $2;
      }  
    
      # get host
      set $proxy_host $host; 
      if ( $proxy_url ~ "https?://(.*?)/" ) {
          set $proxy_host $1;
      } 
        
      # proxy
      proxy_pass $proxy_url;
      proxy_set_header Host $proxy_host;
      proxy_set_header X-Forwarded-For $remote_addr;
      # range
      proxy_cache_key $host&uri&is_args&args$http_range;
      proxy_set_header Range $http_range;
      proxy_set_header If-Range $http_if_range;
      proxy_cache_valid 200 206; 
      # cache
      add_header expires max;
    }

    # cors
    add_header "Access-Control-Allow-Origin"  *;
    add_header "Access-Control-Allow-Methods" *;
    add_header "Access-Control-Allow-Headers" "Authorization, Origin, Content-Type, Accept";
    # log
    access_log  /www/wwwlogs/api.gausszhou.top.log;
    error_log  /www/wwwlogs/api.gausszhou.top.error.log;
}

Nginx中如何对地址参数进行代理 (opens new window) Nginx中如何对范围请求进行处理 (opens new window)