作者:蓬岸 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服务器架设起来吧!
我们首先要回答的问题是,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》文件上,我找到了高能所曾经使用过的另一个域名,http://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年时间。
由于在这个系列的上一集我们已经安装好SoftLanding Linux System(SLS)并连接上TCP/IP网络,所以这一集我们大多数的操作通过Telnet进行,你可以选用自己习惯的终端仿真软件,我的参考配置是Windows 10上的Putty。
蓬岸 Dr.Quest:在中国接入互联网30周年之时,搭一台1994年的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
在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服务器类似的方式提供网页了
在万维网发明之初,图形化的浏览器只在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访问了
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的默认工作目录是/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的配置文件默认在 /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服务器和客户端源码 https://archive.org/details/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目录了
值得一提的是,在过去30年里Gopher协议的变化要比WWW少得多,因此我们刚刚编译完成的Gopher客户端也可以访问像http://gopher.floodgap.com和http://sdf.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上运行起来。