写在前面
有时候受限于运营商或其他网络路由线路的问题,在访问某个站点的时候延迟和丢包会比较严重,尤其是一些上下载资源比较大的网站,因为这些网络问题会让访问体验非常差
如果我们有一台直连线路非常好的服务器,就可以考虑通过这台服务器来中转流量,以达到提速或提升访问体验的效果
这里我们考虑用Nginx的反向代理来实现这一功能
注:本文所述配置主要针对自建服务或单一域名站点的反代
准备工作
除了有一台直连线路好的服务器,还需要准备好域名和SSL证书,然后提前安装好Nginx就好
关于域名和SSL证书部分这里就不展开说了,下面主要说明一下Nginx的配置
Nginx配置
假设我们要用www.local.com
(自己的域名)来反代www.target.com
(目标域名),那么我这里使用的Nginx配置如下
server {
listen 80;
server_name www.local.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name www.local.com;
ssl_certificate /etc/letsencrypt/live/www.local.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.local.com/privkey.pem;
location / {
proxy_pass https://www.target.com/; # 反代目标
proxy_set_header Host www.target.com; # 重写Host请求头
proxy_ssl_server_name on; # 启用SNI
proxy_ssl_name www.target.com; # 指定SNI值
# proxy_ssl_verify off; # 如果上游是自签名证书须开启
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
sub_filter 'https://www.target.com/' '/'; # 内容替换过滤器
sub_filter_once off; # 开启多次替换
proxy_buffering on; # 启用缓冲区,因为sub_filter需要处理整个响应体
proxy_redirect https://www.target.com/ /; # 重定向头重写
# 开启Web Socket,根据网站情况选用
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
}
}
比较关键的部分是请求头的修改以及跨域和重定向问题,在配置中均有说明,需要确保替换为自己反代的上游域名
如果上游是自签名证书需要注意设置proxy_ssl_verify off
才可以跳过验证证书安全性
补充说明
通常对于反代自建服务和小型站点(单一域名,无其他资源域),本文所述配置基本可以实现反代、优化访问体验的目的
但因为本文配置仅处理单一域名,对于一些大型站点,尤其是涉及一些多域名跨域请求的网站可能导致资源无法加载,需要在配置中逐个匹配域名进行替换,性能开销也比较大,因此有一定局限性