国内开发者的网络超时日常

作为国内的互联网从业者,或许大家多少都经历过一些莫名其妙的网络问题。而笔者经常审计各种语言代码,对于这些问题也就接触得更多。不巧最近刚刚更换电脑,把这些问题又重新踩了一遍,因此决定系统记录下来,以便后来的同僚能少走一些弯路。

注意,根据《中华人民共和国计算机信息网络国际联网管理暂行规定》,任何单位和个人不得自行建立或者使用其他信道进行国际联网,因此本文尽可能在不违反法律的情况下使用镜像站解决上述网络问题。对于依旧解决不了的,可以酌情考虑换个行业。

开源镜像站

所谓开源镜像站,就是在原站点访问太慢或者无法访问时提供一个备用的镜像功能,通常用于企业环境指向内网的私有镜像站制品仓库。当然,在国内个人开发者的使用场景更多是用于网络加速。一些常用的开源镜像站点主页如下:

一般镜像站中除了镜像本身,还附带了比较整洁的文档或者说明,其中 TUNA 镜像站的文档是笔者认为写得最好的,可以参考其文档并根据自身网络环境选择合适的镜像源。

更详细的镜像站汇总,可以参考:

其中各个站点的索引的软件都不太一样,比如  山东女子学院开源软件镜像站 中还可以下载 java 的二进制文件。因此如果在某个镜像站找不到你所需的软件源,可以换几个镜像站找找,说不定能有所收获。

其他:

包管理器

我们先从简单的说起。在全新安装好操作系统时,第一步要准备的自然是包管理工具。这类工具有很多,只选几个典型作为记录,即 Debian/Ubuntu Linux 系的 apt-get 以及 macOS 下的 Homebrew

一般我们配置 apt 镜像的时候会上百度随便搜 “ubuntu 国内源”,然后进入到某个 CSDN 的文章,把里面的源复制一下,粘贴到系统的 /etc/apt/sources.list 中。这样确实能解决问题,不过对于新手而言可能会不小心复制错源,比如将 ubuntu 18.04 (bionic) 的源复制到了自己的 ubuntu 22.04 (jammy) 系统中,导致更新出错。因此更好的方法是直接到上面的开源镜像站中查找对应的源。

扯句题外话,apt 源的格式一般如下:

text

deb [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]
deb-src [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]

其中只有 uri 和 suite 是必填的,其他都是可选的,比如我们经常复制下来的形式是:

text

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse

suite 代表系统的 codename,component 则表示启用的组件,从请求来看,它们一起组合成了完整的 URL 路径 <uri>/dists/<suite>/<component>,例如:

text

https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/jammy/main

那么我们怎么知道应该使用哪些 component 呢?一般来说,

  • main 表示发行版官方支持开源软件版;
  • restricted 表示官方支持但不是完全 License free 的软件包;
  • universe 表示社区维护的软件,但非官方支持;
  • multiverse 表示非自由软件,比如 NVIDIA 的驱动;

不过我们无需记住所有的源,只需要把原始 sources.list 中的 URI 替换即可。值得注意的是有的文章中使用 sed 去替换,比如替换成阿里云的源:

sh

sed -ibak "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list

这需要注意 URI 的路径,以及针对安全更新使用的 URI 通常是其他子域名,如: http://security.ubuntu.com/ubuntu/ ,因此更为稳妥的方式还是进行手动替换。

参考:

如果你用的是 macOS 系统,那么很可能会用到 Homebrew。该包管理工具与 apt 不同,并不是系统自带的,需要手动安装。官网的安装介绍就一句话:

sh

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

如果网络不好,很可能会收获一个 curl: (28) SSL connection timeout。此时还是参考 TUNA 中的文档,从镜像源中获取 install.sh 进行安装:

sh