# 代理服务器
代理分为正向代理跟反向代理;
- 正向代理是为客户端做代理,代替客户端去访问服务器;
- 反向代理是为服务器做代理,代替服务器接受客户端请求。
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)