最近在折腾nginx反代的问题,由于网站服务器在国外,给套了一层cf,直接用反代源站的办法基本都是失败,没办法只能网上查找资料,加上自力更生,找到两种反代cf的写法。
dns设置
本文我们针对全面反代cloudflare来说,直接反代源站也是类似的操作,我们当前采取的是ns接入cloudflare的方式,即域名服务器已经修改成了cloudflare的服务器,在cloudflare上设置dns记录,添加两条记录。
cf.example.com 解析到你的源站ip,并开启cdn(如果你是直接反代源站,那么这一步关闭cdn,仅作为dns使用即可)
blog.example.com 解析到你的反代服务器ip,仅作为dns使用。
1 利用proxy_ssl_name声明源站,告诉CF
#PROXY-START/
location /
{
proxy_pass https://www.xboy.uk;
proxy_set_header Host www.xboy.uk;
#向后端传递访客 ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
#向后端传递访客 ip (反代CF增加规则)
proxy_ssl_name www.xboy.uk;
proxy_ssl_server_name on;
#缓存设置
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
proxy_ignore_headers Set-Cookie Cache-Control expires;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 301 302 120m;
expires 12h;
}
#PROXY-END/
2 反代到cloudflare IP
# 如果反代的是cloudflare
location / {
# 由于我们反代的cloudflare使用的是 https,所以我们需要指明sni,不然是无法握手的,另外还需要设置host,这两个都要设置成接入cloudflare的域名。
proxy_ssl_name cdn.example.com;
proxy_ssl_server_name on;
proxy_set_header Host cdn.example.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
# 重点!由于我们接入cloudflare的域名和我们反代服务器的域名不一样,typecho的数据库里面记录的链接都是cdn.example.com的形式,所以我们要做内容替换。我们还需要通过设置Accept-Encoding "";来告诉服务器不要对内容进行压缩,不然返回的数据没办法使用sub_filter替换。
proxy_set_header Accept-Encoding "";
sub_filter "https://cdn.example.com" "https://blog.example.com";
# 开启内容多次替换
sub_filter_once off;
# 禁用缓存 (这个应该会影响到cloudfalre的缓存,不建议设置)
add_header Cache-Control no-cache;
expires 12h;
# 这里随便找个cloudflare的ip即可
proxy_pass https://1.0.0.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
评论 (0)