Pacman 的規劃

玩了幾天 Pacman,整理一些資料...

安裝完成後,預設可以使用的 package repository 可以在 /etc/pacman.conf 內看到,包括 core (目前約 340 個)、extra (~4500),以及 community (~3400)。

另外有幾兩個測試性質的,預設是關閉的。一個是 testing,另外一個是 community-testing,裡面的量都不多。

除了這些以外,使用者自己也可以提供新的套件,官方有提供 AUR (也就是 unsupported),任何人都可以註冊並且上傳,也因此所以有可能會包括有安全問題的 code。所以有 TU (Trusted Users) 的制度,當一個 package 使用的人夠多 (在「AUR Trusted User Guidelines」有說明),而且 TU 確認沒問題後就會 update 到 community 內。

要安裝 unsupported 的軟體必須必須自己下載 AUR 的 source tarball (裡面有 PKGBUILD 以及其他設定),並且確認沒有 malicious code 後再用 makepkg 安裝。

另外 Gmane 有收 ArchLinuxmailing list,習慣用 BBS 讀的人可以抓下來看。

在 VirtualBox 內安裝 ArchLinux 的紀錄

Debian 用一陣子後,發現 Python 2.6 在 lennybackports 也沒有,一定得到 squeeze (目前的 testing) 找出來用,但如此一來就會有很多問題 (像是 testing 的 python library 使用 stable 的 C library),所以一直在覺得很煩...

另外,自己架設 APT 的熟練程度一直卡在沒有自動化工具,所以一直想要試試 Linux 上其他的 package system,但又不想要用 RPM,所以就挑上 ArchLinux 了...

不過在 VirtualBox 內裝 ArchLinux 遇到一些怪問題,總算是弄的差不多,紀錄起來讓其他人有機會少踩一些雷...

首先是抓 ISO image,最新的版本可以在 http://ftp.tku.edu.tw/Linux/ArchLinux/iso/latest/ (這是淡江大學的 mirror) 這邊抓到,我在寫這篇時是抓 archlinux-2009.08-netinstall-i686.iso,抓完之後先用工具確認檔案的 md5 與 sha1 有沒有問題,避免檔案壞掉造成安裝過程或結果異常。

由於我是用 netinstall,所以得選擇 mirror site。在選擇時,記得得選擇 FTP 而非 HTTP 的 mirror site。我前幾次試著用 HTTP 試了好幾個站台都失敗,但後來選 FTP 都成功。這個問題還不知道哪裡出錯。另外要注意的是,由於我是有拿到 Public IP,所以不確定 FTP 預設是不是 passive,如果在 NAT 後面安裝的人可能要抓 core 版而非 netinstall 版避開這個問題 (因為 HTTP 不能用),或是想辦法讓 installer 告訴抓檔程式用 passive mode。

再來是檔案系統的選擇,由於我只是要玩 ArchLinux,所以決定切 / 與 swap 就好,不另外切 /boot。在 Debian 上我可以用 ReiserFS 當作根目錄,而 GRUB 可以開機,但在 ArchLinux 上我用 ReiserFS 當作根目錄會失敗,改用 ext3 才開的起來。

對於 ArchLinux 的 package system,pacman 用起來還蠻有趣的,官方 Wiki 上對於基本操作寫得很清楚 (「pacman」這篇),另外在 /etc/pacman.conf/etc/pacman.d/ 以及 /var/lib/pacman/ 下也是可以摸索的地方,要再花時間玩...

裝玩 openssh 並且跑起來後,卻發現連不上 SSH server,翻系統紀錄才發現被 TCP wrapper 擋下來了,要在 /etc/hosts.allow 裡加上 sshd 以及開放的網段。

接下來是建制基本環境,大致上就是把 Debian 上的 bash 設定複製一份過來就可以了。

WordPress 的 gzip 支援

剛剛跑 WebPagetest 才發現 WordPress 把內建的 gzip 的功能拿掉了 (差不多拿掉兩年了),所以第一個 request 不會被壓縮:「Web page performance test results for http://blog.gslin.org/ Test completed - 03/19/10 22:24:51 from Dulles, VA - 1.5Mbps ADSL」。

可以在 WordPress Codex 上看到說明以及建議的解法:「Output Compression」,不過在 SharkSpace 的主機上用 .htaccess 的方式完全沒效果,還不曉得是什麼問題...

由於首頁的 request 不壓縮與壓縮會有 40KB 以上的差距 (從 63KB 到 18KB),能夠解決 PHP 輸出的部份其實就解的差不多了,在找了 WordPress 的 Plugin 後,目前是裝 GZIP Output,目前看起來沒什麼問題...

P3PC (Performance of 3rd Party Content)

Steve Souders 開了一個「Performance of 3rd Party Content」,分析 3rd party script 的效能。目前已經分析了四個 js。

看完四個 js 的分析後,可以看出來一些 pattern:

  • 用 async script。Google 曾經介紹 Google Analytics 可以使用 async script:「Google Analytics Launches Asynchronous Tracking」。
  • 當使用 async script 時無法使用 document.write (會有奇怪的結果),就算不是 async script 也應該儘量避免使用。常見的方法是建立一個帶有 iddiv,然後在 script 內用 document.getElementById() 或是等價的方式取得後在裡面插入元素,或是直接修改 innerHTML
  • div 再修改的模式時,如果可以先確定 div 的大小,最好在 class 與對應的 CSS 上先定義 (像是廣告的版位),可以避免頁面 re-layout。
  • Cache-Control 內設定夠長的 max-age (尤其是幾乎不會改動的圖片)。
  • 如果是 tracking 機制,應該傳回 204 而非 200。

這個計畫應該還會再繼續分析,有興趣的人可以訂 RSS 看。

改寫 wretch-albumexpander.js (無名小站相簿展開程式)

這次主要是把之前用 jQuery 1.2.6 的需求改寫,改用 getElementsByClassName()getElementsByTagName() 以及 getElementById() 取得元素,然後用 .innerHTML 直接換掉內容。

由於這次改寫避免使用 unsafeWindow 以及複雜的 GM_* 函式,在 Google Chrome 除了遇到一個小問題之外 (可以寫一段 code workaround),目前跑起來還蠻正常的。

參考:「Wretch Album Expander」以及 GitHub 上的「gslin's albumexpander」。

bsdftpd-ssl 的設定

要從紐約的主機上面拉檔案回台灣,發現 SFTP 速度只有 20KB/sec,這是因為目前 SSH 實做的方式對 latency 很敏感,在「High Performance SSH/SCP - HPN-SSH」這篇有提到相關的問題以及針對 OpenSSH 的 patch。不過,我想要用 freebsd-update 維護系統的 security update,所以我不想動到系統內的 OpenSSH。

另外一個想法是透過 FTPS 抓檔案,有不少 server software 都有支援 FTPS。在找 bsdftpd-ssl 的資料時找到以前寫的「在 FreeBSD 上支援 SSL 的 ftpd」這篇,結果發現這篇文章是因為當初 bsdftpd-ssl 在 FreeBSD 上無法編譯而改用 ftpd-tls 所寫的。現在這個問題已經解決了,但找不到之前用 bsdftpd-ssl 所設的設定可以抄,只好再 man ftpd-ssl 看一次參數。

除了先到 portsftp/bsdftpd-ssl 目錄下安裝外,還需要產生 self-signed certification。產生的步驟可以參考「OpenSSL Command-Line HOWTO」這篇的「How do I generate a self-signed certificate?」這個部份。把 certification 輸出到 /etc/ssl/certs/ftpd.pem (如果目錄不存在則建立一個),並把檔案權限改成 600 或是 400。

再來是設定 /etc/rc.conf.local (bsdftpd-ssl 不屬於 system 內建軟體,所以放到 local),增加兩行:

bsdftpd_ssl_enable="YES"
bsdftpd_ssl_flags="-D -h -l -p /var/run/ftpd.pid -z secure"

然後用 /usr/local/etc/rc.d/bsdftpd-ssl start 跑起來就可以了。測試時要注意 active 與 passive 以及防火牆的設定,在 debug 時除了錯誤訊息外,可以用 sockstat | grep ftpd 以及 tcpdump 觀察。

實際抓一個 500MB 的檔案,到最後面可以跑到 295KB/sec,比起 SFTP 快上不少。

Debian 的 Backports

這幾天在 VirtualBox 內弄了一台 Debian lenny (x86) 起來玩,想要多熟悉 Debianbash 的風格...

不過 lenny (5.0.0) 從去年二月到現在也已經過了一年,雖然一直有在更新 (現在是 5.0.4),但為了穩定性,並不是所有的軟體都有更新。印象中有個計畫是專門解決這個問題的,可以讓你在 stable 使用新版,但不是整個系統都換到 testingunstable

在印象中跟 "backport" 這個關鍵字有關,翻了以後找到 Debian Backports,看起來就是我要的...

依照「instructions [Debian Backports]」操作,直接把 entry 加到 /etc/apt/sources.list 內,用 apt-get update 更新一次,這時候會出現不認得 public key,不管他直接 apt-get install debian-backports-keyring 就收工了。測過沒問題後,就在「Backports.org worldwide mirror sites」這邊找亞洲區的 mirror site,看起來只有日本有做,改過去再測一次 update,沒問題收工...

由於預設仍然會使用 lenny 內的套件,如果要裝 backport 內的東西,需要用 -t lenny-backports 讓 apt-get 或是 aptitude 知道。

另外,在「Diffs between lenny-backports and squeeze」這邊可以看到 lenny-backportssqueeze (目前的 testing) 的差距。

nginx 的調整

花了一些時間翻 nginx 的文件,有一些地方可以 tune...

FreeBSD 上可以利用 httpready 把一些事情丟到 kernel module 處理:

listen 80 default accept_filter=httpready;

httpready 參數必須設定在有 defaultlisten 之上,而且必須在 default 之後,不然會回報設定錯誤。

server_tokens 也應該關掉,除了 security 理由外,另外一個很簡單的理由是,可以少送 7bytes...:

server_tokens off;