Linux伺服器 Linux伺服器

伺服器建置實務上課教材

伺服器建置實務 > 課程內容 > 第 10 堂課 - 網頁伺服器 (Apache server) part2

第 10 堂課 - 網頁伺服器 (Apache server) part2

上次更新日期 2018/12/16

理解了 WWW 以及進行了基礎的 Apache 設定,同時開啟了個人首頁之後,接著下來,我們要開始處理一些比較複雜的資料。 最簡單的就是從錯誤連線給予引導的資訊,以及讓 http 傳輸加密 (https) 的功能,然後就是目錄保護與一些額外的基礎設定。 當然,還有算是挺重要的虛擬主機,也需要來理解理解才行。

  • 10.1: 錯誤網址的引導功能
  • 10.2: Apache 的目錄保護功能
  • 10.3: 使用密碼保護的目錄瀏覽功能
  • 10.4: 使用 https 瀏覽
  • 10.5: 虛擬主機的設定
  • 10.6: 本日練習

10.1: 錯誤網址的引導功能

預設的 Apache 在你輸入錯誤的網址之後,會回覆你 404 的一個頁面,然後告訴你找不到網址。 那接下來呢?完全就不理你了!要自己去修改網址才行。這樣對於一般用戶來說,真的不太方便。所以很多比較熱門的網站, 就會回報有問題之外,還會給予回到首頁的超連結,以及一些比較重要的連結,讓使用者可以回到原本的網站內容。 這就是優良的小地方。在開始這個設定前,先來理解一下 Apache 的紀錄代碼:

  • 100-199:一些基本的訊息
  • 200-299:用戶端的要求已成功的達成
  • 300-399:Client 的需求需要其他額外的動作,例如 redirected 等等
  • 400-499:Client 的要求沒有辦法完成(例如找不到網頁)
  • 500-599:主機的設定錯誤問題

主要的訊息代碼都可以在 access 或者是 error log 裡面找到!

  • 正確瀏覽的登錄檔: /var/log/httpd/access_log
  • 錯誤瀏覽的登錄檔: /var/log/httpd/error_log
完成底下的觀察:
  1. 前往 /var/log/httpd 目錄,並且觀察該目錄底下的檔名。
  2. 正常瀏覽的資訊觀察:
    • 打開瀏覽器,在網址列輸入 http://localhost
    • 觀察 access_log 最後幾行 (tail ...),並且嘗試分析時間、來源與存取的資料等訊息。
  3. 錯誤瀏覽的資訊觀察:
    • 打開瀏覽器,在網址列輸入 http://localhost/any_word_type
    • 觀察 error_log 最後幾行 (tail ...),並且嘗試分析時間、來源與存取的資料等訊息。
  • 主設定檔針對 404 的修改

你可以在 /etc/httpd/conf/httpd.conf 找到錯誤代碼為 404 的設定值,然後處理所需要的顯示項目來處理!

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
# Some examples:                    # 指定一些常見的錯誤顯示方式,須搭配 Web 常見的錯誤代碼
#ErrorDocument 500 "The server made a boo boo."
ErrorDocument 404 /missing.html     # 這一行解開註解!
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

[root@localhost ~]# systemctl restart httpd

要注意喔!是首頁目錄底下的 missing.html 檔名喔!

  • 建立錯誤引導檔案

你得要使用超連結來處理錯誤連結才行!不過,要記得,連結的資料,最好使用檔名即可!不要使用網址列! 例如 <a href="/">回到首頁</a> 這樣的情況來回到首頁去喔!

完成下列練習
  1. 增加 missing.html 這個檔案 (請用 vim ,同時要記得,這個檔案應該放在哪裡呢?)
  2. 裡面除了你的學號姓名之外,使用清單搭配超連結的方式,連線到 (1)首頁 (2)student 的個人首頁。

未來如果還有什麼其他需要增加的錯誤引導資訊,同樣放置在這個檔案內部即可!

10.2: Apache 的目錄保護功能

如果你不想要讓 a.b.c.d 這個 IP 瀏覽整個網站,可以使用 iptables 這方面的防火牆功能,將該 IP 的連線整個關掉即可。 但是,如果你只是不想要讓 a.b.c.d 這個 IP 瀏覽某個重要的 www 目錄而已,那就不能使用防火牆功能了!此時得要用 httpd 的目錄保護功能。

這個功能很常見喔!舉例來說,在崑山計中提供校內下載軟體的網站中,就會主動的分析瀏覽的來源 IP 是否是校內的來源, 如果是就放行,如果不是就給予抵擋!所以,這很重要的喔!

  • 主設定檔的修改方式

基本的語法可以參考主設定檔裡面的資訊,如下所示:

[root@localhost ~]# vim /etc/httpd/conf.d/httpd.conf
<Directory "/var/www/html"> 
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

常見的語法有下列方式:

  • 全部放行: Require all granted
  • 全部拒絕: Require all denied
  • 部份放行,針對主機名稱的部份: Require host client.host.name
  • 部份放行,針對 IP 的部份: Require ip 192.168. 192.168.0.0/16 10.0.0.0/24
完成底下的練習: 有個目錄放置的資料僅針對內網放行,例如 http://your.hostname/private 這個目錄!
  1. 建立 private 目錄,且建立 private/index.html 檔案,內容為『This is private data!!!』
  2. 修改主設定檔,內容請針對上述目錄進行處理。其中,該目錄只有你的內網 (192.168.40.0/24) 以及你自己 (127.0.0.0/8) 可以瀏覽,其他來源是不能瀏覽的。
  3. 請先檢查語法,若無問題請重新啟動 httpd 服務。
  4. 嘗試使用內網連線以及外網連線,測試該網頁是否能夠順利的瀏覽與不可瀏覽。

基本上,這個語法可以使用到多個目錄的設定上,根據你的資料重要性來處理後續的流程喔!

10.3: 使用密碼保護的目錄瀏覽功能

雖然可以設定固定 IP 來放行目錄的使用,但是如果需要在外網連線到該目錄瀏覽,就會產生很多的困擾。 此時我們可以透過『輸入帳號與密碼』來登入查詢該目錄的功能!而要達成此功能,通常你需要:

  1. 在檔案系統上,先建立需要的受保護目錄,並且確認網址與目錄檔名。
  2. 針對該目錄,修改主設定檔內的設定值。
  3. 在受保護目錄底下建立名為 .htaccess 的檔案
  4. 根據 .htaccess 的檔案,設定好所需要的帳號與密碼 (與 Linux 帳號無關)

底下我們就一步一步來處理這個動作:

  • A. 建立受保護的目錄

假設要管制 http://localhost/pass/ 目錄,就需要設定 /var/www/html/pass 這個目錄才行,建立好之後,在該目錄下的 index.html 內容增加:『 This is password control file 』的字樣。

[root@localhost ~]# cd /var/www/html
[root@localhost html]# mkdir pass
[root@localhost html]# cd pass
[root@localhost pass]# vim index.html
This is password control file
  • B. 更改主設定檔設定值

在主設定檔裡面增加一些設定才可以!

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

<Directory "/var/www/html/pass"> 
    Options Indexes FollowSymLinks
    AllowOverride AuthConfig
    Require all granted
</Directory>

[root@localhost ~]# apachectl configtest
[root@localhost ~]# systemctl restart httpd
  • C. 增加 .htaccess 影響其設定

在 pass 目錄下增加檔名為 .htaccess 的設定修改檔,內容會有點像這樣:

[root@localhost ~]# cd /var/www/html/pass
[root@localhost pass]# vim .htaccess
AuthType	basic
AuthName	"你要顯示到彈出式視窗的文字"
AuthUserFile	/var/www/apache.pass  <==這個檔案需要額外建置
require user 	webadmin              <==只針對某些用戶放行
# require valid-user                  <==所有記載在密碼檔的用戶均放行

上面我們假設有個密碼檔,檔名為 /var/www/apache.pass,另外,在該檔案內有個帳號名稱為 webadmin 這樣。 這兩個都是可以隨你喜好設定的!只是,不要將檔案放在可能被 apache 瀏覽到的地方即可。例如 /var/www 就是個不錯的地方。 檔名可以隨便你取~

  • D. 建立密碼檔與帳號資料

最終建立上述的 /var/www/apache.pass 檔案,建立的方法如下:

[root@localhost ~]# htpasswd [-c] /var/www/apache.pass  webadmin
# -c 會刪除後面的檔案後新增一個全新的!所以,除了第一次建立之外,額外加上的帳號不要用 -c 參數

請完成上述練習,然後到瀏覽器上輸入 http://localhost/pass/ 看會出現什麼訊息!

10.4: 使用 https 瀏覽

網頁一般都是不加密的,不過這樣的資料傳輸在網際網路上可能會出問題!例如,前一個案例中, 我們會輸入帳號與密碼耶~如果被竊取怎麼半?因此,近來各主要 Web 供應商都建議無論你的資料為何,最好都提供加密的 https 瀏覽為宜。 那麼 https 到底是什麼呢?

  • 使用類似 sshd 的金鑰系統,透過 SSL (Secure Socket Layer) 的方式來處理這樣的金鑰系統。 而啟動的埠口會預設啟動於 443 上面。
  • 由於 server 的 public key 預設是可以散佈在 internet 上面的,因此,public key 很可能會被竊取。 為此,合法的網址 (URL) 通常都會將自己的 public key 製作成為憑證,讓網址與憑證一致, 再將憑證註冊進合法的第三公正單位資料庫 (Certification Authorities) ,則未來用戶端瀏覽器要瀏覽這個網址時, 會將取得的憑證與 CA 資料庫進行比對,以確定該網址確實就是某公司的註冊這樣。
  • 雖然有時候你覺得你的網站資料並不是非常重要,但是,近期以來,幾乎所有的大型 WWW 伺服器都將網站使用 https 來瀏覽了!所以大家也需要考慮一下,是否有此需求才好!
  • Apache 使用的 https 機制,只需要加上 mod_ssl 這個模組即可!
完成底下的練習:
  1. 請安裝 mod_ssl 之後,並重新啟動 httpd,同時觀察是否啟動了 443 埠口?
  2. 如何連線到 port 443 ?若有連線的憑證問題,如何查閱憑證資料並放行該次連線?
  • 讓 http 與 https 主網頁分離

一般來說,如果有加密與不加密的 WWW 網頁時,你可能會希望將兩者分開。舉例來說,讓你的 https 負責需要加密的 open webmail,而 http 則負責不加密的一般網站。

事實上,CentOS 7 的 mod_ssl 的設定檔已經預設規劃好虛擬主機的參數了, 你可以直接解開註解來使用即可。主要是透過兩個資料:

[root@localhost ~]# vim /etc/httpd/conf.d/ssl.conf
DocumentRoot "/var/www/html"
ServerName www.example.com:443

將上述的目錄改成你要放置的目錄,而主機名稱改成你要的主機名稱,就能夠分開了!當然,主機名稱也可以不寫~此時就是所有的 port 443 都將移動到你指定的目錄喔!

完成底下的練習:
  1. 假設我要讓加密的資料放置在 /var/www/https 這個目錄內,請先建立它,並且在該目錄內的 index.html , 加入『 I am https web here 』的字樣顯示。
  2. 修改設定檔 ssl.conf ,讓設定可以指向正確的目錄喔!
  3. 使用瀏覽器輸入 https://localhost 與 http://localhost 看看有沒有不同!

10.5: 虛擬主機的設定

一部主機只有一個 /var/www/html 而已,因此,一部主機是否只能有一個主網頁呢?當然不是!我們在 http 以及 https 就可以發現, 兩者的主網頁是可以不一樣的!只要將兩個設定值搞定,就可以讓不同的主機名稱連線到不同的首頁目錄去了!這兩個設定值就是:

<VirtualHost *:80>
	ServerName 	主機名稱
	DocumentRoot 	首頁目錄
</VirtualHost>

意思是,當 apache 分析到某個主機名稱時,就給予某個目錄的瀏覽主頁目錄的功能之意,因此,當你的這個伺服器的 IP 擁有多個不同的主機名稱時,就可以擁有不同的首頁目錄的意思了。

  • 預先要求:要有多個主機名稱對應同一個 IP

要達成這個所謂的『虛擬主機』的功能,你得要有多個主機名稱才可以。問題是,我們課程裡面沒有談到 DNS 的主機名稱設定耶! 沒關係,你可以先用假的主機名稱來處理。未來如果你要有真的主機名稱,那麼你得要有實際的 public IP 之外, 也得要跟 ISP 申請主機名稱才可以!最簡單的 DNS 申請方法,可以參考 hinet 的網站介紹:

我們在內網,可以使用假的主機設計方式,就是直接修改 /etc/hosts 來假裝假裝即可。

完成底下的練習:
  1. 在 /etc/hosts 裡面設計底下的主機名稱,讓該名稱與你的 IP 對應起來:
    • www.pcXX.dic.ksu
    • web.pcXX.dic.ksu
    • ftp.pcXX.dic.ksu
  2. 設計完畢後,請使用 ping www.pcXX.dic.ksu, ping web.pcXX.dic.ksu, ping ftp.pcXX.dic.ksu , 看看是否有正確的回應你的 IP 了!
  3. 承上,問你旁邊的同學的 IP 尾數,同樣的將他的 IP 與主機名稱的對應寫進去 /etc/hosts, 然後一樣的 ping 一下,看看是否正確的回應了。
  • 事先定義目錄與主機名稱對應

我們的首頁還是預設為 /var/www/html ,不過,還有 www, web, ftp 三個主機名稱!我們假設 www 就是放在 html , 接下來我們假設這樣的情況:

  • www --> /var/www/html
  • web --> /var/www/web
  • ftp --> /var/www/ftp

現在讓我們來處理這些目錄吧:

[root@localhost ~]# cd /var/www
[root@localhost www]# mkdir web ftp
[root@localhost www]# echo  "This is web server"  >>  www/index.html
[root@localhost www]# echo  "This is FTP server"  >>  ftp/index.html
  • 主設定檔的重新設定

接下來也是很單純,直接處理底下的任務就結束了:

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
	ServerName 	www.pcXX.dic.ksu
	DocumentRoot 	/var/www/html
</VirtualHost>
<VirtualHost *:80>
	ServerName 	web.pcXX.dic.ksu
	DocumentRoot 	/var/www/web
</VirtualHost>
<VirtualHost *:80>
	ServerName 	ftp.pcXX.dic.ksu
	DocumentRoot 	/var/www/ftp
</VirtualHost>

[root@localhost ~]# apachectl configtest
[root@localhost ~]# systemctl restart httpd

最後,打開瀏覽器,分別輸入不同的主機名稱,看看有沒有正確的顯示你預計要顯示的網頁內容,那就是 OK 啦!

10.6: 本日練習

現在來複習一下今日的動作,作為本日的點名與查驗資訊。請在目前的雲端機器上面完成底下的實做,要完成且讓老師檢查完畢後,才可以離開教室喔!

  1. 當使用者輸入了有問題的 URL 時,在錯誤回報的網頁中,增加 www.pcXX.dic.ksu, web.pcXX.dic.ksu, ftp.pcXX.dic.ksu 的超連結, 讓使用者可以點選直接去到該網頁。
  2. 讓 http://www.pcXX.dic.ksu/check1/ 這個網址,只有你的 IP 才能夠瀏覽,其他來源的 IP 不可以瀏覽。且瀏覽時,會顯示『 This is exam check1 』的訊息
  3. 讓 http://www.pcXX.dic.ksu/check2/ 這個網址,只有輸入帳號 www 密碼 123456 才能夠登入瀏覽。 且瀏覽時,會顯示『 This is exam check2 』的內容。
  4. 增加一個名為 server.pcXX.dic.ksu 的主機名稱對應到你的 IP,然後當瀏覽 http://server.pcXX.dic.ksu 時,會主動的來到 /var/www/server/ 這個目錄去!且瀏覽時,會顯示『 This is server page 』。