Linux伺服器 Linux伺服器

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

網站伺服器建置與管理 > 課程內容 > 第 11 堂課 - 進階網頁伺服器設定 + proxy

第 11 堂課 - 進階網頁伺服器設定 + proxy

上次更新日期 2022/11/23

完成基礎的 Apache 應用後,再來我們要實際架設一個多功能的 Apache 了!除了常見的 virtualhost 讓你的 WWW 伺服器可以提供多個首頁目錄之外, 我們也要將加密與不加密的網頁分開,不再共用同一個主機名稱。而最終的目的當然是處理一個動態網站的建置!另外, 在資傳系,我們管理系統都使用 web 界面,但是過去已經寫了好多的 shell 腳本!因此,如何透過 PHP 以 root 的身份去執行重要的腳本檔案, 也是另一個需要被關注的議題!

學習目標:

  • 理解與實際設定 Apache 的虛擬主機 (virtual host)
  • 動態 Web server 的設定,尤其是資料庫的應用
  • 透過 PHP 結合,讓 apache 用戶能執行系統腳本
  • 11.1: 虛擬主機 virtualhost 的設定
  • 11.2: 讓 http 與 https 主網頁分離
  • 11.3: 動態 WWW 伺服器建置
  • 11.4: 讓 PHP 網頁可以使用 root 權限呼叫 shell script
  • 11.5: WGSI 網頁支援
  • 11.6: squid proxy server 架設
  • 11.7: 課後練習

11.1: 虛擬主機 virtualhost 的設定

通常我們跟企業合作去建立一個網站,最重要的是申請主機名稱,然後才是架站,然後放上網頁資料這樣。申請主機名稱與 DNS 有關,當你申請好主機名稱之後, 在網址列只要輸入 http://your.hostname 就搞定了。那我們知道一個 Apache 可以提供一個首頁目錄...這不對吧!如果我們公司有四、五個部門, 每個部門都要有自己的主機名稱與首頁,主機名稱還容易搞定 (DNS 設定多個主機名稱 A 記錄即可),但是 Apache 要花費多個主機來架設,實在有點不合理啊! 沒關係!這時透過 Apache 的虛擬主機功能就搞定了!

所謂的虛擬主機 (VirtualHost) 指的是讓不同的主機名稱可以對應到不同的主網頁去,感覺就好像有多個伺服器提供個別的服務這樣。 其實,最簡單的想法,就是讓『一個主機 (ServerName) 對應到一個首頁目錄 (DocuementRoot) 』而已!舉例來說,我們的 server.lanXX.dic.ksu 會使用 /var/www/html, 而 www.lanXX.dic.ksu 則對應到 /var/www/www 的話,那麼兩個主機名稱就分別使用不同的首頁目錄,這當然就達成多個網站的服務了!

DocumentRootServerName
/var/www/htmlserver.lanXX.dic.ksu
/var/www/wwwwww.lanXX.dic.ksu

至於設定則是相對的簡單啊!只要將底下的設定寫入自己的設定檔即可:

[root@localhost ~]# vim /etc/httpd/conf.d/yourfile.conf
<VirtualHost *:80>
    ServerName    server.lanXX.dic.ksu
    DocumentRoot  /var/www/html
</VirtualHost>

<VirtualHost *:80>
    ServerName    www.lanXX.dic.ksu
    DocumentRoot  /var/www/www
</VirtualHost>

<Directory "/var/www/www">
	Options xxx
	AllowOverride xxx
	Require all granted
</Directory>

比較需要注意的是,『不是只要設定第二個主機名稱即可,原先預設的主機名稱也是需要設定成為虛擬主機』,這也就是說:『 如果未來有其他新設的主機名稱,但是該主機名稱並沒有寫入設定檔時,則會拿第一個虛擬主機的設定來作為展示的目錄』。

例題 11.1.A: 以 root 身份設定簡單的虛擬主機
  1. 先使用 dns 的 dig 查詢功能,測試上述的 server, www 主機名稱是否對應到同一個IP,若不是,請自行修改 DNS 設定, 或者先使用 /etc/hosts 進行對應。
  2. 前往 /var/www 之後建立 www 目錄,並且在 www 目錄下建立 index.html 檔案,內容就寫『 This is virtual host www 』即可。
  3. 依據上述說明建立好你的虛擬主機,先測試設定檔語法,然後重新啟動 httpd,查看一下狀態是否正常。
  4. 增加 ftp.lanXX.dic.ksu 這個虛擬主機連結到 /var/ftp 底下,且允許使用類似 FTP 的展示方式來處理檔案的顯示 (Options 的設計)

另外,架設虛擬主機的另一個原因,是因為有同事或者是客戶需要一個網站的緣故,因此虛擬主機可能並不是你要使用的!亦即是該主機名稱是給用戶管理的。 所以,你可能得要注意『目錄的權限』,因為要放行給其他客戶來上傳/下載網頁的緣故啊!例如底下的綜合練習:

例題 11.1.B: 含有權限設定功能
  1. 假設你的系統因為當初安裝規劃的關係,容量較大的 partition 位於 /srv 底下,因此後來客戶要求要架設相關網暫時, 你預計客戶的網站資料要放在 /srv 當中。
  2. 假設客戶需要的帳號為 cola,密碼為 thiscola,且該帳號的家目錄預計放置於 /srv/cola/ 當中,同時,這個帳號是無法登入取得互動 shell 的。
  3. 假設客戶需要的主機名稱已經設定好為 cola.lanXX.dic.ksu (若不存在,請自行設定 DNS 來處理妥當),請依據上述的虛擬主機來設定, 同時 cola 客戶也需要 .htaccess 檔案應用的支援。
  4. 客戶要求要使用 FTP 功能來協助上傳/下載網頁。
  5. 客戶要求要使用 Samba 功能來協助上傳/下載網頁,且假設客戶的 IP 為固定的 172.17.1.1

其實上面這個題目『相當困難』!尤其在 SELinux 為啟動的情況底下!你需要進行很多次的修改!

  • SELinux 安全本文的修改:
    比較重要的是, /srv/cola 的 SELinux 必須要是什麼安全本文類型?因為網頁需要用到 httpd_sys_content_t,SAMBA 則需要 samba_share_t,更不用說 FTP 也很不一樣。因為我們要支應所有的服務,因此,就得要放行最大的類別!那就是 public_content_rw_t 這個類別!
  • SELinux 的其他設定:
    如果你測試了 Samba 的話,那就會發現...可以掛載但是無法寫入!請嘗試過類似 touch 的指令之後,查詢 /var/log/messages 的內容, 再根據出現的資訊,慢慢進行修訂!
  • FTP 用戶端的使用:
    因為 cola 使用的應該是 /sbin/nologin,如此一來,你需要將這個 shell 寫入到 /etc/shells 才行!否則恐怕無法使用 FTP 服務的。

11.2: 讓 http 與 https 主網頁分離

一般來說,如果有加密與不加密的 WWW 網頁時,你可能會希望將兩者分開。舉例來說,讓你的 https 負責需要加密的 open webmail,而 http 則負責不加密的一般網站。 此時,你應該可以想到上面提到的虛擬主機的功能。事實上,RockyLinux 的 mod_ssl 的設定檔已經預設規劃好虛擬主機的參數了, 你可以直接解開註解來使用即可。

例題 11.2.A:完成底下的虛擬主機練習
  1. 假設你已經安裝了 mod_ssl 這個軟體,請使用 rpm 列出這個軟體的所屬檔案檔名有哪些?
  2. 讓你的 https 協定會主動的瀏覽 /var/www/https 這個目錄的內容,且該目錄的 index.html 會顯示『 I am https web here 』
  • 自製專屬憑證資料

因為瀏覽器會去檢查你的網址列與憑證的主機名稱是否相同,如果網址列的主機名稱與憑證名稱並不相同時,許多瀏覽器就會顯示錯誤而不給連線。 因此,我們可能得要修改憑證才行。此時就需要重新製作憑證了。

其實憑證的製作方式與之前 LDAP 的環境差不多,不過這裡我們使用另一個 RockyLinux 預設提供的方法來處理!方法如下:

  1. 進入 /etc/pki/tls/certs 後,使用第七章談到的 openssl 製作一對給 apache 使用的 key,使用的指令應該是:
    # openssl req -new -x509 -nodes -out {公鑰檔名}.crt -keyout {私鑰檔名}.key -days 3650
    
  2. 將 {私鑰檔名}.key 挪到 /etc/pki/tls/private 底下,並將權限修訂成為 400 (或 600)。
  3. 接下來請到 /etc/httpd/conf.d/ssl.conf 裡面調整 localhost.crt 與 localhost.key 的項目,重新啟動 httpd 即可!
例題 11.2.B: 讓你的 https 具有自己的專屬憑證
  1. 製作憑證:
    • 依據上述說明建置憑證,假設憑證的檔名都是 dicksu 這一個 (dicksu.crt, dicksu.key)
    • 注意輸入主機名稱時,一定要與你的連線主機名稱相同 (例如 server.lan200.dic.ksu)
  2. 修改設定:
    • 前往 ssl.conf 設定好然後在網址列輸入你的對外主機名稱,測試是否能夠順利的瀏覽。
    • 使用 firefox 瀏覽 https 伺服器,在列出詳細資訊時,查詢是否正確為自己的設定
    • 注意,在 firefox 的網址列,輸入的必需要是你的憑證紀錄所輸入的主機名稱才行!
    • 若僅有文字瀏覽器,可用 curl -k -v https://your.server.name 處理

11.3: 動態 WWW 伺服器建置

如前一章所提到的 LAMP 伺服器,我們還差了資料庫與網頁程式語言需要安裝。一般來說,需要的軟體有:

  • 作業系統:Linux
  • 網頁伺服器:httpd
  • 資料庫伺服器:mariadb, mariadb-server
  • 伺服器端網頁程式語言:php, php-mysqlnd (舊版為 php-mysql)

此外,資料庫是獨立於 WWW 伺服器之外的,因此也需要自行安裝與處理。

例題 11.3.A:完成 Mariadb 與 PHP 的安裝與設定
  1. 安裝資料庫系統與伺服器端網頁程式語言,並啟動網路資料庫系統:
    • 請安裝 mariadb, mariadb-server, php, php-mysqlnd 等軟體
    • 完成後請不要重新啟動 httpd,留待下一個例題才啟動。
    • 啟動 mariadb 服務,啟動完畢後觀察是否啟動埠口?觀察是否有開機啟動?
  2. Mariadb 網路資料庫系統的簡易操作:
    先使用 mysql -u root 來嘗試無密碼登入資料庫看看:
    • 使用『 show databases; 』查看所有資料庫
    • 使用『 use mysql; 』切換到 mysql 資料庫
    • 使用『 show tables; 』查看這個資料庫所含有的資料表
    • 使用『 describe user; 』來查看這個資料表內的各個資料欄位
    • 使用『 select * from user; 』來顯示所有的資料內容
    • 使用『 select * from user where Host = 'localhost'; 』來規範條件
    • 最終使用『 exit 』來離開資料庫。
  3. 進行本機資料庫的安全強化:
    • 由於預設 mariadb 沒有設定 root 密碼,因此執行 mysql_secure_installation 依序完成安全強化作業 (設定 root 密碼為 2727175 看看,其他幾乎均按下 enter 即可!)
    • 分別使用『 mysql -u root [-p] 』來嘗試無密碼、有密碼的登入行為。
  4. 取消、加入網路連線的資料庫功能:
    • 先以 netstat -tulnp | grep mariadb 找到 mysql 啟動的埠口預設是幾號?
    • 如果這個資料庫系統不是給 apache 等網路環境用的,可以取消網路連線 (port會關閉), 修改 /etc/my.cnf.d/mariadb-server.cnf ,在 [mysqld] 裡面新增一行『 skip-networking 』後,重新啟動 mariadb 即可!啟動完畢請查閱 3306 是否依舊存在呢?
    • 承上,將上述的 skip-networking 註解掉,重新啟動 mariadb,觀察 3306 是否恢復服務了?

PHP 是嵌入於 apache 的一個模組,所以,如果修改了任何 php 的資訊,一定要重新啟動 httpd 才行。

例題 11.3.B:初次執行 PHP 程式
  1. Apache 尚未支援 PHP 之前的程式碼顯示問題:
    • 在尚未重新啟動 httpd 前,請先前往 /var/www/html 建置名為 phptest.php 的檔案,檔案內容如下:
      [root@localhost ~]# vim /var/www/html/phptest.php
      <?php
              phpinfo();
      ?>
      
    • 使用瀏覽器瀏覽 http://localhost/phptest.php ,看看能否看到實際的資料展示?
    • 重新啟動 httpd,然後重新觀察上面的網址,看看出現什麼變化?
  2. php-fpm 加速軟體的安裝與觀察:
    • 檢查系統是否有安裝 PHP 加速軟體: php-fpm,使用 rpm -qi php-fpm 與 rpm -ql php-fpm 檢查相關的說明與所屬檔案檔名。 重點是找出設定檔所在喔!
    • 查詢 /etc/php-fpm.conf 以及 /etc/php-fpm.d/www.conf 的相關內容,簡易查詢一下 error 關鍵字
    • 使用『 curl http://localhost/phptest.php | grep -i error_log 』,看看錯誤訊息放在哪裡了?
  3. PHP 程式碼錯誤,需要處理的流程參考:
    • 重新編輯 phptest.php ,隨便加上幾個字,例如加入莫名其妙的『 hehe 』在 phpinfo() 之前,儲存之後再次以瀏覽器觀察 phptest.php 的內容。
    • 此時請前往上一題找到的 error log 目錄與檔案,觀察 error_log 的內容 (看最後面幾行資料),確認問題的所在。
    • 確認修改完畢後,再次觀察上述網址。

也就是說,當你發現到 *.php 的檔案顯示的竟然是 PHP 的程式碼時,那就是你的網頁伺服器並沒有支援 PHP 的關係!此時請安裝 PHP 然後重新啟動 httpd 即可。 現在,你的系統已經可以支援動態網頁的設計了!

另外,其實資料庫也是可以多人共用的環境!而資料庫的管理員就是 root 。目前我們已經設定好 Mariadb 的 root 管理員,不過,一般使用資料庫時, 則不建議使用 root,否則被綁架很麻煩。那麼如何建置 Mariadb 的使用者呢?舉例來說,你想要建立的帳號/密碼/資料庫如下:

  • 資料庫: dicdb
  • 主機名稱: localhost
  • 帳號: dicuser
  • 密碼: dicpass
[root@localhost ~]# mysql -u root -p
Enter password:

MariaDB [(none)]> create database dicdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on dicdb.* to dicuser@localhost identified by 'dicpass';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> use mysql;

MariaDB [(mysql)]> select * from user where user = 'dicuser';

MariaDB [(mysql)]> exit

這樣就建置好了你的資料庫。例外,如果你曾經在其他系統上面使用 Mariadb 建立過相關的資料庫,並且已經將資料庫的內容複製下來, 那是可以透過底下的方式來進行復原重建、備份資料的行為喔:

  • 備份資料庫: mysqldump -u username -p database_name > /path/to/file.sql
  • 復原資料庫: mysql -u username -p database_name < /path/to/file.sql

而如果需要在 Mariadb 的環境下丟棄資料庫,則使用『 drop database database_name 』即可!

例題 11.3.C:完成資料庫內容的重建
  1. 依據上述的說明建立好資料庫、資料庫使用者、資料庫用戶密碼等資訊
  2. 以備份的資料庫檔案,重建資料庫系統:
    • 下載 這個檔案 ,此檔案為之前備份的資料庫內容 (建議使用 wget 來抓取這個檔案)
    • 然後依據這個檔案的內容重建你的資料庫!(你需要使用 dicuser 帳號與密碼喔!)
  3. 以 dicuser 登入系統,去查閱相關的資料表與實際的資料內容。
    • 使用 dicuser 帳密登入
    • 列出所有資料庫後,選擇自己的資料庫使用
    • 列出所有的資料表
    • 隨便選一個資料表,列出所有欄位的參數
    • 列出所有的資料。
    • 離開資料庫

另外,PHP 預設最多只能支援 2M 的檔案上傳,如果未來你的專題需要比較大容量的上傳檔案時,應該要修改 php.ini 才行!

例題 11.3.D:完成 PHP 的支援與設定
  1. 加強 php 支援的變數功能:
    • 修改 httpd.conf 的內容,將找不到網頁的 404 內容檔名修訂為 missing.php 這個檔名。
    • 前往 /var/www/html 將原本的 missing.html 更名為 missing.php,並在該檔案裡面呼叫出『 $_SERVER['SERVER_ADMIN'] 』這個變數, 讓用戶知道出問題時,要找誰詢問。
    • 隨便在網址列輸入一個不存在的網頁,看看回傳的結果為何。
  2. 放大上傳的檔案容量:
    • 修改 /etc/php.ini 找到 upload_max_filesize 設定值,將該設定值改為 16M;
    • 重新啟動 httpd 即可支援較大的上傳檔案容量了。
  • (Options)套裝 PHP 架站機的練習:以 phpBB 討論區為例

很多所謂的架站機大多使用 PHP 網頁程式語言,搭配資料庫系統,就能夠提供中型企業所需要的入口網站!包括 wordpress, Xoops, phpBB 等。 這些架站機與社群網站不同的地方,在於易於查詢,有相關的模組可以搭配使用!

要架設這些簡易的架站機你的系統就必須要是動態網頁伺服器才行。我們在上面的練習過程中已經取得了如下的參數,因此將可以用來作為架站機的基礎資料庫設定。

  • 資料庫: dicdb
  • 主機名稱: localhost
  • 帳號: dicuser
  • 密碼: dicpass

phpBB 是透過 PHP 搭配資料庫系統所建置的一套討論區軟體,在社群網站尚未流行前,是一個相當熱門的討論區自由軟體。這個軟體也有中文化喔!官方網站與台灣支援網站如下:

因為 phpBB 是一個用 PHP 與資料庫軟體撰寫的套裝軟體啊,所以你得要下載這個軟體包才行。此外,因為 phpBB 支援多國語系,但預設為英文語系, 所以,你也得要下載語言包才行。官網的下載點如下:

例題 11.3.E:完成底下的動作
  1. 全班請推派一人進行網際網路下載 (只要一人,不要多!),假設名稱為 A 同學。
  2. 請 A 同學下載完畢後,自行放置到 FTP 可下載的位址 (注意,提供的是匿名下載的功能喔!)
  3. 請全部同學到 A 同學提供的 IP 位址去下載這兩個資料即可。

假設未來我們想要的網址為 http://server.lanXX.dic.ksu/phpbb ,因此應該要將下載的檔案放置於 /var/www/html/phpbb 目錄才行。 假設下載的檔案放置在 /root 處,請依序進行底下的任務即可:

# su -
# cd /var/www/html
# tar -jxvf /root/phpBB-3.3.2.tar.bz2
# ll 
drwxr-xr-x. 19 student student 4096 10月 13 00:45 phpBB3

# mv phpBB3 phpbb
# ll
drwxr-xr-x. 19 student student 4096 10月 13 00:45 phpbb

# chcon -Rv .

然後開始中文化的軟體包處理!

# cd /dev/shm
# unzip /home/student/mandarin_chinese_traditional_script_3_3_2.zip
# mv /dev/shm/mandarin_chinese_traditional_script_3_3_2/language/zh_cmn_hant/ \
> /var/www/html/phpbb/language/
# mv /dev/shm/mandarin_chinese_traditional_script_3_3_2/styles/prosilver/theme/zh_cmn_hant/ \
> /var/www/html/phpbb/styles/prosilver/theme/
# mv /dev/shm/mandarin_chinese_traditional_script_3_3_2/ext/phpbb/viglink/language/zh_cmn_hant/ \
> /var/www/html/phpbb/ext/phpbb/viglink/language//

接下來使用瀏覽器來進行後續的安裝即可:

  1. 選擇『 INSTALL 』畫面底下按下『 Proceed to next step 』
  2. 出現的畫面當中,幾乎都必須要是 yes 或 Avaliable 才行!所以可能需要額外增加軟體:
    # yum install php-gd ImageMagick
    # systemctl restart httpd
    # chmod 777 /var/www/html/phpbb/cache/
    # chmod 777 /var/www/html/phpbb/files/
    # chmod 777 /var/www/html/phpbb/store/
    # chmod 666 /var/www/html/phpbb/config.php
    
    如果再次按下『 test again 』沒問題就會通過測試!若持續有問題,就會出現錯誤訊息在瀏覽器上!
  3. 出現『MySQL with MySQLi Extension』的選擇後,分別輸入底下的資料即可:
    • 資料庫主機名: localhost
    • 資料庫 port : 3306
    • 資料庫資料名: dicdb
    • 資料庫用戶名: dicuser
    • 資料庫密碼欄: dicpass
    • 資料庫前導字: phpbb_
    搞定後按下『 Proceed to next stop 』
  4. 若一切順利,則資料庫會被主動的連接與建立!繼續按下『 Proceed to next step 』
  5. 出現管理員設定畫面,幾個項目可以這樣選擇的:
    • 預設語系: 正體中文
    • 管理員帳號: 自己填自己喜歡的
    • 管理員密碼: 填自己喜歡的
    • 管理員密碼: 填自己喜歡的
    • 管理員email:填自己的 email
    搞定後按下『 Proceed to next stop 』
  6. 一直按下『 Proceed to next step 』直到出現 Email settings 的部份,通常必須要使用 smtp 的 email, 因為你的本機並不是正確的 email server 才對!只是就得要填寫你的帳號與密碼了!有點困難~所以先不要設定!
  7. 最終出現『 Login 』畫面後,直接使用你剛剛建立的管理員帳號來登入吧!
  8. 最終系統還是需要進行一些修訂維護的動作~使用底下的方式來處理:
    # chmod 444 /var/www/html/phpbb/config.php
    # rm -rf /var/www/html/phpbb/install/
    

大致上安裝就是這麼簡單~不過,如果有其他額外的模組要安裝,就請自行參考 phpBB 官網或台灣竹貓星球的介紹了。

11.4: 讓 PHP 網頁可以使用 root 權限呼叫 shell script

要透過 PHP 去運作 bash 或者是其他的程式是可行的!不過預設的 PHP 是使用 apache 這個帳號的權限,因此許多程式是無法順利運作的。 所以,當你要讓 PHP 去呼叫 shell script 時,就得要透過不用密碼執行的 sudo 囉!

例題 11.4.A:讓 apache 這個用戶不用密碼即可使用 root 的權限
  1. 更改 apache 這個帳號的參數設定:
    • 可能得要改變 apache 的 shell ,請將 apache 的 shell 改成 /bin/bash 喔!
    • 使用 visudo ,進去修改設定值,讓 apache 加上不用密碼即可使用的功能
  2. 一個簡單的範例:不過?仍然需要修訂 SELinux 與權限喔:
    • 編輯 /var/www/html/checkls.php,內容使用類似如下的語法來處理 (注意,所有指令最好都以絕對路徑來撰寫較佳!):
      <?php
              $log = shell_exec('/bin/sudo /bin/bash -c "/bin/ls -al /var/www/"');
      ?>
      <pre>
      <?php echo $log; ?>
      </pre>
      
    • 使用各種方式去瀏覽該網頁,一開始你會發現無法顯示任何資訊,請觀察 /var/log/messages 以及 /var/log/httpd/error_log 然後自行設法克服之。 (注意,每個系統多多少少都不太一樣,因此很可能會發生多重 SELinux 的修訂,且每部系統產生的問題都可能不相同! 故,請以自己的系統訊息來解決喔!)

透過上述的練習,你的 apache 應該可以順利的去呼叫外部程式來執行!這讓你的系統管理界面可以逐漸的在 Web 面進行,已達到管理界面網頁化的目的。 當然啦,個人建議,這樣的界面還是鎖在外部無法連接的環境下較佳,避免某天不小心因為系統漏洞的關係而被攻擊啊!

11.5: WGSI 網頁支援

在台灣我們比較慣用 PHP 網頁程式語言,但是現在因為 python 的流行相當廣泛,所以目前很多的 Web server 也都支援 python 網頁的喔! 那如何讓你的 apache 支援 python 呢?這就得要使用所謂的 WSGI (Web Server Gateway Interface) 來處理了。要達成 WSGI 似乎也沒有這麼麻煩, 只要直接安裝 mod_wsgi 就可以!

[root@localhost ~]# yum search mod_wsgi
python3-mod_wsgi.x86_64 : A WSGI interface for Python web applications in Apache

[root@localhost ~]# yum install python3-mod_wsgi

一般來說,我們會將可執行 WSGI 的程式碼通通放置到某個目錄下,那就得要額外的一些設定項目才行,亦即需要在目錄執行權限加上 ExecCGI 的項目才可以。 此外,我們也需要指定副檔名~例如 php 的副檔名為 .php ,那麼 WSGI 的副檔名就讓我們指定為 .wsgi 吧!假設所有的腳本都放置到 /var/www/html/wsgi 裡面, 那麼我們的設定就得要變成:

[root@localhost ~]# vim /etc/httpd/conf.d/yourfile.conf
<Directory "/var/www/html/wsgi">
        Options +ExecCGI
        Require all granted
        AddHandler wsgi-script .wsgi
</Directory>

完成設定並且重新啟動 httpd 之後,可以嘗試寫一隻 python 的腳本在該目錄下,例如寫一隻很簡單的顯示訊息的腳本:( https://www.server-world.info/en/note?os=CentOS_8&p=httpd&f=10)

[root@localhost ~]# vim /var/www/html/wsgi/showip.wsgi
#!/usr/bin/python3
def application(environ, start_response):
    status = '200 OK'
    html = '<html>\n' \
     '<body>\n' \
     '<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;">\n' \
     'WSGI Test Page\n' \
     '</div>\n' \
     '</body>\n' \
     '</html>\n'.encode("utf-8")
    response_header = [('Content-type','text/html')]
    start_response(status,response_header)
    return [html]

接下來瀏覽該腳本,例如: curl http://localhost/wsgi/showip.wsgi,理論上就可以看到一個『WSGI Test Page』的字樣了!

  • url 與腳本的對應

以上面的例子來說,除非我在 index.html 後面再加一個首頁檔名,否則 showip.wsgi 就得要使用超連結才能連結到該檔案去執行。 不過,有沒有辦法不要設定上述的項目,而是讓使用者輸入 http://localost/wsgi/ 就能執行該腳本呢?可以的!透過腳本對應即可。 基本語法是這樣的:

WSGIScriptAlias /url/ /real/path/filename.wsgi

就讓我們來測試一下吧!

例題 11.4.A:以上述的腳本對應功能,讓使用者輸入 http://your.hostname/wsgi/ 時,就可以直接執行 showip.wsgi 的檔案。

11.6: squid proxy server 架設

早期的網路世界,由於頻寬難得,因此會有許多降低頻寬使用率的方式來協助 LAN 內的 Web 使用狀態。其中一個常用來『假裝好像加速器』的服務, 那就是網頁代理伺服器 (Proxy server)。為何說這是假性加速器呢?原因是,基本上 Proxy Server 會將找過的網頁資料存一份在自己的硬碟, 當下次有人要搜尋同一個網址時,Proxy server 會直接從硬碟或快取中將資料直接回傳給用戶,這就免除再次前往較慢的網路搜尋的時間, 所以感覺好像是有『加速』的感覺!所以,最單純的 Proxy 功能如下圖所示:

Proxy server
  • Proxy server 的運作流程

當 Proxy server 第一次發現要去的 URL 網址時,他的資料存取流程如下:

  1. Client 端向 Server 端發送一個資料需求封包;
  2. Server 端接收之後,先比對這個封包的『來源』與預計要前往的『目標』網站是否為可接受? 如果來源與目標都是合法的,或者說,來源與目標網站我們的 Proxy 都能幫忙取得資料時,那麼 Server 端會開始替 Client 取得資料。這個步驟中比較重要的就是『比對政策』啦,有點像是認證的感覺啦;
  3. Server 發現快取並沒有 Client 所需要的資料,準備前往網際網路抓取資料;
  4. Server 開始向 Internet 發送要求與取得相關資料;
  5. 最後當然就是將資料回傳給 Client 端囉!

當 Proxy server 本身的快取就有用戶要求的 URL 資料時:

  1. Client 端向 Server 端發送一個資料需求封包;
  2. Server 端接收之後,開始進行政策比對 (如同前一組步驟 2 的說明);
  3. Server 首先會檢查自己快取 (新的資料可能在記憶體中,較舊的資料則放置在硬碟上) 資料, 如果有 Client 所需的資料,那就將資料準備取出,而不經過向 Internet 要求資料的程序;
  4. 最後當然就是將資料回傳給 Client 端囉!
  • 近期 proxy server 的功能

不過由於目前台灣地區的島內頻寬算是夠用了,因此 Proxy server 對於國內的使用來說,目前似乎沒有這個需求了!不過,如果以資傳系來說, 系上的色彩管理國際課程需要連結美國去進行取得課程資料以及考試,而台灣的 TANET 學術網路連結到美國的速度似乎有點過慢。 此時,透過外部的 proxy server (例如中華電信或seed net等其他家電信公司) 連結,跑不同的 gateway 時,其速度會比較快速喔。 其原理有點像這樣:

Proxy server

所以,透過這個 proxy server 就可以進行特別的路由判斷哩!雖然是假的,不過,確實有加速網頁讀取的功能!另外, 其實目前頻寬足夠的情況下,proxy server 似乎無須進行 cache 喔!都透過直接再次讀取,速度也不慢 (有時加上 cache 速度反而會變慢, 因為 proxy server 還得要計算與搜尋內部的 cache 資料之故。)

另外,某些網頁設定只給 LAN 使用,此時透過內部 proxy server 並加上驗證,就能夠透過這部 proxy server 來存取內部的服務了。 這也是目前很常用的一個方式 (也不容易被攻擊,因為攻擊者不知道可以透過這個流向來存取內部服務之故。)

  • Squid server

雖然 apache 也有內建的 proxy 功能,不過,說到 proxy server,應該還是使用原生的 squid 這個用來作為 proxy 之用的軟體比較好。 所以,底下就來處理一下 squid 這個 proxy server 的服務設定吧。

例題 11.6.A:安裝好 squid ,啟動 squid 並且觀察 squid 啟動的埠口是幾號?

其實最簡易的 squid 設定就是只給本機使用而已,若要放行外部的使用權限,就得要透過存取控制 (access control list) 來處理了。 基本上的語法很簡單,就是分別規定 (1)能使用 proxy 的來源用戶端,或者是 (2)規定能外出的目的 Web server 端而已。 基本語法有點像這樣:

[root@localhost ~]# vim /etc/squid/squid.conf
acl yourname  src IP/32 Net1/24 Net2/24...   # 控制的是用戶端來源 IP
acl yourname2 dst IP/32 Net1/24 ...          # 控制的是要協助代理去哪個 server 的IP
acl yourname3 dstdomain .domain.name ...     # 控制的是要協助代理去哪個 server 的 hostname
http_access deny yourname3                   # 先拒絕不要去的伺服器
http_access deny yourname2
http_access allow yourname                   # 再接受允許的用戶端!

基本上,一般我們只會控制信任的來源用戶端而已,因此,最重要的其實只有『 acl yourname src IP... 』那一段,然後再將該段放行『 http_access allow youname 』就搞定了, 相當容易的。

例題 11.6.B:
  1. 放行 squid 的使用權:
    • 增加一個名為 mydic 的 acl 名稱,然後放行的是來源 IP 為你的內網
    • 將 mydic 放入支援的存取控制列表 (http_access allow) 當中
    • 重新啟動 squid (systemctl reload squid)
    • 可以使用類似『 curl -x 127.0.0.1:3128 http://somewhere 』進行測試!
  2. 用戶端的設計與伺服器端的登錄資訊:
    • 前往用戶端,啟動瀏覽器,設定好 proxy ,測試一下能否連上網。
    • 前往 server 端,觀察一下 cache 目錄是否有變化
    • 查看一下 squid 的登錄檔資訊 (/var/log/squid/access.log)
  3. 若你的 proxy 還需要針對 172.16.0.0/16 這一段做放行,該如何處理 (兩大考量,一個是 squid 的設定,一個是防火牆設定)

11.7: 課後練習

  1. (70%)實作題:啟動 Server 作業硬碟 - unit11
    1. 網路參數的設定,請依據底下的方式來設定好你的網路環境:
      1. 建立 ens3 為外部的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.18.255.*/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.18.255.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      2. 使用 teamd 的機制建立內部區域網路的備援功能:
        • team 的界面使用 team0 卡號,且連線名稱請命名為 team0
        • team 使用 activebackup 備援功能,不要使用 loadbalance
        • team 的實體網卡 (team slave) 請使用 ens7 及 ens8 ,且其連線名稱名稱亦請命名為 ens7, ens8
        • team0 網路參數為: 172.19.*.254/24,不需要 gateway
      3. 主機名稱指定為: server*.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. 依據底下的說明,選擇距離我們最近的成大網站來作為 yum server 的來源:
        成大 ccns 網站: https://mirror.ccns.ncku.edu.tw/howto/#rocky-linux
        請記得修改過設定檔,應該要將清單清除 (yum clean all) 較佳。
      2. 安裝相關的軟體,至少須安裝 vim-enhanced, bash-completion, net-tools, bind-utils, kernel
      3. 全系統自動升級,且每天凌晨 3 點也會自動升級一次。(請寫入 /etc/crontab 為主)
      4. 將 SELinux 修改成為 Enforcing 模式,且未來每次開機都自動為 Enforcing 才行
    3. 實際設定好本機防火牆
      1. 請關閉 firewalld 服務,並且自行安裝、啟動 iptables 服務
      2. 將預設的規則轉存到 /root/firewall.sh 這個檔案內
      3. 修改上述 firewall.sh 腳本,讓內容有點像底下這樣:
        1. 首先將全部的規則刪除 (應該有三條指令)
        2. 設定好預設政策,讓 INPUT 成為 DROP 而 OUTPUT 與 FORWARD 成為 ACCEPT
        3. 針對 INPUT 前三條規則為 (1)回應封包 (2)放行 lo 界面 (3)放行 icmp 封包
        4. 放行你自己的內部區域網路那個網域的連線要求 (針對 LAN 的信任設定)
        5. 讓 ssh 只對外部的區網放行,不會對 Internet 放行 (對 ssh 連線做限制較佳)
        6. 讓 http 針對整個 Internet 放行 (一般公開的服務設計)
        7. 最後讓確定的規則轉存到 /etc/sysconfig/iptables 這個設定檔
      4. 重新啟動 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. 虛擬主機的架設
      1. 讓 server*.example.dic 可以瀏覽到 /var/www/html/ 這個目錄,且首頁會顯示『 I am server*.example.dic service 』, 其中 * 為你的 IP 位址尾數
      2. 讓 server.lan*.example.dic 可以瀏覽到 /var/www/lan/ 這個目錄,且首頁會顯示『 This is LAN service 』。 此外,這個目錄會讓 alex 這個用戶具有完整的存取權限 (用戶若不存在,請自行建立。且密碼會跟用戶名稱相同。同時, 建議使用 acl 進行處理)
      3. 當用戶使用 https://server*.example.dic 或其他的 https:// 瀏覽時,都會自動被導向 /var/www/ssl/ 目錄, 且首頁會顯示『 Here is HTTPS services 』
    6. 資料庫建置
      1. 請使用安全的方式 (包括加上 root 密碼設定為 2727175) 來處理 Mariadb 這個資料庫的建立 (hint: mysql_secure_installation)
      2. 讓你的 Web server 可以支援 PHP,PHP 可支援 Mariadb 資料庫,且上傳的檔案最大容量可達 32MB
      3. 建立如下的資料庫用戶
        • 資料庫: mydb
        • 主機名稱: localhost
        • 帳號: myuser
        • 密碼: mypass
      4. 下載 這個檔案 的內容,然後依據這個檔案的內容重建你的資料庫!
      5. 架設額外的 PHP 支援之論壇:
        • 務必安裝 links 文字型瀏覽器 (此瀏覽器放置於 epel 倉儲內)
        • 以本課程的說明,讓你的 http://server.lan*.example.dic/phpbb/ 目錄可以使用操作你的 phpbb 論壇 (注意虛擬主機的位置)
        • 你應該要在 client 端,使用瀏覽器去安裝此軟體才對。應該無法使用文字型瀏覽器處理此項任務。
        • 並請注意,我們的 RockyLinux 9 伺服器,當初使用最小安裝,因此許多的軟體預設都不會存在。 如果出現任何空白畫面,記得前往 server 的 log 檔案查閱,並自行查詢解決方案。 此外,你也可以設定 setenforce 0,等待安裝完畢後,再轉回 Enforcing 即可
    7. 其他設定
      1. 讓你的 Apache 可以支援 python 等 WSGI 程式,並且透過腳本別名來執行某個特定腳本:
        • 利用本節課程當中提到的 showip.wsgi 的檔案,將該檔案放置於 /var/www/wsgi/ 目錄中
        • 設定 web server,讓用戶輸入 http://你的主機名稱/showip/ 時,就會執行該腳本的功能。
      2. 設定好 squid server,讓你的內網可以使用你的 squid 向外瀏覽。另外,當崑山科大資傳系的三段 Class C 中的網域電腦使用這個 proxy 時, 也可以取得 proxy 的使用權。假設 squild 的設定中,限定使用 ksudic 這個 acl 的暱稱來處理。至於三段 IP 分別是 120.114.140.0/24, 120.114.141.0/24, 120.114.142.0/24
  2. (10%)實作題:啟動 client 作業硬碟
    1. 網路參數的設定,請依據底下的方式來設定好:
      1. 建立 ens3 的連線網卡 (相同的連線界面名稱),使用 ethernet 類型,且:
        • IPv4 的 IP位址: 172.19.*.1/24 ,其中 * 為老師規定的 IP 尾數
        • gateway 為 172.19.*.254
        • DNS 為 172.16.200.254 以及 168.95.1.1
      2. 主機名稱指定為: client.lan*.example.dic
      3. 最終你的主機名稱與 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 領域,且 ens3 為其管理之界面網卡
      3. 預計放行的服務主要有 ssh 與 http 兩個服務,其他還可能有預設會啟用的 dhcp 用戶端服務。
      4. 查詢 rich rule (man firewalld.richlanguage),確認來自本機同一個 LAN 網段的封包,通通給予放行。
      5. 上述放行的防火牆服務,在下次重新開機後,依舊會存在才行
  3. (20%)簡易問答題:(後面兩題 4 分,其他 3 分) 從具有 GUI 及中文的用戶端 Linux ,使用『 ssh root@172.19.*.254 』登入你的 Server ,之後建立 /root/ans.txt 的檔案,並將底下各題目的答案寫入你 server 當中!
    1. 架設 Apache 虛擬主機時,主機名稱需要那一個服務的支援才能在 internet 上面被查詢到?
    2. 那一個指令運作過後可以讓 Mariadb 在比較安全的狀態下執行?
    3. 那一個指令可以讓 Mariadb 的 thisdata 資料庫完整的備份下來,且備份的檔案名稱為 /mydata.sql (假設操作者資料庫名為 datauser)
    4. 要讓 web server (Apache 這個伺服器) 能夠使用 bash script 的呼叫,且可以切換成為 root 或其他帳號的身份執行腳本,需要如何設定?
    5. 找一下 google,請問底下兩個結果的 $log 有何不同?
      • $log = exec ('some script');
      • $log = shell_exec ('some script');
    6. 在 apache 裡面,想讓 /var/www/html/scripts/ 目錄可以執行 wsgi 的程式,且副檔名假設同時支援 .wsgi 與 .py 時, 應該要如何設定目錄資源?
  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/unit11 to check your filename

  • 2022/11/23:將整體資料在 RockyLinux 9 上實作!由於分析腳本會用到 links,所以加上一些額外的提示