在技术探索的道路上,每一次新的实践都是一次成长与突破。这次,让我们一同走进 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