藍天浮雲

This is our world… Nothing changes. It’s here, that we are going to live on…

Apache 設定

leave a comment »

Apache 的說明文件其實很完整,所有的 options 都有詳細說明。不過感覺對初學者不是很友善,國中的時候很多地方都看不懂。

有時候也要用一下搜尋才找的到需要的資料,因為東西太多了,像是模組 就有數十個。

Apache 的設定檔位於 /usr/local/etc/apache22/httpd.conf(Includes/ 和 extra 裡面也有一些設定)。

節錄一下設定檔:

# 這是 Apache 程式、設定檔的路徑,正常人不會想改他
ServerRoot "/usr/local"

# 設 Apache 要聽哪個 port(前面可加 IP),除非有用 reverse proxy 否則不需要更動
Listen 80

# 載入一堆模組,有很多可以移除,但不確定的話建議別亂改
# LoadModule foo_module modules/mod_foo.so

# Apache 要以什麼使用者和群組執行
# 要注意一下會有一個程序是以 root 執行,原因是
# port 80 需要權限才有辦法 bind,因此需要 root
User www
Group www

# 管理員信箱
# 根據 RFC 2142 應該設成 webmaster@domain.tld,www@ 為 alias
ServerAdmin webmaster@hs.ntnu.edu.tw

# 網頁的資料,我通常都設成 /home/www/hostname
DocumentRoot "/home/www/www"

# 目錄之權限,預設當然是封鎖所有目錄
<Directory />
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

# 網頁所在的目錄之設定
<Directory "/home/www/www">
    # 允許 symlinks,預設有 Indexes 但被我拿掉了
    Options FollowSymLinks
    # 建議不要用 .htaccess 設定,效能差
    AllowOverride None
    # Allow 所有人
    Order allow,deny
    Allow from all
</Directory>

# 預設送哪些檔案,我加了 PHP
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

# 拒絕看 .htaccess 與 .htpasswd
<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>

# 紀錄檔位置,我通常會改目錄,這樣比較整齊
ErrorLog /var/log/httpd/httpd-error.log

# 紀錄之詳細程度
LogLevel warn

基本的設定檔就到這裡。接下來就是模組、額外的設定。看到 httpd.conf 最下面有很多被註解掉的設定檔。

  • extra/httpd-mpm.conf:管理 Apache 程序,除非流量很大否則預設就好
  • extra/httpd-userdir.conf:使用者網頁專用的模組
  • extra/httpd-info.conf:一些 server 的資訊
  • extra/httpd-vhosts.conf:虛擬主機,很有用,但 SSL方面有些限制
  • extra/httpd-default.conf:一些 Apache 的設定
  • extra/httpd-ssl.conf:SSL 的設定

通常我會改 httpd-info.confhttpd-default.confhttpd-vhosts.confhttpd-ssl.conf 有用到才會設。

httpd-info.conf:最好設成只有 127.0.0.1 可以看,或乾脆拿掉,有需要再啟用。另外,可以用 ExtendedStatus On

httpd-default.conf:改 ServerTokens ProdServerSignature Off

因為 httpd-vhosts.confhttpd-ssl.conf 設定比較複雜,先跳過。

一些常見的設定:

  • <Directory>:目錄
  • <FilesMatch>:檔案
  • <Location>:URL 的部分
  • AddType:Content 種類
  • Header:HTTP header
  • FileETag:ETag 的設定
  • SetOutputFilter:可以用來壓縮
  • Alias:別名
  • Redirect
  • Rewrite:有點像 mod_alias 的加強版
  • IndexOptions

一些常用的模組:

  • headers
  • cache
  • expires
  • deflate
  • alias
  • rewrite
  • ssl
  • vhost_alias

除此之外,CGI、PHP 和 content negotiation 也是一些常用的功能。

作者為dennylin93

2009/12/08 at 10:02 下午

安裝 Apache

leave a comment »

網路上有很多種不同的 server,其中 Apache 是最受歡迎也是使用最久的 server 之一。現在 Netcraft 的 survey 顯示 Apache 佔了市場的 47%,接下來才是 IIS、nginx、lighttpd。

Apache 因為使用廣泛、歷史悠久,主要的優點包含:

  • 功能完整
  • 穩定
  • 支援度高

但比起 nginx、lighttpd 這兩個後起之秀,效能沒有那麼好。

現在仍然有許多網站使用 Apache,如 Wikipedia、W3C、ISC、Google(據說是用改版的 Apache)。

Apache 除了靜態網頁之外,還可以配合 PHP 與 MySQL 做動態網頁。

灌 Apache 其實很簡單,只要下:

# cd /usr/ports/www/apache22 && make install clean

模組很多,基本上用預設就好,不過可以不選 DAVDAV_FSCERN_METAIMAGEMAP(若要用 Subversion 要留 DAVDAV_FS)。

接下來把 apache22_enable="YES" 加入 /etc/rc.conf 就可以啟動 Apache 了:# /usr/local/etc/rc.d/apache22 start

除了 script 以外,還有 apachectl 可以使用。

測試設定檔有沒有問題:
# apachectl configtest
啟動 Apache:
# apachectl start
停止 Apache:
# apachectl stop
重新啟動 Apache:
# apachectl restart
重新啟動 Apache:
# apachectl graceful

restartgraceful 的差別在於 graceful 會先等現有的連線結束後才重新啟動。通常建議用 # apachectl graceful。若 Apache 沒有啟動,restartgraceful 都會啟動 Apache。

Apache 的設定檔位於 /usr/local/etc/apache22/httpd.confIncludes/extra 裡面也有一些設定)。

詳細設定之後在打。

作者為dennylin93

2009/12/08 at 9:15 下午

一次設定完 ports

leave a comment »

FreeBSD 上編 ports 的時候,常常會有 options 選單跳出來。有時候想下完指令然後給他自己跑,結果到某一步又有選單跑出來,沒辦法繼續。不久之前看到了一個解決方式:config-recursive。一次將所有的 dependencies 設完再開始安裝。

若第一次安裝就用:

# make config-recursive install clean

其實 ports 有很多關於 make 的選項,都可以在 /usr/ports/Mk/bsd.port.mk 裡找到(大約 700 行的地方)。

作者為dennylin93

2009/11/29 at 10:59 AM

升級到 FreeBSD 8.0-RELEASE

leave a comment »

從段考前就一直期待 FreeBSD 8.0-RELEASE(害我沒辦法專心看書…)。直到昨天才 announce。其實幾天前 mirror 上面早就有了,不過要等大部分的 mirror 都 sync 完之後才會公佈。

這次 release 改了很多東西(每次 FreeBSD 邁入下一個版本的時候都是如此)。綜合一下這幾篇的重點:

主要更新有:

  • 新的虛擬化技術「vimage」,這是針對 FreeBSD Jails,現在每個 jail 都可以有獨立的 network stack
  • 舊的 TTY layer 被取代了,新的對 SMP 有更好的支援
  • Linux emulation layer 更新成 2.6.16,Linux port 則用 emulators/linux_base-f10
  • GENERIC 核心包含 Trusted BSD MAC
  • 整個 USB stack 被重寫
  • ZFS 版本更新到 13
  • 支援 NFSv4
  • gvinum 被更新
  • ULE scheduler 被改善

這裡有更詳細的 release notes

這次升級出了狀況,太早將 old libraries 砍掉,結果破壞了 backward compatibility。很多 ports 無法使用。幸好有修好。

更新其實還算簡單,沒有碰到什麼問題(除了我腦殘以外)。

先抓 RELENG_8_0 的 source 回來。將 supfile 的 RELENG_7_2 改成 RELENG_8_0,然後 # csup -g -L 2 standard-supfile

*default host=cvsup3.tw.freebsd.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8_0
*default delete use-rel-suffix
*default compress

src-all

接下來就設定 kernel。把 /usr/src/sys/i386/conf/GENERIC 複製到 /root/kernels/MYKERNEL,然後再 symlink 到 /usr/src/sys/i386/conf/MYKERNEL。這次 kernel 沒什麼大變化,除了 acpi 被加進 GENERIC

設好後就開始編了:

# cd /usr/src
# make -j 6 buildworld
# make -j 6 buildkernel KERNCONF=MYKERNEL
# make installkernel
# reboot

Handbook 步驟差不多,-j 會加快速度,kernel 也用 custom 的。雖然說 major upgrade 最後先用 GENERIC,但懶得用,所以就冒險一下(其實我有從 mirror 抓回 GENERIC 然後放到 /boot/kernel.GENERIC)。

家裡編 world + kernel 大概要 40 分鐘吧,新的電腦可能不用 20 分鐘就完成了。

重開機進入「single user mode」:

# adjkerntz -i
# mount -a -t ufs
# mergemaster -p
# cd /usr/src
# make installworld
# mergemaster -Fi
# reboot

也跟 Handbook 差不多,但 mergemaster 加上了 -Fi-F 會自動更只有 $FreeBSD$ 不一樣的檔案,-i 會自動安裝 /etc/ 底下不存在的檔案。應該沒什麼困難。

這樣就跟新完了。Kernel 有留 COMPAT_FREEBSD7 的話 ports 應該還可以用,舊的 libraries 也別急著刪掉。

像我就不小心看掉 libraries,只好放大絕(# pkg_delete -a),然後用 packages 重裝。大部分的時間都花在下載 packages。

話說星期一要換新的 mail server 了,等了好久 :-)。

作者為dennylin93

2009/11/28 at 2:09 下午

張貼於FreeBSD, 電腦科學

HiNet DNS 伺服器不正常?

leave a comment »

大概是暑假的時候發現 HiNet 的 DNS 伺服器(dns.hinet.net)有點奇怪。有某些網路正解會 freeze 住,不知道原因。換其他 DNS 伺服器就沒問題。

這兩個就會 freeze:

# dig @dns.hinet.net www.over-yonder.net
# dig @dns.hinet.net www.cinepaint.org

www.undeadly.org 正解也有點問題。

正常的應該像這樣:

# dig www.over-yonder.net

; <> DiG 9.4.3-P2 <> www.over-yonder.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33885
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.over-yonder.net.           IN      A

;; ANSWER SECTION:
www.over-yonder.net.    390     IN      A       75.65.60.123

;; AUTHORITY SECTION:
over-yonder.net.        390     IN      NS      ns.silohost.com.
over-yonder.net.        390     IN      NS      ns2.silohost.com.

;; ADDITIONAL SECTION:
ns.silohost.com.        169590  IN      A       66.20.47.5
ns2.silohost.com.       169590  IN      A       66.20.47.2

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Nov 14 14:19:12 2009
;; MSG SIZE  rcvd: 132

試了幾次都沒辦法解決,所以現在都沒在用 dns.hinet.net(168.95.1.1)了。反正學校有 ns1、ns2,家裡直接用 BIND 在 localhost 架一個 caching 的 DNS 伺服器。

更新:和 buganini 學長做了一些測試,發現應該是 timeout 所造成的。從某些地方連到上面的 DNS 伺服器 latency 比較高,因此 query 的時候可能會有 timeout,不過還不完全確定。已經寄信去問了。

作者為dennylin93

2009/11/14 at 2:21 下午

張貼於網路, 電腦科學

更改 MySQL 使用者的密碼

leave a comment »

我印象中第一次在 FreeBSD 上灌 MySQL 的時候應該是高一吧。那時候不知道怎麼用 mysqlroot 的密碼,因為國中都用 phpMyAdmin,對 SQL 一無所知。

自從暑假用 MySQL 當作 mail server 的 backend,就開始學 SQL 了。一直用 phpMyAdmin 不是辦法。當然,最重要的指令就是更改 root 的密碼了。

安裝、啟動 MySQL 之後,進入命令列:

# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 80
Server version: 5.1.40-log FreeBSD port: mysql-server-5.1.40

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

第一次看到這個就傻眼了,因為不知道該做什麼。其實很簡單,只要執行:

mysql> UPDATE mysql.user SET password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;

就可以更換 root 的密碼了(記得把「newpass」改成自己的密碼)。

UPDATE 是更新 mysql 資料庫裡的 user table。SET 是設定,PASSWORD 是 MySQL 內建的 hash function,用來加密密碼。後面的 WHERE 限制更改使用者為 root 的密碼。最後 FLUSH PRIVILEGES 會告訴 server 重新載入權限的資訊。

作者為dennylin93

2009/11/11 at 8:21 下午

glabel

leave a comment »

其實 glabel 在 FreeBSD 上是一個很實用的程式,不過平常可能很少聽到他。之前灌 FreeBSD 有提過 glabel

當硬碟、隨身碟插在不同的 port,名稱會變來變去。硬碟可能從 /dev/ad0 變成 /dev/ad1,隨身碟可能從 /dev/da3 變成 /dev/da7。原因是作業系統通常指認得硬體插在主機板上那一個 port。

如果插在不同電腦或 port 上名稱會改變是一件非常麻煩的事。因此,就會想給他一個固定的名稱。此時,glabel 就可以發揮公用。

因為 glabel 會將資料寫入硬體當中,因此必須先卸載裝置才能 label 上去。最簡單的方式就是重新開機,然後進入「single user mode」。

使用 glabel 前請先確認 kernel 是否有加 GEOM_LABEL 這個選項(GENERIC 預設有)或有 geom_label.ko 這個模組。沒有的話,請先重新編譯 kernel。

進入 single user mode 之後就可以開始下 # glabel label -v name dev-v 會增加訊息的詳細程度)。

之前灌新的 mail server 的時候,我就開始用 glabel 了(主要原因其實是建 RAID-Z)。按照 /etc/fstab 的順序 label 比較不會搞混或漏掉:

# glabel label -v swap /dev/ad4s1b
# glabel label -v root /dev/ad4s1a
# glabel label -v home /dev/ad4s1g
# glabel label -v tmp /dev/ad4s1e
# glabel label -v usr /dev/ad4s1f
# glabel label -v var /dev/ad4s1d

標完後可以用 # glabel status# glabel list 看結果:

# glabel status
       Name  Status  Components
 label/root     N/A  ad4s1a
 label/swap     N/A  ad4s1b
  label/var     N/A  ad4s1d
  label/tmp     N/A  ad4s1e
  label/usr     N/A  ad4s1f
 label/home     N/A  ad4s1g

確定 label 成功後就更新一下 /etc/fstab

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/label/swap         none            swap    sw              0       0
/dev/label/root         /               ufs     rw              1       1
/dev/label/home         /home           ufs     rw              2       2
/dev/label/tmp          /tmp            ufs     rw              2       2
/dev/label/usr          /usr            ufs     rw              2       2
/dev/label/var          /var            ufs     rw              2       2

下次開機就會使用這些 label 了。重新開機前,請再三確認 label 有成功和 /etc/fstab 沒有錯誤,因為沒弄好的話可能無法開機,需要用救援光碟去救回來。

這樣就完成了。Man page 上有更詳細的說明。

作者為dennylin93

2009/11/05 at 9:47 下午

OpenSSH

leave a comment »

熟悉 BSDUnixLinux 的人應該都聽過 SSH 這個協定。SSH 主要用途是遠端登入,不過也可以做 port forwarding、tunneling(通常用來鑽防火牆)、SOCKS 或用來傳檔案。SSH 之所以會出現是要取代 telnet 等程式,因為 telnet 連線未經過加密,容易被竊聽。

這篇會提到怎麼架 OpenSSH 和一些常用的指令。

大部分的 BSD、Unix、Linux 作業系統上都有 SSH 的程式,其中使用最廣泛的應該是 OpenSSH。OpenSSH 是由 OpenBSD 的開發者開發。

OpenSSH 是 OpenBSD 的一個部分,而開發的時候會釋出一個「portable」的版本,可以移植到其他作業系統。目前 FreeBSD 7.2 的 base 包含 OpenSSH 5.1p1

繼續閱讀文章 »

作者為dennylin93

2009/11/05 at 9:08 下午

阻擋 SSH brute force

有3則留言

架好 FreeBSD 或 Linux 之後,常常見到的一個現象就是 SSH 持續的遭受攻擊。在 security run output 會看到這樣的訊息:

ns.hs.ntnu.edu.tw login failures:
Oct 30 02:25:01 ns sshd[12801]: Invalid user master from 140.124.62.197
Oct 30 07:13:22 ns sshd[14529]: Invalid user globus from 213.99.38.3
Oct 30 07:13:31 ns sshd[14535]: Invalid user condor from 213.99.38.3
Oct 30 07:13:32 ns sshd[14534]: Invalid user cadi from 213.99.38.3
Oct 30 07:26:44 ns sshd[14591]: Invalid user simoni from 124.193.106.107

看到就覺得很煩,因為每天都有,而且若不阻檔的話,可能會有數千比,系統也有機會遭到入侵。

為了阻擋 SSH brute force,我在 FreeBSD 上裝了 security/sshguard-pfsshguard 的好處是他可以判別很多種紀錄檔,也支援許多種防火牆。另外,也可以調整多久時間內登入失敗幾次,還有要擋掉多久。

目前可以判讀這些軟體的紀錄檔:

支援的防火牆包含:

作者為dennylin93

2009/11/01 at 9:20 AM

簡單備份用的 shell script

leave a comment »

自從上週慘痛的經驗,已經打算將備份做完善一點。今天晚上寫了這個 shell script,用來備份系統資料、設定檔。因為檔案不多,只用 cptar 來完成,沒有用到 net/rsync

這個 shell script 還有很多要修改的地方(主要是讀取參數的部分),不過應該還可以用。

繼續閱讀文章 »

作者為dennylin93

2009/10/25 at 9:53 下午

張貼於FreeBSD, 電腦科學