Nginx 反代 Https 站点的配置方案

通过服务器中转访问https站点

写在前面


有时候受限于运营商或其他网络路由线路的问题,在访问某个站点的时候延迟和丢包会比较严重,尤其是一些上下载资源比较大的网站,因为这些网络问题会让访问体验非常差

如果我们有一台直连线路非常好的服务器,就可以考虑通过这台服务器来中转流量,以达到提速或提升访问体验的效果

这里我们考虑用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才可以跳过验证证书安全性

补充说明


通常对于反代自建服务和小型站点(单一域名,无其他资源域),本文所述配置基本可以实现反代、优化访问体验的目的

但因为本文配置仅处理单一域名,对于一些大型站点,尤其是涉及一些多域名跨域请求的网站可能导致资源无法加载,需要在配置中逐个匹配域名进行替换,性能开销也比较大,因此有一定局限性

转载请注明出处喔!( •̀ ω •́ )✧
发表了62篇文章 · 总计125.13k字
使用 Hugo 构建
主题 StackJimmy 设计