在中国接入互联网30周年之时,搭一台1994年的Linux服务器(二) 作者:蓬岸 Dr.Quest 编号:700820663 创建于:2024-06-03 13:30:58 修改于:2024-08-19 10:15:13 -------------------- 在网络创业资源中心(NSRC)提供的连接提供者数据库(Connectivity Provide r Database)中,保留了1994年6月1日的《中国互联网技术论坛简报》(CINET- L) (Link: https://nsrc.org/db/lookup/report.php?id=890202394613:49742 6773&fromISO=CN) ,其中中科院高能所吴玲老师撰写的《IHEP 网络发展回顾与 展望 - 引言》(Review and Prospect of IHEP Network Development - An ln troduction)一文中介绍了中国互联网开通时所提供的网络服务: In May, 1994, IHEP finally gained full access to the Internet, so that IHEP users can transfer files and connect to any of the Internet node s instead of just sending E-mail messages, and all the outside users c an ftp and telnet to IHEP directly from their internet machines.Our pe rmanent Internet email address is nowuser@machine.ihep.ac.cn (Link: ma ilto:user@machine.ihep.ac.cn) :IHEP Computing Center has set up WWW an d Gopher server.1994 年 5 月,IHEP 终于全面接入互联网,这样,IHEP 用户 就可以传输文件并连接到互联网的任何节点,而不仅仅是发送电子邮件,所有外 部用户都可以直接从他们的互联网机器上通过 ftp 和 telnet 连接到 IHEP。我 们永久性的互联网电子邮件地址现在是user@machine.ihep.ac.cn (Link: mailt o:user@machine.ihep.ac.cn) IHEP 计算中心建立了 WWW 和 Gopher 服务器。 那我们就把WWW和Gopher服务器架设起来吧! WWW服务器:CERN还是NCSA? 我们首先要回答的问题是,1994年高能所最有可能使用的Web server是那一款? 后来成为Linux标准Web技术栈的LAMP中的Apache要到1995年才发布。在《中国第 一个WWW网站诞生记 (Link: http://mp.ihep.ac.cn/article/pdf/preview/8501 ) 》中,高能所许榕生老师回忆了他1994年4月在WWW的诞生地CERN接触Web技术 并将其带回国内的经历,我们不难推测高能所很有可能使用的是CERN开发的CERN HTTPd(早期版本叫做WWW Daemon)。 但很快这个推断就被动摇了,因为佐治亚理工学院在1994年就曾经做过《第一次 万维网用户调查》(First World-Wide Web User Survey) (Link: https://si tes.cc.gatech.edu/gvu/user_surveys/papers/survey_1_paper.html) ,其中 的数据显示当时最流行的Web服务器是NCSA HTTPd,占比71.88%,第二名是Plexu s,一款由Perl编写的Web服务器,占12.73%;而CERN HTTPd仅和GN (Link: http s://man.freebsd.org/cgi/man.cgi?query=gn&manpath=Red+Hat+4.2) ,一款同 时支持Gopher和WWW的服务器软件分享7.43%的使用量: Table 4: Results from the HTTP Survey --------------------------------------------------------------------- Question 1. Yes No Total Operate HTTP Server / % 378 / 103 / 481 78.59 21.41 Question 2. GN or Cern NSCA Plexus Other Total If Yes, Which Server / % 28 / 271 / 48 / 30 / 377 7.43 71.88 12.73 7.96 因此从当时软件的流行趋势来讲,来自美国国家超级计算应用中心(NCSA)的NC SA HTTPd同样可能被运用在高能所的服务器上。 但还有没有其他证据呢?在Github上的一份《Chinese-HOWTO》文件上,我找到 了高能所曾经使用过的另一个域名,http://csun01.ihep.ac.cn (Link: http:/ /csun01.ihep.ac.cn) ,而这个域名下曾经分享了当时的一些WWW软件,其中CER N目录虽然我没法查看,但很可能是CERN HTTPd相关的文件。 Linux-HOWTOs/Chinese-HOWTO at master · kalamangga-net/Linux-HOWTOs (Li nk: https://github.com/kalamangga-net/Linux-HOWTOs/blob/master/Chinese -HOWTO) (Image: https://picx.zhimg.com/v2-b8af829962088abe904cde471f446197_720 w.jpg?source=d16d100b) 我最终还是做出了这个艰难的决定:两个都要! 从回溯万维网历史的角度讲,CERN和NCSA的HTTPd几乎同样重要:CERN HTTPd延 续自Tim Berners-Lee亲自编写的WWW Daemon,是第一个万维网服务器软件,而N CSA HTTPd则是Apache的直接前身,并占据万维网服务器市场份额第一的宝座超 过20年时间。 编译并运行CERN HTTPd 由于在这个系列的上一集我们已经安装好SoftLanding Linux System(SLS)并 连接上TCP/IP网络,所以这一集我们大多数的操作通过Telnet进行,你可以选用 自己习惯的终端仿真软件,我的参考配置是Windows 10上的Putty。 蓬岸 Dr.Quest:在中国接入互联网30周年之时,搭一台1994年的Linux服务器( 上) (Link: https://zhuanlan.zhihu.com/p/700400046) 为SLS安装Linux内核 源码 编译CERN HTTPd之前,我们先要为它安装Linux内核源码,不然就会因为无法引 入某些Linux头文件而失败。 在SLS的默认安装中,/usr/include/linux是一个指向/usr/src/linux/include/ linux/的软链接 p:softland:/usr/include$ ls -l linux lrwxrwxrwx 1 root root 26 May 30 1924 linux -> ../src /linux/include/linux/ 而如果没有安装Linux源码,/usr/src/linux目录也就不会出现,因此就会编译 出错。而解决的办法,就是手工安装SLS安装盘中所提供的Linux内核源码。 SLS安装盘中,编号为“s1”的软盘中包含的“lxsrc.tgz”就是Linux内核源代码包 ,而SLS提供一个没有依赖检查的包安装命令“sysinstall”,我们可以用它将lxs rc.tgz安装到系统中,而不用担心目录结构的问题。 #挂载第二块硬盘(安装文件所在位置,见上集)到/mnt mount -t msdos /dev/hdb1 /mnt #进入安装盘s1目录 cd /mnt/install/s1/ #安装内核源码包 sysinstall -install lxsrc.tgz 编译CERN HTTPd 在W3C网站上,保留了许多旧版本CERN HTTPd的源码:Index of /Daemon/old/Di st (Link: https://www.w3.org/Daemon/old/Dist/) ,我自己使用下来,决定 用1994年3月的CERN HTTPd 2.16做演示,在这个版本中,和CERN HTTPd一同编译 的还有著名的WWW Line Mode Browser,而在2.17之后的版本中,则需要手工在W WW/All/Implementation/Makefile中取恢复被注释掉的LineMode Browser部分才 可以使用LineMode Browser。 我们使用FTP上传,或是利用上一集中提到的DOS格式的第二块硬盘做中转站,将 cern_httpd_2.16beta.tar.Z复制到SLS系统中,我自己一般使用/root目录,利 用tar zxvf命令解压,就会得到WWW目录,内容如下: All/ Copyright.txt Library/ Makefile BUILD* Daemon/ LineMode/ README.txt 其中的BUILD脚本就是CERN HTTPd的编译脚本了,但如果我们直接运行它,会提 示找不到文件,原因是该脚本是csh脚本,而SLS提供的是与之兼容的tcsh,我们 需要建立一个软链接,让/bin/csh调用tcsh。此外,BUILD脚本由于不能识别Lin ux系统,需要单独设置WWW_MACH为“unix” #链接csh命令 ln -s /bin/tcsh /bin/csh #设置环境变量 export WWW_MACH=unix 之后BUILD脚本就可以正常编译了,之后我们进入WWW/Daemon/unix,就会看到下 面这些文件 cgiparse -> cgiparse_2.16beta* cgiparse_2.16beta* htadm -> htadm_2.16beta* htadm_2.16beta* htimage -> htimage_2.16beta* htimage_2.16beta* httpd -> httpd_2.16beta* httpd_2.16beta* 其中httpd就是HTTP服务器的主文件了,我们先用命令行启动一个简单的HTTPd httpd -v -dy /root/ -p 80 命令中v参数是啰嗦(verbose)模式,我们能看到更详细的信息,而“dy”则是允 许访问目录结构,“p”参数则指定端口,详细的命令行参数,可以在CERN Server User Guide (Link: https://www.w3.org/Daemon/old/UserGuide_2.16/Guide. html) 中的 Administration → Command line options。在当代浏览器中输入 http://,就可以查看到/root目录中的内容。 首页和配置文件 我们可以参照CERN手册中的例子创建一个最简单的配置文件 Examples of CERN httpd configuration (rule) files (Link: https://www.w3.org/Daemon/old/ UserGuide_2.16/RuleExamples.html) Pass / file:/root/myhttphome/welcome.html Pass /* file:/root/myhttphome/* Fail * 在这个例子里,我们把首页设置为/root/myhttphome/welcome.html,并允许访 问/root/myhttphome/下的其他文件。我们在welcome.html里可以随意编写一些 内容,当时的HTML格式比较松散,文件头都不是必要的 This is my first page

Welcome to the CERN HTTPd on SLS

This is a real 1994 style web server!

接下来我们用“-r”参数启动CERN HTTPd,并调用配置文件 httpd -r httpd.conf -v -p 80 然后就它就可以以今天的HTTP服务器类似的方式提供网页了 (Image: https://picx.zhimg.com/v2-0dc024dca1332f728e4ce809d4e3a45e_720 w.jpg?source=d16d100b) 体验Line Mode Browser 在万维网发明之初,图形化的浏览器只在NeXTSTEP平台上可用,而第一个跨平台 并被广泛使用的浏览器,是Line Mode Browser“行模式浏览器”,顾名思义,它 是供逐行显示字符的文本终端准备的。2013年,CERN的团队在网页里还原了Line Mode Browser的部分体验:Line Mode Browser 2013 (Link: https://line-mo de.cern.ch/) 。而现在,我们有一个真正的Line Mode Browser,如果你也有一 台哑终端,那就再好不过了! [哑终端]实达中英文网络终端NT1100连接树莓派_哔哩哔哩_bilibili (Link: ht tps://www.bilibili.com/video/BV1hK4y1t7qb/) 编译好的Line Mode Browser 在WWW/LineMode/unix目录里,我们可以把它的可执行文件和软链接都复制到usr /bin/里,这样不用超级用户权限也可以使用它了 cd /root/WWW/LineMode/unix cp www_2.12 /usr/bin/ cp www /usr/bin/ 然后我们可以试着访问以下本机上的HTTPd,使用 www http://127.0.0.1 命令 即可 (Image: https://picx.zhimg.com/v2-c131807e7fe55be721953ee04902f1b8_720 w.jpg?source=d16d100b) 由于我们刚才创建的主页没有超链接,所以显示完内容立刻就会退出了,因为Li ne Mode Browser只能支持HTTP/1.0,目前在互联网上的大多数服务器都至少要 求HTTP/1.1,因此无法访问许多网站,体验它最好的办法是在现代电脑上搭建一 台HTTP/0.9服务器:GitHub - remy/old-servers: Replicate old HTTP server functionality (Link: https://github.com/remy/old-servers) 之后就可以用 www <运行old-server的机器地址> 通过LineMode Browser访问了 (Image: https://picx.zhimg.com/v2-9a275e6b8f49612a3676f71c5dca51c1_720 w.jpg?source=d16d100b) 这是世界上第一个网页在许多Unix设备上被访问的样子编译并运行NCSA HTTPd NCSA HTTPd的早期版本目前已经不太容易找到,幸运的是在Slackware 2.1的源 代码目录中,我们可以找到NCSA HTTPd 1.3的源代码,时间为1994年5月7日,略 晚于高能所开通WWW服务的时间几个星期,但并不影响其反应当时WWW技术的发展 情况 Index of /slackware/slackware-2.1/source/contrib/httpd (Link: https:// mirrors.slackware.com/slackware/slackware-2.1/source/contrib/httpd/) 我们将httpd_source.tar.gz上传到SLS,解压后会得到httpd_1.3目录,内容是 这样 README cgi-bin/ cgi-src/ conf/ icons/ logs/ src/ support/ 其中与编译有关的只有src文件夹,我们需要略微修改Make文件,让它能够在Lin ux下编译 #进入src文件夹 cd httpd_1.3/src #修改Makefile vi Makefile 找到下面的代码,我们看到这里有一系列针对不同系统的编译标志,默认的平台 是SunOS 4,我们要改成Linux,把AUX_CFLAGS= -DSUNOS4一行前面加上“#”让其 失效,然后把AUX_CFLAGS= -DLINUX一行前面的#删去即可 # For SunOS 4 AUX_CFLAGS= -DSUNOS4 # For Solaris 2. NOTE: Lots of problems have been identified with comp iling # httpd under Solaris. Use with caution. If you see aberrant behavior with # httpd under Solaris 2, please mail us. #AUX_CFLAGS= -DSOLARIS2 #EXTRA_LIBS= -lsocket -lnsl # For SGI IRIX. Use the EXTRA_LIBS line if you're using NIS and want # user-supported directories #AUX_CFLAGS= -DIRIX #EXTRA_LIBS= -lsun # For HP-UX #AUX_CFLAGS= -DHPUX # For AIX #AUX_CFLAGS= -DAIX -U__STR__ # For Ultrix #AUX_CFLAGS= -DULTRIX # For DEC OSF/1 #AUX_CFLAGS= -DOSF1 # For NeXT #AUX_CFLAGS= -DNEXT # For Sequent #AUX_CFLAGS= -DSEQUENT # For Linux -m486 ONLY IF YOU HAVE 486 BINARY SUPPORT IN KERNEL #AUX_CFLAGS= -DLINUX 之后使用make命令开始编译,完成后就会得到httpd可执行文件。然后进入httpd _1.3/support目录,再make编译几个支持文件,编译就完成了 cd ../support make 创建NCSA HTTPd工作目录 NCSA HTTPd的默认工作目录是/usr/local/etc/httpd,但在SLS里却默认没有/us r/local目录,而是在跟目录下直接添加了/userlocal目录,按照SLS开发者的说 法,是为了额外的灵活性 For added flexibility, /usr/local has been left empty, so that locally installed packages can be maintained separately from the SLS distribut ion.为了增加灵活性,/usr/local 留空,以便本地安装的软件包可以与 SLS 发 行版分开维护。我们可以创建整个文件夹结构,然后把整个httpd_1.3目录复制 过去 mkdir -p /usr/local/etc/httpd cp -r /root/httpd_1.3/* /usr/local/etc/httpd/ 虽然NCSA HTTPd支持使用-d参数自定义配置目录,-f参数自定义配置文件,但可 通过命令行控制的也就仅限于这两项了,创建配置目录的话可以减少后续的工作 。 关于NCSA HTTPd的完整文档,可参考 NCSA httpd Overview (Link: https://ww w6.uniovi.es/~antonio/ncsa_httpd/Overview.html) ,链接提供的是1.4版, 和1.3版的配置文件基本相同。 编辑NCSA HTTPd配置文件 NCSA HTTPd的配置文件默认在 /usr/local/etc/httpd/conf里,有access.conf- dist、httpd.conf-dist和srm.conf-dist三个配置模板文件,我们先复制它们, 创建对应的三个配置文件,然后进行小改动即可。 此外,NCSA HTTPd需要一个额外的用户来运行,我们新建一个名为“www”的用户 cd /usr/local/etc/httpd/conf cp httpd.conf-dist httpd.conf cp srm.conf-dist srm.conf cp access.conf-dist access.conf #创建www用户 useradd www 修改httpd.conf 将User的配置从nobody改为www将ServerName改为SLS机器的主机名修改srm.conf ,让它使用我们刚才为CERN HTTPd创建的主页。 将DocumentRoot的配置改为/root/myhttphome将DitectoryIndex改为welcome.ht ml然后我们就运行刚才编译的httpd文件,应该在/usr/local/etc/httpd/src里 cd /usr/local/etc/httpd/src httpd NCSA HTTPd就可以启动了。 编译并运行Gopher 在互联网档案馆里,可以找到一系列旧版的Gopher服务器和客户端源码 https:/ /archive.org/details/OldGopherSources (Link: https://archive.org/detai ls/OldGopherSources) 我们以gopher2.012.tar.Z版本为基础编译和配置,这个版本的代码完成于1994 年3月,接近高能所服务器设立的时间。我们用tar zxvf命令将其解压,就可以 得到gopher2.012目录,但是目前的压缩包里包含了一些已经编译的文件和修改 过的配置,我们需要将其还原之后再编译。 cd gopher2.012 #使用原始的Makefile.config替换修改过的版本 cp Makefile.config.org Makefile.config #清理已编译的文档 make clean #编译gopher make 然后我们需要创建/usr/local/etc/gopherd.conf作为配置文件,其中只有一行 :hostalias: 192.168.1.29 对应主机的IP地址 echo "hostalias: 192.168.1.29" > /usr/local/etc/gopherd.conf 接下来我们就还需要创建Gopher服务目录,我们在/root 下创建gopher-data目 录,然后创建两个子目录hello和world,然后分别创建两个纯文本文件story1和 story2,这样形成一个基本的Gopher目录结构。 #创建Gopher根目录 mkdir /root/gopher-data cd /root/gopher-data #创建两个Gopher类目 mkdir hello mkdir world #创建两个文本文件 echo "this is story1" > hello/story1 echo "this is story2" > world/story2 然后一个基础的Gopher目录就准备好了,我们回到刚才编译的gopher2.012目录 中,其中的内容大概如下 p:softland:~/gopher2.012$ ls Copyright README gophfilt/ MANIFEST conf.h make.com Makefile conf.h.org object/ Makefile.config doc/ patchlevel.h Makefile.config.dist gopher/ test/ Makefile.config.org gopherd/ gopher/目录包含Gopher客户端,而gopherd/则是服务器,我们先将服务器启动 起来,gopherd命令的格式为gopherd <目录> <端口> cd gopherd gopherd /root/gopher-data 70 这样我们就将Gopher服务器运行起来了,然后就可以运行Gopher客户端来查看本 机的服务器了 cd .. cd gopher gopher 127.0.0.1 然后就可以浏览我们刚才创建的Gopher目录了 (Image: https://picx.zhimg.com/v2-60080b99d63b6181ef7a4cc59e0e746b_720 w.jpg?source=d16d100b) 值得一提的是,在过去30年里Gopher协议的变化要比WWW少得多,因此我们刚刚 编译完成的Gopher客户端也可以访问像http://gopher.floodgap.com (Link: ht tp://gopher.floodgap.com) 和http://sdf.org (Link: http://sdf.org) 这样 仍在活跃的Gopher站点。 (Image: https://picx.zhimg.com/v2-148b40eb06c5774758336113aa584281_720 w.jpg?source=d16d100b) 关于Windows telnet的小提示:当使用某些终端仿真程序,比如Windows版本的T elnet连接Linux时,这个版本的Gopher客户端会报错“I don't understand your terminal type”,此时需要手动设置TERM环境变量,如 export TERM=vt100, 之后就可以正常使用了。 下集预告 这一集里我们配置完成了WWW服务器和Gopher服务器,并且也有机会以几乎是最 原始的方式提供并访问这两种最重要的Internet信息服务。至此,我们“搭一台1 994年的Linux服务器”的目标也基本完成了。这个系列的最后一集,将聚焦于略 微超出服务器功能范围,但对于爱好者来说同样重要的部分:配置X-Window环境 ,运行图形化的Mosaic浏览器,以及让它在最近热门的复古硬件:Pocket 386上 运行起来。