在中国接入互联网30周年之时,搭一台1994年的Linux服务器(中)

作者:蓬岸 Dr.Quest
知乎文章编号:700820663
创建于:2024-06-02 10:30:58
修改于:2024-06-02 10:30:58


在网络创业资源中心(NSRC)提供的连接提供者数据库(Connectivity Provider Database)中,保留了1994年6月1日的《中国互联网技术论坛简报》(CINET-L),其中中科院高能所吴玲老师撰写的《IHEP 网络发展回顾与展望 - 引言》(Review and Prospect of IHEP Network Development - An lntroduction)一文中介绍了中国互联网开通时所提供的网络服务:

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 nodes instead of just sending E-mail messages, and all the outside users can ftp and telnet to IHEP directly from their internet machines.

Our permanent Internet email address is now
user@machine.ihep.ac.cn:

IHEP Computing Center has set up WWW and Gopher server.

1994 年 5 月,IHEP 终于全面接入互联网,这样,IHEP 用户就可以传输文件并连接到互联网的任何节点,而不仅仅是发送电子邮件,所有外部用户都可以直接从他们的互联网机器上通过 ftp 和 telnet 连接到 IHEP。

我们永久性的互联网电子邮件地址现在是
user@machine.ihep.ac.cn

IHEP 计算中心建立了 WWW 和 Gopher 服务器。

那我们就把WWW和Gopher服务器架设起来吧!

WWW服务器:CERN还是NCSA?

我们首先要回答的问题是,1994年高能所最有可能使用的Web server是那一款?后来成为Linux标准Web技术栈的LAMP中的Apache要到1995年才发布。在《中国第一个WWW网站诞生记》中,高能所许榕生老师回忆了他1994年4月在WWW的诞生地CERN接触Web技术并将其带回国内的经历,我们不难推测高能所很有可能使用的是CERN开发的CERN HTTPd(早期版本叫做WWW Daemon)。

但很快这个推断就被动摇了,因为佐治亚理工学院在1994年就曾经做过《第一次万维网用户调查》(First World-Wide Web User Survey),其中的数据显示当时最流行的Web服务器是NCSA HTTPd,占比71.88%,第二名是Plexus,一款由Perl编写的Web服务器,占12.73%;而CERN HTTPd仅和GN,一款同时支持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)的NCSA HTTPd同样可能被运用在高能所的服务器上。

但还有没有其他证据呢?在Github上的一份《Chinese-HOWTO》文件上,我找到了高能所曾经使用过的另一个域名,csun01.ihep.ac.cn,而这个域名下曾经分享了当时的一些WWW软件,其中CERN目录虽然我没法查看,但很可能是CERN HTTPd相关的文件。

Linux-HOWTOs/Chinese-HOWTO at master · kalamangga-net/Linux-HOWTOs

我最终还是做出了这个艰难的决定:两个都要!

从回溯万维网历史的角度讲,CERN和NCSA的HTTPd几乎同样重要:CERN HTTPd延续自Tim Berners-Lee亲自编写的WWW Daemon,是第一个万维网服务器软件,而NCSA HTTPd则是Apache的直接前身,并占据万维网服务器市场份额第一的宝座超过20年时间。

编译并运行CERN HTTPd

由于在这个系列的上一集我们已经安装好SoftLanding Linux System(SLS)并连接上TCP/IP网络,所以这一集我们大多数的操作通过Telnet进行,你可以选用自己习惯的终端仿真软件,我的参考配置是Windows 10上的Putty。

蓬岸 Dr.Quest:在中国接入互联网30周年之时,搭一台1994年的Linux服务器(上)

为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”,我们可以用它将lxsrc.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/Dist,我自己使用下来,决定用1994年3月的CERN HTTPd 2.16做演示,在这个版本中,和CERN HTTPd一同编译的还有著名的WWW Line Mode Browser,而在2.17之后的版本中,则需要手工在WWW/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脚本由于不能识别Linux系统,需要单独设置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 中的 Administration → Command line options。在当代浏览器中输入 http://<SLS的IP地址>,就可以查看到/root目录中的内容。

首页和配置文件

我们可以参照CERN手册中的例子创建一个最简单的配置文件 Examples of CERN httpd configuration (rule) files

Pass    /          file:/root/myhttphome/welcome.html
Pass    /*         file:/root/myhttphome/*
Fail    *

在这个例子里,我们把首页设置为/root/myhttphome/welcome.html,并允许访问/root/myhttphome/下的其他文件。我们在welcome.html里可以随意编写一些内容,当时的HTML格式比较松散,<html>文件头都不是必要的

<title>This is my first page</title>
<h1>Welcome to the CERN HTTPd on SLS</H1>
<p>This is a real 1994 style web server!</p>

接下来我们用“-r”参数启动CERN HTTPd,并调用配置文件

httpd -r httpd.conf -v -p 80

然后就它就可以以今天的HTTP服务器类似的方式提供网页了

体验Line Mode Browser

在万维网发明之初,图形化的浏览器只在NeXTSTEP平台上可用,而第一个跨平台并被广泛使用的浏览器,是Line Mode Browser“行模式浏览器”,顾名思义,它是供逐行显示字符的文本终端准备的。2013年,CERN的团队在网页里还原了Line Mode Browser的部分体验:Line Mode Browser 2013。而现在,我们有一个真正的Line Mode Browser,如果你也有一台哑终端,那就再好不过了!

[哑终端]实达中英文网络终端NT1100连接树莓派_哔哩哔哩_bilibili

编译好的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 命令即可

由于我们刚才创建的主页没有超链接,所以显示完内容立刻就会退出了,因为Line Mode Browser只能支持HTTP/1.0,目前在互联网上的大多数服务器都至少要求HTTP/1.1,因此无法访问许多网站,体验它最好的办法是在现代电脑上搭建一台HTTP/0.9服务器:GitHub - remy/old-servers: Replicate old HTTP server functionality

之后就可以用 www <运行old-server的机器地址> 通过LineMode Browser访问了

这是世界上第一个网页在许多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

我们将httpd_source.tar.gz上传到SLS,解压后会得到httpd_1.3目录,内容是这样

README    cgi-bin/  cgi-src/  conf/     icons/    logs/     src/      support/

其中与编译有关的只有src文件夹,我们需要略微修改Make文件,让它能够在Linux下编译

#进入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 compiling
# 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里却默认没有/usr/local目录,而是在跟目录下直接添加了/userlocal目录,按照SLS开发者的说法,是为了额外的灵活性

For added flexibility, /usr/local has been left empty, so that locally
installed packages can be maintained separately from the SLS distribution.
为了增加灵活性,/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 ,链接提供的是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

修改srm.conf,让它使用我们刚才为CERN HTTPd创建的主页。

然后我们就运行刚才编译的httpd文件,应该在/usr/local/etc/httpd/src里

cd /usr/local/etc/httpd/src
httpd

NCSA HTTPd就可以启动了。

编译并运行Gopher

在互联网档案馆里,可以找到一系列旧版的Gopher服务器和客户端源码 archive.org/details/Old

我们以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目录了

值得一提的是,在过去30年里Gopher协议的变化要比WWW少得多,因此我们刚刚编译完成的Gopher客户端也可以访问像gopher.floodgap.comsdf.org这样仍在活跃的Gopher站点。

关于Windows telnet的小提示:当使用某些终端仿真程序,比如Windows版本的Telnet连接Linux时,这个版本的Gopher客户端会报错“I don't understand your terminal type”,此时需要手动设置TERM环境变量,如 export TERM=vt100,之后就可以正常使用了。

下集预告

这一集里我们配置完成了WWW服务器和Gopher服务器,并且也有机会以几乎是最原始的方式提供并访问这两种最重要的Internet信息服务。至此,我们“搭一台1994年的Linux服务器”的目标也基本完成了。这个系列的最后一集,将聚焦于略微超出服务器功能范围,但对于爱好者来说同样重要的部分:配置X-Window环境,运行图形化的Mosaic浏览器,以及让它在最近热门的复古硬件:Pocket 386上运行起来。