第 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
- 前往 /var/log/httpd 目錄,並且觀察該目錄底下的檔名。
- 正常瀏覽的資訊觀察:
- 打開瀏覽器,在網址列輸入 http://localhost
- 觀察 access_log 最後幾行 (tail ...),並且嘗試分析時間、來源與存取的資料等訊息。
- 錯誤瀏覽的資訊觀察:
- 打開瀏覽器,在網址列輸入 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> 這樣的情況來回到首頁去喔!
- 增加 missing.html 這個檔案 (請用 vim ,同時要記得,這個檔案應該放在哪裡呢?)
- 裡面除了你的學號姓名之外,使用清單搭配超連結的方式,連線到 (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
- 建立 private 目錄,且建立 private/index.html 檔案,內容為『This is private data!!!』
- 修改主設定檔,內容請針對上述目錄進行處理。其中,該目錄只有你的內網 (192.168.40.0/24) 以及你自己 (127.0.0.0/8) 可以瀏覽,其他來源是不能瀏覽的。
- 請先檢查語法,若無問題請重新啟動 httpd 服務。
- 嘗試使用內網連線以及外網連線,測試該網頁是否能夠順利的瀏覽與不可瀏覽。
基本上,這個語法可以使用到多個目錄的設定上,根據你的資料重要性來處理後續的流程喔!
10.3: 使用密碼保護的目錄瀏覽功能
雖然可以設定固定 IP 來放行目錄的使用,但是如果需要在外網連線到該目錄瀏覽,就會產生很多的困擾。 此時我們可以透過『輸入帳號與密碼』來登入查詢該目錄的功能!而要達成此功能,通常你需要:
- 在檔案系統上,先建立需要的受保護目錄,並且確認網址與目錄檔名。
- 針對該目錄,修改主設定檔內的設定值。
- 在受保護目錄底下建立名為 .htaccess 的檔案
- 根據 .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 這個模組即可!
- 請安裝 mod_ssl 之後,並重新啟動 httpd,同時觀察是否啟動了 443 埠口?
- 如何連線到 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 都將移動到你指定的目錄喔!
- 假設我要讓加密的資料放置在 /var/www/https 這個目錄內,請先建立它,並且在該目錄內的 index.html , 加入『 I am https web here 』的字樣顯示。
- 修改設定檔 ssl.conf ,讓設定可以指向正確的目錄喔!
- 使用瀏覽器輸入 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 來假裝假裝即可。
- 在 /etc/hosts 裡面設計底下的主機名稱,讓該名稱與你的 IP 對應起來:
- www.pcXX.dic.ksu
- web.pcXX.dic.ksu
- ftp.pcXX.dic.ksu
- 設計完畢後,請使用 ping www.pcXX.dic.ksu, ping web.pcXX.dic.ksu, ping ftp.pcXX.dic.ksu , 看看是否有正確的回應你的 IP 了!
- 承上,問你旁邊的同學的 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: 本日練習
現在來複習一下今日的動作,作為本日的點名與查驗資訊。請在目前的雲端機器上面完成底下的實做,要完成且讓老師檢查完畢後,才可以離開教室喔!
- 當使用者輸入了有問題的 URL 時,在錯誤回報的網頁中,增加 www.pcXX.dic.ksu, web.pcXX.dic.ksu, ftp.pcXX.dic.ksu 的超連結, 讓使用者可以點選直接去到該網頁。
- 讓 http://www.pcXX.dic.ksu/check1/ 這個網址,只有你的 IP 才能夠瀏覽,其他來源的 IP 不可以瀏覽。且瀏覽時,會顯示『 This is exam check1 』的訊息
- 讓 http://www.pcXX.dic.ksu/check2/ 這個網址,只有輸入帳號 www 密碼 123456 才能夠登入瀏覽。 且瀏覽時,會顯示『 This is exam check2 』的內容。
- 增加一個名為 server.pcXX.dic.ksu 的主機名稱對應到你的 IP,然後當瀏覽 http://server.pcXX.dic.ksu 時,會主動的來到 /var/www/server/ 這個目錄去!且瀏覽時,會顯示『 This is server page 』。