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

前言

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

图片[1] - #教程# – Nginx 反代同域名/可IP配置CloudFlare及本地IP,反代跨域配置 - 云线路

操作介绍

大致说一下我的操作思路,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;
        }

结语

关于 route53 的分线路解析和宕机切换等有时间会写篇文章介绍下,有神马问题可以在下面评论区留言。

© 本站文章随意转载,但请注明出处!
本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
Nginx 反代同域名/可IP配置CloudFlare及本地IP,反代跨域配置
前言 前段时间博主购买了几台 OVH/$0.97/月的机器,除了作为备用网站还有几台多余,就想着找个腾讯云 HK 的机器反代把 OVH 机器利用起来,万一前台 HK 机器被……
<<上一篇
下一篇>>