找回密码
 立即注册
快捷导航

Nginx 反代同域名/可IP配置CloudFlare及本地IP,反代跨域配置

[复制链接]
老王 2023-8-15 01:34:37 | 显示全部楼层

前言

前段时间博主购买了几台 OVH/$0.97/月的机器,除了作为备用网站还有几台多余,就想着找个腾讯云 HK 的机器反代把 OVH 机器利用起来,万一前台 HK 机器被干死就可以利用宕机切换回到 OVH。

操作介绍

大致说一下我的操作思路,OVH 机器使用 Route53 分国内外线路解析,境外走 cloudflare 的 cdn,而对于大陆地区则使用香港腾讯云反代反向代理 cloudflare 的 ip,并带上主机名 host 即可(当然也可以直接反向代理到 OVH 源站)。

Ngixn 站点配置

这里先给出博主的 yunloc.conf 配置,再在下面简单介绍

server
{      
    listen 80;
    server_name www.yunloc.com yunloc.com;
    return 301 https://yunloc.com$request_uri;
        location / {
            try_files $uri $uri/ =404;
        }
}  

server
{      
    listen 443 ssl http2;
    server_name yunloc.com;
    return 301 https://www.yunloc.com$request_uri;

    ssl_certificate /usr/local/nginx/conf/ssl/www.yunloc.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/www.yunloc.com.key;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";
    ssl_session_timeout 5m;
    ssl_stapling on;
    ssl_stapling_responder http://ocsp.globalsign.com/alphasslcasha256g4;
    ssl_stapling_verify on;
    ssl_trusted_certificate /usr/local/nginx/conf/ssl/ocsp.yunloc.crt;
    resolver 8.8.8.8 8.8.4.4 223.5.5.5 valid=3600s;
    resolver_timeout 2s;  
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
    ssl_buffer_size 4k;
    ssl_session_tickets off;  
    ssl_early_data on;  
    proxy_set_header Early-Data $ssl_early_data;  
        location / {
            try_files $uri $uri/ =404;
        }
    }

    server
    {      
        listen 443 ssl http2;
        server_name www.yunloc.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/yunloc.com;

        ssl_certificate /usr/local/nginx/conf/ssl/www.yunloc.com.crt;
        ssl_certificate_key /usr/local/nginx/conf/ssl/www.yunloc.com.key;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";
        ssl_session_timeout 5m;
        ssl_stapling on;
        ssl_stapling_responder http://ocsp.globalsign.com/alphasslcasha256g4;
        ssl_stapling_verify on;
        ssl_trusted_certificate /usr/local/nginx/conf/ssl/ocsp.yunloc.crt;
        resolver 8.8.8.8 8.8.4.4 223.5.5.5 valid=3600s;
        resolver_timeout 2s;  
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
        ssl_buffer_size 4k;
        ssl_session_tickets off;  
        ssl_early_data on;  
        proxy_set_header Early-Data $ssl_early_data;

        location / {
             proxy_ssl_name www.yunloc.com;
             proxy_ssl_server_name on;
             proxy_set_header Host $http_host;
             proxy_set_header X-real-ip $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_redirect off;
             proxy_pass https://1.1.1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";

             proxy_set_header Remote_Addr $remote_addr;
             proxy_set_header X-Scheme $scheme;
             proxy_set_header X-Forwarded-Scheme $scheme;
             proxy_set_header X-Forwarded-Proto $scheme;
         }
         location ~ .*\.(gif|GIF|jpg|JPG|jpeg|JPGE|png|PNG|bmp|BMP|ico|tga|imb|svg)$
         {
             expires      30d;
             access_log off;
             proxy_ssl_name www.yunloc.com;
             proxy_ssl_server_name on;
             proxy_set_header Host $http_host;
             proxy_set_header X-real-ip $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_redirect off;
             proxy_pass https://1.1.1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";

             proxy_set_header Remote_Addr $remote_addr;
             proxy_set_header X-Scheme $scheme;
             proxy_set_header X-Forwarded-Scheme $scheme;
             proxy_set_header X-Forwarded-Proto $scheme;
         }
         location ~ .*\.(ttf|tiff|txt|ttc|otf|eot|woff|woff2|font.css|css|js)?$
         {
             expires      12h;
             access_log off;
             proxy_ssl_name www.yunloc.com;
             proxy_ssl_server_name on;
             proxy_set_header Host $http_host;
             proxy_set_header X-real-ip $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_redirect off;
             proxy_pass https://1.1.1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";

             proxy_set_header Remote_Addr $remote_addr;
             proxy_set_header X-Scheme $scheme;
             proxy_set_header X-Forwarded-Scheme $scheme;
             proxy_set_header X-Forwarded-Proto $scheme;   
         }

         access_log /home/wwwlogs/yunloc.com.log access;
    }
}

上面的证书部分可参考

主要部分来了

location / {
    //这里是设置 sni 来指明我们要访问的是哪个网站,如果反代域名不一样就写主站域名,把域名改成 $host 也是可以的
    proxy_ssl_name www.yunloc.com;
    //这个很重要,如果你对 cloudflare 设置的反向代理出现了 502 的错误,大概就是没有设置这个参数
    proxy_ssl_server_name on;
    //首先设置了 Host,指明了我们要访问的是服务器上的哪个网站,因为我们反代使用的是相同的域名,所以直接用$http_host 即可,如果你用了不同的域名,那就需要手动修改成你的源站域名了
    proxy_set_header Host $http_host;
    //这个用于告诉我们的服务器访客的真实 ip,而不是反代服务器的 ip,可以参考搜索下本站文章“Nginx 使用 CDN(CloudFlare)获取网站日志真实 IP 地址”
    proxy_set_header X-real-ip $remote_addr;
    //这里是 http 请求经过的服务器的 ip,包括请求者 ip,还有中间的代理服务器(如果提供)的 ip,如果想要查看真实的 ip,这个也得加上。
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    //该指令用来修改被代理服务器返回的响应头中的 Location 头域和“refresh”头域,这里关闭重定向
    proxy_redirect off;
    //随便找个 cloudflare 的 ip 来反代即可,如果反代 OVH 原站,就写 OVH 的 IP
    proxy_pass https://1.1.1.1;
    //按 nginx 官方配置
    proxy_set_header Upgrade $http_upgrade;
    //按 nginx 官方配置
    proxy_set_header Connection "upgrade";
    //跨域配置
    proxy_set_header Remote_Addr $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header X-Forwarded-Scheme $scheme;
    proxy_set_header X-Forwarded-Proto $scheme;
}

在 HTTP 时代,解决基于名称的主机同一 ip 地址上托管多个网站的问题并不难。当一个客户端请求某特定网站时,把请求的域名作为主机头(host)放在 http header 中,从而服务器根据域名可以知道把该请求引向哪个域名服务,并把匹配的网站传送给客户端。但是此方式到 https 就失效了,因为 SSL 在握手的过程中,不会有 host 信息,所以服务端通常返回配置中的第一个可用证书,这就导致不同虚拟主机上的服务不能使用不同证书(但在实际中,证书通常是与服务对应。)。 为了解决此问题,产生了 SNI,SNI 中文名为服务器名称指示,是对 SSL/TLS 协议的扩展,允许在单个 IP 地址上承载多个 SSL 证书。SNI 的实现方式是将 HTTP 头插入到 SSL 的握手中,提交请求的 Host 信息,使得服务器能够切换到正确的域并返回相应的正确证书。

不记录日志图片

如果 nginx 日志把图片也记录在日志里那查看起来就很麻烦,这里也给出了去掉方法及把图片缓存,需要把上面的反代配置也加上,不然不会显示图片了

        location ~ .*\.(gif|GIF|jpg|JPG|jpeg|JPGE|png|PNG|bmp|BMP|ico|tga|imb|svg)$
        {
            //缓存 30 天
            expires      30d;
            //关闭日志
            access_log off;
            proxy_ssl_name www.yunloc.com;
            proxy_ssl_server_name on;
            proxy_set_header Host $http_host;
            proxy_set_header X-real-ip $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_pass https://1.1.1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_set_header Remote_Addr $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_set_header X-Forwarded-Scheme $scheme;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-11-22 00:50

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表