Linux伺服器 Linux伺服器

網站伺服器建置與管理 - RockyLinux 9

網站伺服器建置與管理 > 課程內容 > 第 10 堂課 - 網頁伺服器 (Web Server) + FTP

第 10 堂課 - 網頁伺服器 (Web Server) + FTP

上次更新日期 2022/11/21

目前一般企業想到的『架站』通常就是架設一個 WWW (Web) 網站!這樣的網站格式主要又分為兩大陣營,其中使用率較高的就是 Linux 陣營! 我們這裡會介紹目前 Linux 上預設的網頁伺服器,就是名為 Apache 的伺服器!快來玩玩!

學習目標

  • 了解基礎的 LAMP 網頁伺服器結構
  • Apache 的設定檔、主網頁目錄、入口網頁檔名的理解等
  • 使用者家目錄 userdir.conf 的設定
  • 一般目錄特殊權限的設定
  • 加入 https 埠口的支援
  • 10.1: WWW 簡介
  • 10.2: Apache 基礎安裝與使用
  • 10.3: 常見的進階應用
  • 10.4: 網頁目錄的瀏覽控制
  • 10.5: 使用 https 瀏覽
  • 10.6: 課後練習

10.1: WWW 簡介

Web 最早是由 Tim Berners-Lee 爵士為了分享他實驗室的成果而開發出來的一個協定,使用的是 HTML 語法搭配 URL 網址列,就可以快速的取得資料。 再透過超連結的互相連結,讓 Web 在 1990 年代後期就開始熱門起來。為了讓資料有地方可以擺放,當然就需要 Server 提供正確的位址, 因此 Tim Berners-Lee 爵士撰寫出第一個網頁伺服器,稱為 httpd。

因為人腦對於數字的記憶比不上人名,因此 httpd 也是得要搭配上一章談到的 DNS ,這樣大家才方便連結到各個不同的主機器, 再搭配類似 google 的搜尋引擎,就可以讓資料在 Web 上面流通得很廣泛了。簡單的說, WWW 就是:

  • WWW 是 World Wide Web 的縮寫,其中 Web 有廣播網的意思存在, 所以簡稱為全球資訊網。
  • 使用 WWW 時,需要有 server 與 client 的架構,兩者間傳輸的資料如下:
  • 相關的 Server/Client 架構簡易說明如下:
    • WWW 伺服器不但需要一個可讓用戶端瀏覽的平台,還需要提供用戶端一些資料才行!
    • 上述伺服器所提供的最主要資料是超文件標籤語言 (Hyper Text Markup Language, HTML)、多媒體檔案 (圖片、影像、聲音、文字等,都屬於多媒體或稱為超媒體)。
    • HTML 只是一些純文字資料,透過所謂的標籤 (<tag>) 來規範所要顯示的資料格式;
    • 在用戶端,透過瀏覽器的對 HTML 以及多媒體的解析,最後呈現在使用者的螢幕上。
  • http 協定與 apache 軟體的開發

如前所述,WWW 是由 Tim Berners-Lee 爵士開發出來的,發展的協定稱為超文件傳輸協定 (Hyper Text Transport Protocol, HTTP), 為了讓這個協定可以順利的被應用在電腦上,因此 Tim 大約在 90 年代初期由伊利諾大學的國家超級電腦應用中心 (NCSA, http://www.ncsa.illinois.edu/) 開發出伺服器 HTTPd (HTTP daemon 之意)。

不過後來 HTTPd 這個伺服器的開發並沒有繼續延續下去,妥善率不是很好,於是一群社群朋友便發起一個計畫,這個計畫主要在改善原本的 HTTPd 伺服器軟體,他們稱這個改良過的軟體為 Apache,取其『一個修修改改的伺服器 (A patch server)』的雙關語!

這個 Apache 在 1996 年以後便成為 WWW 伺服器上市佔率最高的軟體了 (http://httpd.apache.org/)。甚至還自己推出自己的授權協議稱為 Apache 授權哩!

  • 什麼是 URL (Uniform Resource Locator)

雖然我們都暱稱 URL 為『網址列』,不過,實際名稱為 Uniform Resource Locator (統一資源定位位址)。基本上 URL 的格式有點像這樣:

  • <協定>://<主機位址或主機名稱>[:port]/<目錄資源>

在網頁上使用的協定為 http 或 https (傳輸資料有無加密),當然,瀏覽器上面還可以輸入類似 ftp:// 等協定。主機名稱就是 DNS 所設計的主機名稱為主 (雖然可以使用 /etc/hosts 的主機名稱,不過,除了內部傳輸之外,大部分當然使用的就是 DNS 主機名)。至於 :port 則是該協定啟動在非正規埠口的意思。 目錄資源則是該資料放在伺服器的哪個相對目錄的位置上。

  • 動態 WWW 伺服器

與我們一般說的會動的圖畫 (如 CSS 動畫或 GIF 動畫或影像資料) 不同,所謂的『動態』指的是網站的內容會隨時更新的意思,這才是所謂的動態網站。 為了達成動態網站,你在設計網頁時,當然就要使用網頁程式語言。這個網頁程式語言會主動到資料庫去撈取資料來顯示,同時, 也可以依據使用者的需求或點擊的特性,來給予適當的內容。因此,所謂的動態網站,你就得要有:

  • 適合的作業系統
  • WWW 伺服器平台
  • 網路資料庫系統: 須注意 WWW 伺服器與資料庫系統為兩個獨立的系統,因此需要透過網頁程式語言進行溝通
  • 網頁程式語言

在台灣,上述的環境常見的搭配軟體為:Linux + Apache + Mariadb + PHP --> LAMP (燈)

例題 10.1.A:
  1. 寫出第一個 HTTPd 瀏覽器與伺服器的作者名字為 (歐洲人喔!):
  2. 承上,這個 httpd 通訊協定,主要是想傳輸什麼資料?
  3. httpd 這個伺服器後來被社群單位接手繼續管理,接手後將 httpd 改名為什麼軟體?
  4. URL 網址指的是什麼樣式的網址列?
  5. 所謂的動態 WWW 伺服器當中的 LAMP 指的是什麼?

10.2: Apache 基礎安裝與使用

在 RockyLinux 9 上面預設的 WWW 伺服器就是 Apache,而 Apache 的軟體名稱在 RockyLinux 上面被稱為 httpd。

例題 10.2.A:
  1. 安裝:安裝 Apache 軟體
  2. 啟動:使用預設值啟動 Apache 軟體
  3. 開機啟動:設定開機會啟動這個軟體
  4. 防火牆:你的 Apache 軟體是對全世界放行的,請觀察或重新設定防火牆
  5. 測試:打開瀏覽器,輸入網址列的你的主機名稱,看看能否觀察到相關的網頁資料?
  6. 測試:同時請觀察已經啟動的埠口,是否有讓 httpd 啟動的號碼?

除了 GUI 界面的瀏覽器之外,我們也可以簡單的透過 curl 這個文字型瀏覽器,直接查看網頁的原始碼資料。 在終端機界面的環境下, curl 是個很好的瀏覽器測試工具!

  • RockyLinux 9 上預設的 Apache 設定

在 RockyLinux 9 上面,Apache 預設的項目有底下這幾個:

  • 基礎設定檔位於: /etc/httpd/conf/httpd.conf
  • 附加設定檔位於: /etc/httpd/conf.d/*.conf
  • 預設啟動埠口在: port 80
  • 預設伺服器管理員 email: root@localhost
  • 預設首頁目錄位於: /var/www/html
  • 預設首頁檔案檔名: index.html
  • 預設所有人均可以瀏覽網頁
例題 10.2.B:
  1. 請改用文字列瀏覽器 curl 檢查本機的網頁首頁
  2. 請將預設的首頁改成顯示你的大名與學號即可。
  3. 透過 curl 檢查看看能不能看到你修改的資料?
  • 修改基礎設定值

你當然可以修改預設的設定值,只是要自己承擔風險!舉例來說,如果你改了連線埠口,那麼就得要告訴別人你的連線埠口即將跑到類似如下的網址,否則將無法被瀏覽:

  • http://localhost:85/

為了避免困擾,底下僅告知一般來說,可能會被管理員更動的設定,其他詳細的設定請自行參考 httpd.conf 內的說明了。

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

Listen 80                     # 預設 Apache 的監聽埠口

ServerAdmin root@localhost    # 可以改成任何一個合法的 email address 即可!出問題時,螢幕會顯示出來!

DocumentRoot "/var/www/html"  # 就是預設的首頁目錄位置

<Directory "/var/www/html">   # 針對首頁目錄所進行的各項權限控制項目
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted       # 設定誰可以瀏覽的參數,詳細語法後續會談到。
</Directory>

<IfModule dir_module>         # 設定首頁檔名
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">                # 設定在本伺服器中,只要開頭檔名為 .ht 的檔案,就不可以被瀏覽
    Require all denied
</Files>

<IfModule alias_module>       # 指定 http://server/cgi-bin/ 為 CGI 的主要放置網址
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>        # 指定副檔名的其他功能
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    #AddHandler cgi-script .cgi
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

AddDefaultCharset UTF-8             # 指定預設的語系資料,通常可以直接註解即可!

# 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
例題 10.2.C:
  1. 多重埠口設計方式:
    1. 讓 httpd 可以啟動埠口在 80 以及 7788 兩個埠口,修改完畢之後立即重新啟動。 (你可能需要自己處理 SELinux 的問題)
    2. 承上,如何讓瀏覽器連結上 7788 這個埠口
    3. 承上,如何確認是連上 port 7788 (hint: 透過 netstat 觀察,而且可能需要透過連續指令下達,否則會看不到連線!)
    4. 承上,如果要讓 port 7788 對 internet 放行,該如何處理?
  2. 一般建議設定,不過,可能得要搭配 PHP 等伺服器網頁程式語言的協助才會看到成效!
    1. 讓管理員的 email 改為 student@mail.lanXX.dic.ksu
    2. 讓語系資料交給網頁自己管理,取消強制的 utf8 語系輸出
  3. 增加目錄所在的『首頁檔案』檔名設計:
    1. 當 index.html 找不到,會再找尋 welcome.html 或 default.html 等檔名作為首頁檔
    2. 當你在網址列輸入 http://localhost/checkwelcome/ 時,就會輸出 welcome.html 的內容,而 welcome.html 內容請填寫『this filename is welcome.html』即可

上面的例題中,如果你想要查看到 httpd 的連線行為,可能需要特別留意指令操作的速度。這是因為 httpd 連線的功能通常都是『射後不理』, 意思是,WWW server 將資料完全傳給 client 之後,該次連線就會中斷了!並不會持續連線等待用戶端的要求。

10.3: 常見的進階應用

基本上,上述的工作完成後,你的 Web 應該可以順利運做了。不過,在某些情況下,你可能還是得要修改一些設定,會讓你的系統運作的更好。

  • Apache 系統效能優化處理

預設的 apache 設定值讓你的 Web 伺服器可以提供小型企業的運作,佔用的 Linux 系統資源也比較少。不過,當你的網站開始大起來, 瀏覽的要求比較多的時候,可能會讓你的 Apache 有點卡卡延遲的情況發生。此時,你的 Apache 應該要佔用比較多的 Linux 資源才對, 才不會讓資源閒置結果讓 apache 效能無法提昇。

由於 Apache 針對系統資源的設定中,提供了數個基本的模組,分別是 worker, prefork, event 等,這幾個模組的設定,主要是放置在底下的設定檔當中:

  • /etc/httpd/conf.modules.d/00-mpm.conf

你可以自行前往查閱。不過,如果你想要知道目前的多執行緒模組 (Multi-Processing Module, MPM) 實際上用的是那一個,也可以透過底下的方式來查詢:

[root@localhost ~]# httpd -t -D DUMP_MODULES |grep mpm
 mpm_event_module (shared)

RockyLinux 9 使用的是 event 這個模組。當你使用 systemctl status httpd 時,應該會看到有預設數個程序在跑 (請立刻查看一下), 這就是 event 的預設值。如果你想要增加到 10 個預設的 httpd 程序,且未來最多可開到 30 個 httpd 的程序,同時給予一些其他的參數增加連線數, 那可以在 /etc/httpd/conf.d/mpm.conf 這個檔案 (預設不存在,自己手動設定) 增加如下的項目:

[root@localhost ~]# httpd -V
Server version: Apache/2.4.51 (Rocky Linux)
Server built:   Mar 21 2022 00:00:00
Server's Module Magic Number: 20120211:118
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE

[root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf
<IfModule mpm_event_module>
StartServers        10
MinSpareThreads     75
MaxSpareThreads    250
ThreadLimit         64
ThreadsPerChild     50
MaxRequestWorkers  300
MaxConnectionsPerChild    1000
MaxClients         500
</IfModule>

[root@localhost ~]# apachectl configtest
Syntax OK

[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl status httpd
例題 10.3.A:
  1. 依據上述的說明找到正確的模組,並且設定與上述相同的參數來處理 Apache 的資源使用情況
  2. 使用 systemctl status httpd 觀察整體程序的輸出是否比之前來的多。

由於 event 這個 MPM 機制會主動的降低 Apache 的 loading,因此,當你的用戶瀏覽的量很少時,httpd 的程序會主動的被降低喔! 你可以持續的 systemctl status httpd 查閱,就可以看到 process 的數量不會固定!

  • Apache 的個人首頁設定

一個主機預設只有一個首頁目錄,當然可以指定使用虛擬主機。不過,如果用在類似教學的環境下,想讓所有的學生都擁有自己帳號的個人首頁, 以方便學生自己上傳自己的網頁資料時,可以使用 apache 的內建個人首頁的設定喔。

你可能會看過類似如下的網址列:

  • http://your.host.name/~username/

後面那個網址『 /~username 』是否很像我們在 Linux 底下要搜尋某用戶的家目錄所使用的『 ll ~username 』呢!沒錯!那就是個人首頁。 預設的個人首頁是放置在 /home/username/public_html/ 目錄下,不過鳥哥不喜歡這個目錄名稱,比較喜歡單純的 /home/username/www/ 這樣的目錄名, 使用者也好記,我們也好管理。

個人首頁的設定預設是取消的,我們需要修改 /etc/httpd/conf.d/userdir.conf 這個檔案的內容才行!

[root@localhost ~]# vim /etc/httpd/conf.d/userdir.conf
<IfModule mod_userdir.c>
    UserDir www
</IfModule>
<Directory "/home/*/www">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

[root@localhost ~]# apachectl configtest
Syntax OK

[root@localhost ~]# systemctl restart httpd

上面的設定值一個是設定網頁目錄為 www ,另一個則是宣告該目錄擁有的權限這樣。另外,請務必觀察 httpd 與 homedir 有關的 SELinux 設定項目, 一定要啟用才行!

[root@localhost ~]# getsebool -a | grep http | grep home
httpd_enable_homedirs --> off

[root@localhost ~]# setsebool -P httpd_enable_homedirs on
[root@localhost ~]# getsebool -a | grep http | grep home
httpd_enable_homedirs --> on
例題 10.3.B: 處理個人首頁的方法
  1. 伺服器端的設定行為:
    • 先以上述的作法完成 userdir 的個人首頁設定
  2. 一般帳號建立個人首頁的情境處理:
    1. 建立一個名為 webuser1 的帳號,密碼設定為 thewebman ;
    2. 切換到 webuser1 的身份,然後在家目錄建立名為 www 的目錄,且在該目錄下新增 index.html 檔案, 檔案內容就設定為『 I am webuser1 』即可。
    3. 嘗試到瀏覽器瀏覽 http://your.server.name/~webuser1 看看出了什麼問題?
      1) 網頁上面顯示什麼訊息?
      2) access log 上面顯示什麼訊息?尤其是錯誤代碼的部份
    4. 3) error log 上面顯示什麼訊息?
    5. 請嘗試自行修改權限資料 (請務必使用最小可達成目的的權限!)
  3. 未來新建帳號都會具有個人首頁的情境處理:
    1. 在 WWW 伺服器上,若未來每個用戶新建時,都會自動擁有 www 目錄,且該目錄下都會有 index.html,內容為『 Personal web page !』, 又該如何處理?
    2. 上述動作完成後,請建立 webuser2 的帳號,同時修改好正確的權限,然後使用瀏覽器瀏覽,看看能否得到正確答案?
  • 以 FTP 提供個人用戶的網頁上傳

我們知道 ssh 可以提供類似 ftp 的功能來傳輸檔案,也可以直接使用 scp ,或者是類似 filezilla 等圖形界面軟體來傳輸網頁。 不過 ssh 並沒有對全世界放行,同時我們也不建議 ssh 對全世界放行。而且,ssh 的 chroot 需要比較多的技術支援。 因此,如果針對教學環境來說,反而使用傳統的簡易型 FTP 軟體更能有效的設定好個人用戶的資料上傳。

RockyLinux 9 提供了 vsftpd 這個簡易的安全的 FTP 伺服器,安裝好就能立刻使用了:

例題 10.3.C: 安裝與設計 FTP 伺服器
  1. 架設 FTP 伺服器階段 (需要那五個步驟呢?)
    1. 安裝 vsftpd
    2. 啟動 vsftpd
    3. 下次開機依舊可以啟動 vsftpd
    4. 設定好 Internet 可以連線到我的 FTP 埠口
    5. 在 /etc/sysconfig/iptables-config 裡面加入 nf_conntrack_ftp 以及 nf_nat_ftp 兩個常用的 FTP 模組。設定完畢後務必重新啟動 iptables 服務。
  2. 測試確認 FTP 系統的正確執行,同時更改伺服器匿名登入的測試
    1. 在瀏覽器輸入 ftp://your.hostname 確認可以使用匿名 FTP (RockyLinux 9 應該會失敗)
    2. 使用 systemctl status vsftpd 檢查看看到底我們用啥帳號登入的?
    3. 找 vsftpd.conf 這個 man page 的說明,輸入剛剛看到的匿名帳號資料,找到開啟匿名登入的設定後,修改 /etc/vsftpd/vsftpd.conf 的內容, 重新啟動 vsftpd 之後,再次測試是否能夠使用匿名登入了?
    4. 剛剛 systemctl status vsftpd 時,可以看到 tty 使用的是 ftp,能不能查出 ftp 的家目錄所在? 同時,直接查看 ftp 家目錄內容有啥?
    5. 在 /var/ftp/pub 底下丟入幾個檔案,再回上一步去確認有沒有新增檔案在 pub 目錄下了。
  3. 一般帳號使用 FTP 的方法:
    • 使用瀏覽器輸入 ftp://webuser1@your.hostname/ ,並輸入 webuser1 的密碼,來確認能否登入系統。
    • 測試能不能離開使用者家目錄,並且到其他任意的地方去?
  • vsftpd 可以匿名登入也能使用實體帳號登入
  • 匿名登入會主動跑到 /var/ftp 目錄下去瀏覽資料
  • 實體帳號預設可以離開家目錄,且能到系統任何有權限的目錄去瀏覽。

如上練習的最後一題,因為預設 vsftpd 會開放整個系統的瀏覽權,因此需要進行一些簡易的設定比較好。讓使用者無法離開家目錄才是比較正確的作法:

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES  # 這一行預設不存在,請自己加入喔!

[root@localhost ~]# touch /etc/vsftpd/chroot_list  # 寫入這個檔案的用戶才可以脫離家目錄

[root@localhost ~]# systemctl restart vsftpd

如此一來所有的用戶就能夠透過 FTP 來進行網頁的上傳下載囉!也可以透過 notepad++ 來進行線上編修網頁的作業了!

例題 10.3.D:一般帳號的 chroot 使用
  1. 依據上述的說明,完成 FTP 的 chroot 功能
  2. 透過用戶端瀏覽器的功能,測試能否連結到 FTP 伺服器,如 curl ftp://webuser1:thewebman@your.hostname/
  3. 測試能不能脫離家目錄?(curl ftp://webuser1:thewebman@your.hostname//)
  • 錯誤瀏覽訊息公告

你應該經常有的經驗,就是去瀏覽一個網頁時,對方告訴你 404 耶!什麼是 404 呢?這個是 Web 公認的幾個錯誤代碼~常見的錯誤代碼有:

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

一般來說,正常瀏覽與錯誤瀏覽的 log 記錄位置並不相同!你可以根據底下的檔案來找尋錯誤瀏覽的行為:

  • 正確瀏覽的登錄檔: /var/log/httpd/access_log
  • 錯誤瀏覽的登錄檔: /var/log/httpd/error_log

你可以根據 httpd.conf 裡面的註解資料當中找到 404 這種錯誤代碼的顯示行為。

例題 10.3.E:設定錯誤指引的網頁
  1. 在主設定檔當中,設定發生 404 找不到網頁時,會主動顯示 http://your.hostname/missing.html 這個檔案
  2. 增加 missing.html 這個檔案,內容請自訂 (通常是增加連結到主網頁即可)
  3. 故意輸入錯誤的網頁,能不能取得剛剛建立的 missing.html 內容?

使用 404 之後,你在 error_log 裡面,應該就不會出現找不到該檔案的錯誤訊息了!不過,在 access_log 裡面,該檔案的資料還是會出現 404 喔!

10.4: 網頁目錄的瀏覽控制

防火牆可以讓你的 httpd 整個被擋住或整個被放行。但想一想,某個目錄我想要保護在內網才能看,其他的則大家都能看。在這樣的情況下, 防火牆似乎就沒有辦法達成了!這個時候得要使用 apache 提供的相關功能來處理較佳。底下提供兩個方案來達成這個分別瀏覽的目的:

  • httpd 的目錄保護功能 (僅規範到的 IP 來源可以登入瀏覽)

我們使用的 apache 是 2.4 版,這一版與前一代使用的瀏覽權限設定完全不同,所以你得要注意版本的差異才行。基本上,針對目錄的權限瀏覽我們可以參考網頁根目錄的設定:

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

上面那個 Require 就是權限控制的重要參數。一般來說,常見的 Require 有底下的幾個基本語法:

  • 全部放行: 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
例題 10.4.A:有個目錄放置的資料僅針對內網放行,例如 http://your.hostname/private 這個目錄!
  1. 建立保護目錄:
    建立 private 目錄,且建立 private/index.html 檔案,內容為『This is private data!!!』即可
  2. 建立個別設定檔:
    假設為 /etc/httpd/conf.d/vbird.conf ,內容請針對上述目錄進行處理。其中,該目錄只有你的內網 (10.255.xx.0/24) 以及你自己 (127.0.0.0/8) 可以瀏覽,其他來源是不能瀏覽的。
  3. 重新啟動:
    請先檢查語法,若無問題請重新啟動 httpd 服務。
  4. 嘗試使用內網連線以及外網連線,測試該網頁是否能夠順利的瀏覽與不可瀏覽:
    http://localhost/private/
    http://localhost4/private/
    http://127.0.0.1/private/
    http://10.xxx/
    http://192.168../

因為 localhost 同時存在於 IPv4 與 IPv6 上面,因此使用上可能會產生一些問題~查看 /etc/hosts,發現到可單純使用 localhost4 指定為 IPv4 的 127.0.0.1 位址,這樣就不會有問題!

  • 建立使用密碼保護的瀏覽目錄

上述的動作雖然可以讓你的 Apache 保護某些目錄,不過,如果你經常出差,有時需要查閱該保護目錄時,會不會很麻煩?我是覺得很麻煩~ 所以,此時可以使用 Apache 提供的基礎密碼保護功能來處理。

密碼保護的設定有兩種模式:

  • 一種是寫死到主設定檔 (含 httpd.conf 以及 conf.d/*.conf 等檔案,接為主設定檔)
  • 一種則是透過受保護目錄底下的 .htaccess 修改設定來處理。不過要能使用 .htaccess 也需要主設定檔的支援才行。

你可能會覺得,既然主設定檔也需要修改才能支援 .htaccess , 那為何不直接寫入主設定檔即可?這是因為主設定檔修改完畢得要重新啟動 httpd ,而修改 .htaccess 只要改完立刻可以生效!無須重啟 httpd。 這對於一般帳號也想要設定密碼保護的情況來說,是相當有幫助的!針對可以使用 .htaccess 的目錄來說,需要增加底下的設定:

<Directory "/some/where">
	Options XXX
	AllowOverride AuthConfig
</Directory>

# systemctl restart httpd

接下來切換到該目錄下 (/some/where),建立一個名為 .htaccess 的檔案,這個檔案必須要 (1)指定密碼檔的檔名, (2)指定該密碼檔內可用以驗證的帳號。檔案內容大概像這樣

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

上述的 /some/auth/filename 檔案檔名是自己指定的,但是最好不要放在可被網頁瀏覽的目錄 (就是不要放在 /var/www/html/ 內!)。 至於該檔案的建立方案為:

[root@localhost ~]# htpasswd [-c] /some/auth/filename username
例題 10.4.B: 讓一般用戶的資料可以進行密碼保護
  1. 伺服器的設定檢查,注意,是找 httpd.conf 或 userdir.conf 或 vbird.conf 呢?
    • 先查閱使用者家目錄底下能否支援 AuthConfig 的設定!若不行,請修改成允許 override authconfig 喔!
    • 想想看,如果有更新,要不要重新啟動 httpd 呢?
  2. 用戶自己設定屬於自己的設定檔 (無須重新啟動 httpd 喔)
    1. 登入 webuser1 ,讓這個用戶的 http://your.hostname/~webuser1/protect/ 目錄是受密碼保護的,且內部 index.html 顯示『 This is protect directory 』
    2. 假設使用的密碼檔位於瀏覽器瀏覽不到的 /home/webuser1/apache.pw ,且帳號為 nobody 密碼為 iamnobidy
    3. 另一個 somebody 密碼為 hehesomebody ,也能放行這個目錄。
    4. 設定完畢務必瀏覽一次確認 (如果出現問題,請前往 /var/log/httpd/ 查看錯誤。同時,若為權限問題, 除了 rwx 之外,也請確認 SELinux 是否有問題!)

10.5: 使用 https 瀏覽

網頁一般都是不加密的,不過這樣的傳輸可能會出問題!因此,進來各主要供應商都建議無論你的資料為何,最好都提供加密的 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 這個模組即可!
例題 10.5.A:加入 https 的支援
  • 請安裝 mod_ssl 之後,並重新啟動 httpd,同時觀察是否啟動了 443 埠口?
  • 如何連線到 port 443 ?若有連線的憑證問題,如何查閱憑證資料並放行該次連線?
  • 若使用 curl 進行連線,又該如何加入參數?

10.6: 課後練習

  1. (70%)實作題:啟動 Server 作業硬碟 - unit10
    1. 網路參數的設定,請依據底下的方式來設定好你的網路環境:
      1. 因為我們的系統是 clone 來的,因此裡面的網路卡連線會跑掉。所以,請先刪除所有的連線界面後, 再依據底下的要求逐次建立好你的網路環境:
      2. 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.18.255.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      3. 使用 teamd 的機制建立內部區域網路的備援功能:
        • team 的界面使用 team0 卡號,且連線名稱請命名為 team0
        • team 使用 activebackup 備援功能,不要使用 loadbalance
        • team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
        • team0 網路參數為: 172.19.*.254/24,不需要 gateway
      4. 主機名稱指定為: server*.example.dic
      5. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 基本的伺服器作業系統設定行為:
      1. 使用崑山的 FTP 網站作為你的 YUM server 來源,來源倉儲至少需要涵蓋 BaseOS, AppStream, extras 等, 並且清除一次 yum 清單快取。(請注意,由於最終系統會全系統升級一次,升級後,這些設定檔可能會被更新。 因此,你在全部升級完畢之後,還需要回來修改這個設定檔喔!)
      2. 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, wget, bind-utils, kernel
      3. 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
      4. 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
    3. 實際設定好本機防火牆
      1. 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
      2. 將預設的規則轉存到 /root/firewall.sh 這個檔案內
      3. 首先將全部的規則刪除 (應該有三條指令)
      4. 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
      5. 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
      6. 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
      7. 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
      8. 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
      9. 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
      10. 重新啟動 iptables 服務,然後觀察規則是否正確
    4. 實際設定好 Server 的路由功能
      1. 讓核心支援 IP 轉遞的功能,並且每次重新開機都可以自動生效
      2. 修改 /root/firewall.sh ,在該檔案加入清除 nat 表格的規則與自訂鏈的設定
      3. 增加規則:讓來自內部網路的封包,在路由判斷後,並預計由 ens3 對外網卡出去的封包,全部偽裝成為 ens3 的 IP 位址 (一般在數據機上面的就是 public IP)
      4. 在 /etc/sysconfig/iptables-config 當中增加 nf_nat_ftp 及 nf_conntrack_ftp 模組功能
      5. 上述功能在開機後依舊能夠順利啟動
    5. 基礎 Apache 架設
      1. WWW 啟動的埠口會同時啟動於 port 80 與 port 1212 這兩個
      2. 管理員的 email 請設定為 student@server.lanXX.example.dic
      3. 取消強制使用 UTF8 的語系設定
      4. 設定 index.html, welcome.html, default.html 作為你的首頁檔名
      5. 當瀏覽 http://localhost 時,會顯示你的學號與姓名
      6. 讓你的伺服器可以同時提供 port 80 與 port 1212 的網路連線 (防火牆功能思考)
    6. 個人首頁的設定
      1. 針對個人首頁的 Apache 設定:
        • 瀏覽器瀏覽 http://localhost/~username 時,會顯示 /home/username/web/index.html 的內容
      2. 針對新建用戶的設計:
        • 預設建立新用戶時,該用戶的家目錄會存在一個名為 web 的目錄
        • 且內含一個 index.html 的檔案,檔案內容填寫『 Personal web page 』即可。
      3. 為了擔心個人用戶用爆系統容量,因此請設定好 /home 這個目錄的檔案系統得要支援磁碟容量配額 (quota) 的功能。
        • 若 /home 為獨立 partition,請根據既有的檔案系統設計磁碟配額檔案系統支援
        • 若 /home 並不存在獨立的 partition ,那你可能得要針對根目錄進行 quota 的設定 (雖然這不是個好建議!)。 但是 Linux 核心預設不能讓根目錄掛載為支援 quota,因此需要動點小手術。請參考 https://help.directadmin.com/item.php?id=557 來取得正確的 quota 支援。(註,我們只需要 userquota 即可, projectquota 可以不予理會)
      4. 大量批次建立帳號:建立一隻名為『 /root/webuser.sh 』的腳本
        • 建立一個名為 /root/webuser.txt 的檔案,/root/webuser.txt 的內容有點像這樣:
          alex
          dora
          hank
          
        • /root/webuser.sh 的腳本使用 for, do, done 的迴圈功能,會針對上述 /root/webuser.txt 的檔案進行如下動作:
          • 使用預設方式建立用戶,且用戶的密碼與帳號相同。
          • 建立用戶後,會給予該用戶 soft/hard 分別為 400MB/500MB 的可用磁碟容量
          • 讓該用戶的家目錄權限設定為 711
        • 建置完畢後請執行一次該腳本,並使用 http://localhost/~alex 確認該帳號是存在的! (很可能需要額外處理權限或者是 SELinux 的問題)
      5. 處理使用者透過 FTP 上傳/下載的問題:
        • 讓 alex, dora, hand 可以使用 ftp 上傳/下載資料到伺服器上
        • 且這三個用戶必須是 chroot 的使用環境。
        • 伺服器的防火牆必須要放行 FTP (注意 port 的放行以及 FTP 的相關模組設定與載入)
    7. 受保護目錄的建置
      1. 固定來源的目錄保護:
        • 在瀏覽 http://localhost/pro_one/ 這個網址時,會顯示『 This is protect one directory 』
        • 只有底下的 IP 或網域,才可以瀏覽上述網址,其餘來源則沒有權限瀏覽:
          127.0.0.0/8
          172.18.255.*/32
          172.19.*.0/24
      2. 密碼保護:
        • 在瀏覽 http://localhost/pro_two/ 這個網址時,會顯示『I am Protect two hehe 』的字樣。
        • 但是瀏覽時,會需要輸入帳號與密碼,帳號為 student 密碼為 student,輸入完畢才能瀏覽
        • 額外指定部份:
          • 請使用 .htaccess 的方式來處理這個題目
          • 假設密碼檔位於 /var/www/apache.pw 這個檔案內
          • 正確輸入帳密會顯示『 I am Protect two hehe 』的字樣。
  2. (10%)實作題:啟動 client 作業硬碟
    1. 網路參數的設定,請依據底下的方式來設定好:
      1. 因為我們的系統是 clone 來的,因此裡面的網路卡連線會跑掉。所以,請先刪除所有的連線界面後, 再依據底下的要求逐次建立好你的網路環境:
      2. 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.19.*.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      3. 主機名稱指定為: client.lan*.example.dic
      4. 最終你的主機名稱與 IP 的對應為:
        server*.example.dic	172.18.255.*		別名為 server*
        server254.example.dic	172.18.255.254		別名為 server254
        server.lan*.example.dic	172.19.*.254		別名為 server
        client.lan*.example.dic	172.19.*.1		別名為 client
        
    2. 實際設定好本機防火牆
      1. 預設請使用 firewalld 防火牆服務,不要使用 iptables 服務!
      2. 請將預設的領域 (zone) 改為 work 領域
      3. 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
      4. 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
      5. 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
  3. (20%)簡易問答題:(第一題 2 分,其餘 3 分) 從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
    1. 所謂的 LAMP Server 在 WWW 上面一般指的是什麼意思?
    2. 傳統 FTP 的傳輸有所謂的命令通道與資料流通道,這兩個通道分別透過哪個埠口進行資料連接?
    3. FTP 有所謂的 active mode 與 passive mode,請問這兩種模式是如何進行傳輸的?
    4. 為了解決因為 NAT 造成的 FTP 傳輸困擾,那兩個 iptables 模組可以被拿來做監聽的應用?
    5. 當在 apache 上面設計的網頁出問題,或者是 http 本身出問題,可以查詢那一個登錄檔
    6. 以『 apache code status 』為關鍵字到 google 查詢,查出 200, 403, 404, 500 這四個錯誤碼的實際意義為何 (必須翻譯為你自己了解的語意)?
    7. 查詢 httpd.conf 內的 Options 設定值,裡面的 Indexes, FollowSymLinks, ExecCGI 的意義為何?
  4. 上傳成績
    1. 請將 Server/Client 的硬碟通通啟動,並且確認兩者間的連線沒有問題;
    2. 在 Server 硬碟上面登入,然後用 root 的身份執行 vbird_server_check_unit ,並依據提示資料填寫你的學號與 IP 尾數
    3. 該程式會偵測你的系統,並且通知你哪個部份可能有問題,你需要持續觀察或者重新處理的部份會交代妥當。
    4. 若一切沒問題,螢幕就會出現如下的字樣,然後你就能夠使用 links 去檢查你的檔案是否有順利的上傳了!
    5. Please use links http://172.18.255.250/upload/unit10 to check your filename

  • 2022/11/21:將整體資料在 RockyLinux 9 上實作對題目的解釋稍微更新,同時修訂 ftp 連線直接加上密碼