• 搜索
  • 夜间模式
    ©2012-2026  陈十一的小破站 Theme by OneBlog

    陈十一的小破站博客

    搜索
    标签
    # Nodejs # CentOS # Git # Golang # Docker # Windows # Nginx # 反向代理 # 脚本 # Linux
  • 首页>
  • 技术>
  • 正文
  • 记一次Github镜像站搭建

    2024年04月04日 2.3 k 阅读 0 评论 6962 字

    在技术探索的道路上,每一次新的实践都是一次成长与突破。这次,让我们一同走进 Github 镜像站搭建的奇妙之旅,见证从无到有的过程。接下来,我将毫无保留地为您分享这次搭建中所经历的挑战、收获的经验以及最终的成果。

    起因:

    迫于github在国内日常打不开,以及我刚好有一台吃灰的香港vps,所以我决定自己建一个Github的镜像站。

    虽然我日常开全局,几乎无缝访问Github,但是有时候需要在别人电脑上使用Github,所以建一个镜像站还是有必要的。

    所以镜像站点搭建的前置条件是:

    一个能访问原站点的vps

    一个域名

    请求分析

    建镜像站之前,我们首先要分析一下github的请求,这种大型网站的资源肯定是单独存放的,所以我们需要镜像的域名肯定不止一个。

    打开开发者工具,访问github首页,在网络选项卡中可以看到加载的所有请求,我们可以一个一个查看域名,然后把不同的域名记下来就好了

    当然,还有更快捷的方法,直接切换到源代码选项卡,忽略浏览器扩展加载的文件,其他的便是我们需要镜像的域名

    分析,一共请求了三个域名的资源

    github.com

    github.githubassets.com

    avatars.githubusercontent.com

    当然,这还只是首页请求的资源,其实另外还有几个资源域名,如githun的查看源文件的域名raw.githubusercontent.com

    但是,我们不一定需要镜像所有域名,因为有些域名并没有被墙 [doge]

    我这里直接说结论,github被墙的域名只有下面两个罢

    github.com

    raw.githubusercontent.com

    镜像过程

    添加域名解析

    域名添加解析我就不多说了,我这边使用cloudflare管理域名,直接在cf添加A记录解析ip到vps即可,需要镜像几个域名就添加几条记录,当然你也可以添加泛解析

    nginx反代
    说是镜像,其实就是利用了nginx的反代功能,

    我这边图个方便直接装了宝塔面板

    在宝塔面板里添加站点,域名填刚刚解析的域名,因为需要反代不同的站点,所以每个域名需要单独建一个站点。(github.com和raw.githubusercontent.com)

    添加完成之后点开设置,在反向代理选项卡中添加反向代理,将每个站点分别反代到不同的域名。

    注意目标url那里需要用https://,另外还需要添加一个内容替换,把github.com替换为自己反代的域名,把github的资源请求也指向镜像站

    添加完成之后打开我们的镜像站,如果顺利的话,恭喜你,一个可以clone镜像站已经搭建完成了

    随便打开一个项目,你会发现替换生效了,clone地址变成了你镜像的地址,而且这个地址是可用的,我就不演示了

    clone镜像是搞定了,但是网页还是存在一些问题,随便点开项目中的一个文件,你会发现加载不出来,并且控制台报错了

    这是由于github采用了pjax,然后pjax的地址并没有被替换成镜像地址导致的,我们可以通过nginx的配置来解决

    回到宝塔面板,打开反向代理配置文件(站点设置-反向代理-配置文件)

    将下面两行加入配置文件

    #解决pjax问题
    proxy_hide_header x-pjax-url;
    add_header x-pjax-url "https://7mm.top$request_uri";

    现在pjax就没有问题了,可以随意打开项目文件了,至此镜像站已经完成了

    等等,好像忘了什么,点开一个项目文件,再点击raw,你会发现访问不了

    最后一步,我们来搭建raw的镜像

    还是建立站点、添加反代

    现在访问raw镜像站会跳转到github首页,

    我们随便找个raw地址,将url中的raw.githubusercontent.com替换为镜像地址

    现在将我们github镜像站的raw只想我们的raw镜像站

    修改github镜像站的反代设置,添加一个内容替换

    将//raw.githubassets.com替换为我们的raw镜像站

    再打开反代配置文件,添加一行

    add_header x-pjax-url "https://这是你的Github镜像URL地址$request_uri";

    至此,镜像站点的搭建已经完成,enjoy~

    总结

    github.com镜像nginx配置文件

    server
    {
        listen 80;
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
        listen [::]:80;
        server_name github.nouz.cn;
        index index.php index.html index.htm default.php default.htm default.html;
        root /www/wwwroot/github.nouz.cn;
        #CERT-APPLY-CHECK--START
        # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
        include /www/server/panel/vhost/nginx/well-known/github.nouz.cn.conf;
        #CERT-APPLY-CHECK--END
    
        #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
        #error_page 404/404.html;
        #HTTP_TO_HTTPS_START
        if ($server_port !~ 443){
            rewrite ^(/.*)$ https://$host$1 permanent;
        }
        #HTTP_TO_HTTPS_END
        ssl_certificate    /www/server/panel/vhost/cert/github.nouz.cn/fullchain.pem;
        ssl_certificate_key    /www/server/panel/vhost/cert/github.nouz.cn/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        add_header Strict-Transport-Security "max-age=31536000";
        error_page 497  https://$host$request_uri;
    
        #SSL-END
    
        location ~ /purge(/.*) {
            proxy_cache_purge cache_one $host$1$is_args$args;
        }
        #反代配置
        location ^~ / {
            proxy_pass https://github.com;
            proxy_set_header Host github.com;
            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;
            add_header X-Cache $upstream_cache_status;
            #Set Nginx Cache
    
            #解决pjax问题
            proxy_hide_header x-pjax-url;
            add_header x-pjax-url "https://github.nouz.cn$request_uri";
    
            #raw替换
            proxy_redirect https://raw.githubusercontent.com https://raw.github.nouz.cn;
    
            proxy_set_header Accept-Encoding "";
    
            sub_filter_once off;
    
            sub_filter "//github.com" "//github.nouz.cn";
            sub_filter "//raw.githubassets.com" "//raw.github.nouz.cn";
    
            set $static_filexskBQvHR 0;
            if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) {
                set $static_filexskBQvHR 1;
                expires 12h;
            }
            if ( $static_filexskBQvHR = 0 ) {
                add_header Cache-Control no-cache;
            }
        }
    
        access_log  /www/wwwlogs/github.nouz.cn.log;
        error_log  /www/wwwlogs/github.nouz.cn.error.log;
    }

    raw.githubusercontent镜像nginx配置

    server
    {
        listen 80;
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
        listen [::]:80;
        server_name raw.github.nouz.cn;
        index index.php index.html index.htm default.php default.htm default.html;
        root /www/wwwroot/raw.github.nouz.cn;
        #CERT-APPLY-CHECK--START
        # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
        include /www/server/panel/vhost/nginx/well-known/raw.github.nouz.cn.conf;
        #CERT-APPLY-CHECK--END
    
        #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
        #error_page 404/404.html;
        #HTTP_TO_HTTPS_START
        if ($server_port !~ 443){
            rewrite ^(/.*)$ https://$host$1 permanent;
        }
        #HTTP_TO_HTTPS_END
        ssl_certificate    /www/server/panel/vhost/cert/raw.github.nouz.cn/fullchain.pem;
        ssl_certificate_key    /www/server/panel/vhost/cert/raw.github.nouz.cn/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        add_header Strict-Transport-Security "max-age=31536000";
        error_page 497  https://$host$request_uri;
    
        #SSL-END
    
        location ~ /purge(/.*) {
            proxy_cache_purge cache_one $host$1$is_args$args;
        }
        #PROXY-START/
    
        #raw反代配置
        location ^~ / {
            proxy_pass https://raw.githubusercontent.com;
            proxy_set_header Host raw.githubusercontent.com;
            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;
    
            add_header X-Cache $upstream_cache_status;
    
            #proxy_hide_header content-security-policy;
            #proxy_hide_header Strict-Transport-Security;
            #proxy_hide_header set-cookie;
            #proxy_hide_header x-pjax-url;
    
            #Set Nginx Cache
            set $static_fileHDokVEBC 0;
            if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) {
                set $static_fileHDokVEBC 1;
                expires 12h;
            }
            if ( $static_fileHDokVEBC = 0 ) {
                add_header Cache-Control no-cache;
            }
        }
    
        #PROXY-END/
    
        access_log  /www/wwwlogs/raw.github.nouz.cn.log;
        error_log  /www/wwwlogs/raw.github.nouz.cn.error.log;
    }

    白嫖我的成品:github.nouz.cn

    本文著作权归作者 [ 陈十一 ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    反向代理NginxGithubCDN
    — END —
    Copyright©2012-2026  All Rights Reserved.  Load:0.014 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。