新聞組和郵件列表里、在計算機科學實驗室里、在各大陸之間,流傳著一個神秘的故事,那是關于 Perl 與動態網站之間的不得不說的往事。 -- Michael Stevenson
本文導航
-CGI 腳本和信息軟件 …… 11%
-題外話 …… 26%
-回到 Perl HTTPD …… 54%
-歷史展望 …… 87%
編譯自: https://opensource.com/life/16/11/perl-and-birth-dynamic-web作者: Michael Stevenson
譯者: wcnnbdk1
在新聞組和郵件列表里、在計算機科學實驗室里、在各大陸之間,流傳著一個神秘的故事,那是關于 Perl 與動態網站之間的不得不說的往事。
早期互聯網歷史中,有一些膾炙人口的開創性事件:如蒂姆·伯納斯·李Tim Berners-Lee在郵件組上宣布[1] WWW-project 的那天,該文檔隨同 CERN[2] 發布的項目代碼進入到了公共域,以及 1993 年 1 月的第一版 NCSA Mosaic 瀏覽器[3]。雖然這些獨立的事件是相當重要的,但是當時的技術的開發已經更為豐富,不再是由一組的孤立事件組成,而更像是一系列有內在聯系的故事。
這其中的一個故事描述的是網站是如何變成動態的,通俗說來就是我們如何使服務器除了提供靜態 HTML 文檔之外做更多的事。這是個流傳在新聞組[4]和郵件列表間、計算機科學實驗室里、各個大陸之間的故事,重點不是一個人,而是一種編程語言:Perl。
在上世紀 90 年代中后期,Perl 幾乎和動態網站是同義詞。Perl 是一種相對來說容易學習的解釋型語言,并且有強大的文本處理特性,使得它能夠很容易的編寫腳本來把一個網站關聯到數據庫、處理由用戶發送的表單數據,當然,還要創造那些上世紀 90 年代的網站的經典形象——計數器和留言簿。
類似的網站特性漸漸的變成了 CGI 腳本的形式,其全稱為通用網關接口Common Gateway Interface,首個實現[5]由 Rob McCool 于 1993 年 11 月在 NCSA HTTPD 上完成。CGI 是目的是直面功能,并且在短短幾年間,任何人都可以很容易的找到一些由 Perl 寫的預制的腳本存檔。有一個聲名狼籍的案例就是 Matt's Scripts Archive[6],這是一種流行卻包含各種安全缺陷的源代碼庫,它甚至使得 Perl 社區成員創建了一種被稱為 Not Matt‘s Scripts[7] 的更為專業的替換選擇。
在當時,無論是業余愛好者,還是職業程序員都采用 Perl 來制作動態網站和應用,Tim O’Reilly 創造了詞匯“信息軟件”infoware[8]來描述網站和 Perl 怎樣成為變化中的計算機工業的一部分。考慮到 Yahoo!和 Amazon 帶來的創新,O‘Reilly 寫道:“傳統軟件在大量的軟件中僅僅包含了少量的信息;而信息軟件則在少量的軟件中包含了大量的信息。” Perl 是一種像瑞士軍刀一樣的完美的小而強大的工具,它支撐了信息媒體從巨大的網站目錄向早期的用戶生成內容(UGC)平臺的轉變。
盡管使用 Perl 來制作 CGI 簡直是上佳之選,但是編程語言和不斷提升中的動態網站之間的關系變得更加的密切與深入。從第一個網站[9](在 1990 年的圣誕節前)出現到 1993 年 McCool 實現 CGI 的短暫時期內,Web 上的各種東西,比如表單、圖片以及表格,就這么逐漸出現在上世紀 90 年代乃至后來。盡管伯納斯·李也對這些早期的歲月產生了影響,但是不同的人看到的是 Web 不同的潛在作用,并將它推向各自不同的方向。一方面,這樣的結果來自一些著名的辯論,例如 HTML 應該和 SGML 保持多近的關系[10]、是否應該實現一個圖像標簽[11]等等。在另一方面,在沒有直接因素影響的情況下改變是極其緩慢的。后者已經很好的描述了動態網站是如何發展的。
從某種意義上說,第一個“網關”的誕生可以追溯到 1991 至 1992 年之間(LCTT 譯注:此處所謂“網關”的意義請參照 CGI 的定義),當時伯納斯·李和一些計算機科學家與超文本愛好者編寫服務程序[12]使得一些特定的資源能夠連接到一起,例如 CERN 的內部應用程序、通用的應用程序如 Oracle 數據庫、廣域信息查詢系統(WAIS)[13] 等等。(WAIS 是 Web 的前身,上世紀 80 年代后期開發,其中,開發者之一 Brewster Kahle[14],是一個數字化圖書管理員和 Internet Archive[15] 的創始人。)可以這樣理解,“網關”就是一個被設計用來連接其它 Web、數據庫或者應用程序的定制的 Web 服務器。任何的動態功能就意味著在不同的端口上運行另外一個守護進程(參考閱讀,例如伯納斯·李對于在網站上如何添加一個搜索功能[16] 的描述)。伯納斯·李期望 Web 可以成為不同信息系統之間的通用接口,并且鼓勵建立單一用途服務。他也提到 Perl 是一種強大的(甚至是不可思議)、可以將各種東西組合起來的語言。
然而,另一種對“網關”的理解指出它不一定是一個定制設備,可能只是一個腳本,一個并不需要額外服務器的低吞吐量的附加腳本。這種形式的首次出現是有爭議性的 Jim Davis 的 Gateway to the U Mich Geography server[17],于 1992 年的 11 月發布在了 WWW-talk 郵件列表中。Davis 的腳本是使用 Perl 編寫的,是一種 Web API 的原型,基于格式化的用戶查詢從另外的服務器拉取數據。我們來說明一下這兩種對于網關的理解的不同之處,伯納斯·李回復了[18] Davis 的郵件,期望他和 Michigan 服務器的作者“能夠達成某種共識”,“從網絡的角度來看的話”僅使用一臺服務器來提供這樣的信息可能會更有意義。伯納斯·李,可能是期待著 Web 的發明者可以提出一種有秩序的信息資源訪問方式。這樣從不同服務器上拉取數據的網關和腳本意味著一種潛在的 Web 的質的變化,雖然不斷增多,但也可能有點偏離了伯納斯·李的原始觀點。
在 Davis 的地理服務器上的網關向標準化的、低吞吐量的、通過 CGI 方式實現的腳本化網關邁進的一步中,Perl HTTPD[19] 的出現是很重要的事件,它是 1993 年初由印地安納大學的研究生 Marc Van Heyningen 在布盧明頓Bloomington完全使用 Perl 語言實現的一個 Web 服務器程序。從 Van Heyningen 給出的設計原則[20]來看,基于使用 Perl 就不需要任何的編譯過程這樣一種事實,使得它能夠成為一種極易擴展的服務器程序,這個服務器包含了“一個向代碼中增加新特性時只要簡單的重啟一下就可以,而不會有任何的宕機時間的特性”,使得這個服務器程序可以頻繁的加入新功能。
Perl HTTPD 代表了那種服務器程序應該是單一、特定目的的觀點。相應的,這種模式似乎暗示了在 Web 開發中像這樣漸進式的、持續測試的軟件產品可能會最終變成一種共識。Van Heyningen 在后來提到過[21]他從頭編寫這樣一個服務器程序的初衷是當時沒有一種簡便的方式使用 CERN 服務器程序來生成“虛擬文檔”(例如,動態生成的頁面),他打趣說使用 Perl 這樣的“神之語言”來寫可能是最簡單的方式了。在他初期編寫的眾多腳本中有一個 Sun 操作系統的用戶手冊的 Web 界面,以及 Finger 網關[22](這是一種早期用來共享計算機系統信息或者是用戶信息的協議)。
雖然 Van Heyningen 將印地安納大學的服務器主要用來連接現存的信息資源,他和研究生們同時也看見了作為個人發布形式的潛在可能。其中一件廣為人知事件是在 1993-1994 年之間圍繞著一個著名的加拿大案件而公布[23]的一系列的文件、照片和新聞故事,與此形成鮮明對比的是,所有的全國性媒體都保持了沉默。
Perl HTTPD 沒有堅持到現在的需要。今天,Van Heyningen 回憶起這個程序的時候認為這個程序只是當時的一個原型產品。它的原始目的只是向那些已經選擇了 Gopher 作為大學的網絡界面的資深教員們展示了網絡的另一種利用方式。Van Heyningen 以一種基于 Web 的、可搜索的出版物索引[24]的方式,用代碼回應了他的導師們的虛榮。就是說,在服務器程序技術方面關鍵創新是為了贏得爭論的勝利而誕生的,在這個角度上來看代碼做到了所有要求它所做的事。
不管該服務器程序的生命是否短暫,伴隨者 Perl HTTPD 一起出現的理念已經傳播到了各個角落。Van Heyningen 開始收到了獲取該代碼的請求,而后將它分享到了網上,并提示說,需要了解一些 Perl 就可以將它移植到其它操作系統(或者找到一個這樣的人也行)。不久之后,居住在奧斯汀Austin的程序員 Tony Sanders 開發了一個被稱為 Plexus[25] 的輕便版本。Sander 的服務器程序是一款全功能的產品,并且同樣包含了 Perl HTTPD 所建議的易擴展性,而且添加一些新的特性如圖片解碼等。Plexus 直接影響了[26] Rob McCool 給 NCSA HTTPD 服務器上的腳本開發的“htbin”,并且同樣影響到了不久之后誕生的通用網關接口(CGI)。
在這些歷史遺產之外,感謝妙不可言的互聯網時光機Internet Archive使得 Perl HTTPD 在今天依然保留在一種我們依然可以獲取的形式,你可以從這里下載 tarball[27]。
對于技術世界的顛覆來說,技術的改變總是在一個相互對立的過程中。現有的技術是思考新技術的基礎與起點。過時的編程形式啟迪了今天人們做事的新方式。網絡世界的創新可能看起來更像是對于舊技術的擴展,不僅僅是 Perl。
在萌芽事件的簡單的時間軸之外,Web 歷史學者也許可以從 Perl 獲取更多的線索。其中一部份的挑戰在于材料的獲取。更多需要做的事情包括從可獲取的大量雜亂的數據中梳理出它的結構,將分散在郵件列表、歸檔網站,書本和雜志中的信息內容組合在一起。還有一部分的挑戰是需要認識到 Web 的歷史不僅僅是新技術發布的日子,它同時包括了個人記憶、人類情感與社會進程等,并且這不僅僅是單一的歷史線而是有許許多多條相似的歷史線組合而成的。就如 Perl 的信條一樣“殊途同歸。There's More Than One Way To Do It.”
(題圖來自:pinterest.com[28])
via: https://opensource.com/life/16/11/perl-and-birth-dynamic-web
作者:Michael Stevenson[29] 譯者:wcnnbdk1 校對:wxy
本文由 LCTT[30] 原創編譯,Linux中國 榮譽推出
[1]: 宣布 - https://groups.google.com/forum/#!msg/alt.hypertext/eCTkkOoWTAY/bJGhZyooXzkJ
[2]: CERN - https://tenyears-www.web.cern.ch/tenyears-www/
[3]: 第一版 NCSA Mosaic 瀏覽器 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0099.html
[4]: 新聞組 - https://en.wikipedia.org/wiki/Usenet_newsgroup
[5]: 首個實現 - http://1997.webhistory.org/www.lists/www-talk.1993q4/0518.html
[6]: Matt's Scripts Archive - https://web.archive.org/web/19980709151514/http://scriptarchive.com/
[7]: Not Matt‘s Scripts - http://nms-cgi.sourceforge.net/
[8]: “信息軟件” - https://web.archive.org/web/20000815230603/http://www.edventure.com/release1/1198.html
[9]: 第一個網站 - http://info.cern.ch/hypertext/WWW/TheProject.html
[10]: HTML 應該和 SGML 保持多近的關系 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0096.html
[11]: 是否應該實現一個圖像標簽 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0182.html
[12]: 編寫服務程序 - http://info.cern.ch/hypertext/WWW/Daemon/Overview.html
[13]: 廣域信息查詢系統(WAIS) - https://en.wikipedia.org/wiki/Wide_area_information_server
[14]: Brewster Kahle - http://brewster.kahle.org/about/
[15]: Internet Archive - https://archive.org/index.php
[16]: 如何添加一個搜索功能 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0109.html
[17]: Gateway to the U Mich Geography server - https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0060.html
[18]: 回復了 - https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0069.html
[19]: Perl HTTPD - https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/code.html
[20]: 設計原則 - https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/intro.html
[21]: 提到過 - https://web.archive.org/web/19980122184328/http://www.cs.indiana.edu/perl-server/history.html
[22]: Finger 網關 - https://web.archive.org/web/19990429014629/http://www.cs.indiana.edu:800/finger/gateway
[23]: 公布 - https://web.archive.org/web/19970720205155/http://www.cs.indiana.edu/canada/karla.html
[24]: 一種基于 Web 的、可搜索的出版物索引 - https://web.archive.org/web/19990428030253/http://www.cs.indiana.edu:800/cstr/search
[25]: Plexus - https://web.archive.org/web/19990421192342/http://www.earth.com/server/doc/plexus.html
[26]: 直接影響了 - http://1997.webhistory.org/www.lists/www-talk.1993q4/0516.html
[27]: 這里下載 tarball - https://web.archive.org/web/20011126190051/http://www.cs.indiana.edu/perl-server/httpd.pl.tar.Z
[28]: pinterest.com - https://www.pinterest.com/pin/146930006563199552/
[29]: Michael Stevenson - https://opensource.com/users/mstevenson
[30]: LCTT - https://github.com/LCTT/TranslateProject
ojolicious 是Perl Web 開發的全新嘗試,基于多年開發 Catalyst 框架的經驗,并利用了最新的 Web 標準和技術。您可以使用隨您的需求而增長的框架快速開始您的項目。
Mojo 堆棧提供了一組一致的組件,可以在任何項目中使用。這些指南涵蓋了使用框架的大部分方面,并且組件具有全面的參考文檔。Mojolicious 是一個實時 Web 框架,它允許新型 Web 應用程序使用 WebSocket 并無阻塞地長時間運行請求。
您所需要的只是一句臺詞,只需不到一分鐘。
$ curl -L https://cpanmin.us | perl - -M https://cpan.metacpan.org -n Mojolicious
我們建議使用Perlbrew環境。
這三行是一個完整的Web應用程序。
use Mojolicious::Lite;
get '/' => {text => 'I ? Mojolicious!'};
app->start;
要使用內置開發 Web 服務器運行示例,只需將代碼放入文件中并以morbo.
$ morbo hello.pl
Web application available at http://127.0.0.1:3000
使用您喜歡的任何 HTTP 客戶端對其進行測試。
$ curl http://127.0.0.1:3000/
I ? Mojolicious!
在像這樣的漂亮的單文件原型中使用所有最新的 Perl 和 HTML 功能,并將 它們輕松地發展成結構良好的 模型-視圖-控制器Web 應用程序。
use Mojolicious::Lite -signatures;
# Render template "index.html.ep" from the DATA section
get '/' => sub ($c) {
$c->render(template => 'index');
};
# WebSocket service used by the template to extract the title from a website
websocket '/title' => sub ($c) {
$c->on(message => sub ($c, $msg) {
my $title = $c->ua->get($msg)->result->dom->at('title')->text;
$c->send($title);
});
};
app->start;
__DATA__
@@ index.html.ep
% my $url = url_for 'title';
<script>
const ws = new WebSocket('<%= $url->to_abs %>');
ws.onmessage = function (event) { document.body.innerHTML += event.data };
ws.onopen = function (event) { ws.send('https://mojolicious.org') };
</script>
項目地址:https://github.com/mojolicious
、安裝PostgreSQL
二、安裝性能監控工具sysstat
yum -y install sysstat
三、安裝Apache
# yum -y install httpd
# rpm -qa | grep httpd
四、安裝pgcluu
pgClu是一個Perl程序,可用于對PostgreSQL群集和系統性能執行完全審計。它分為兩個部分:一個是使用psql命令行實用程序和sysstat包中的sar獲取PostgreSQL服務器上的統計信息的收集器;另一個是一個純Perl繪圖器,將生成所有HTML和圖表輸出。
1、安裝依賴包
# yum install perl-ExtUtils-MakeMaker perl-CGI -y
2、安裝pgcluu
# cd /software/
# wget -c https://github.com/darold/pgcluu/archive/refs/tags/v3.5.tar.gz -O pgcluu-v3.5.tar.gz
# mkdir -p /etc/apache2/conf-enabled/
# tar xzvf pgcluu-v3.5.tar.gz
# cd pgcluu-3.5/
# perl Makefile.PL
# make && make install
五、配置
# vi /etc/httpd/conf/httpd.conf
編輯為:
LoadModule cgid_module modules/mod_cgid.so
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Require all granted
Allow from all
</Directory>
AddHandler cgi-script .cgi
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
加入pgcluu相關配置,轉到項目根目錄
# mkdir /var/www/html/pgcluu/
# cd /software/pgcluu-3.5
# cp -rf cgi-bin/rsc/ /var/www/html/pgcluu/
# cp cgi-bin/pgcluu.cgi /var/www/cgi-bin/
//修改文件權限
# chown -R apache: /var/www/html/pgcluu/
# chown -R postgres:apache /var/lib/pgcluu/data/
# chmod -R u=rwX,g=rsX,o= /var/lib/pgcluu/data/
vi /var/www/cgi-bin/pgcluu.cgi
將此行注釋(否則會報錯cgi-error):
no warnings 'redundant';
啟動web服務
# systemctl enable httpd
# service httpd start
su - postgres
$ /usr/local/bin/pgcluu_collectd -D -i 60 --rotate-daily /var/lib/pgcluu/data
$ /usr/local/bin/pgcluu --cache /var/lib/pgcluu/data
如果報如下錯誤:
FATAL: can't read file /var/lib/pgcluu/data/2023/12/20/end-pg_stat_user_indexes.csv: No such file or directory
不用緊張,稍等一會兒就生成這個文件了。
$ crontab -e
加入下面內容:
*/5 * * * * /usr/local/bin/pgcluu --cache /var/lib/pgcluu/data
訪問下面地址:
http://localhost/cgi-bin/pgcluu.cgi
如果發現信息不是很完整,稍等一會兒再查看就完整了。
備注:
如果pgcluu_collectd啟動失敗(/var/run/postgresql/pgcluu_collectd.pid文件不存在,ps也看不到pgcluu_collectd的進程),則可以嘗試:
# mkdir -p /var/run/postgresql/
# chown postgres:postgres /var/run/postgresql/
# su - postgres
$ /usr/local/bin/pgcluu_collectd -D -i 60 --rotate-daily /var/lib/pgcluu/data
為了在系統重啟后,pgcluu仍能收集PostgreSQL集群上的統計信息,可以把pgcluu_collectd放在自啟動服務中:
# chmod a+x /etc/rc.d/rc.local
# vi /etc/rc.d/rc.local
添加如下內容:
# start to grab statistics on the PostgreSQL cluster
/bin/mkdir -p /var/run/postgresql/
/bin/chown postgres:postgres /var/run/postgresql/
/bin/su - postgres -c '/usr/local/bin/pgcluu_collectd -D -i 60 --rotate-daily /var/lib/pgcluu/data
*請認真填寫需求信息,我們會在24小時內與您取得聯系。