網站伺服器建置與管理上課補充教材
- 最新消息:
- 每週都有可能會有上機實作,要等老師檢查完畢才能夠下課!否則就不算有來上課!
- 回首頁
- 舊版進度介紹
Chapter 10:WWW 伺服器 (Apache)
- 關於 WWW 的簡介
- 什麼是 WWW
- WWW 是 World Wide Web 的縮寫,其中 Web 有廣播網的意思存在, 所以簡稱為全球資訊網。
- 使用 WWW 時,需要有 server 與 client 的架構,兩者間傳輸的資料如下:
- WWW 伺服器不但需要一個可讓用戶端瀏覽的平台,還需要提供用戶端一些資料才行!
- 伺服器所提供的最主要資料是超文件標籤語言 (Hyper Text Markup Language, HTML)、多媒體檔案
(圖片、影像、聲音、文字等,都屬於多媒體或稱為超媒體)。
- HTML 只是一些純文字資料,透過所謂的標籤 (<tag>) 來規範所要顯示的資料格式;
- 在用戶端,透過瀏覽器的對 HTML 以及多媒體的解析,最後呈現在使用者的螢幕上。
- http 協定與 apache 軟體的開發
- 伯納斯-李 (Tim Berners-Lee) 在 1980 年代為了更有效率的讓歐洲核子物理實驗室的科學家可以分享及更新他們的研究成果,
於是他發展出一個超文件傳輸協定 (Hyper Text Transport Protocol, HTTP)
- 為了讓 HTTP 這個協定得以順利的應用,大約在 90 年代初期由伊利諾大學的國家超級電腦應用中心
(NCSA, http://www.ncsa.illinois.edu/) 開發出伺服器 HTTPd (HTTP daemon 之意)
- 由於 HTTPd 這個伺服器一直沒有妥善的發展,於是一群社群朋友便發起一個計畫,這個計畫主要在改善原本的 HTTPd
伺服器軟體,他們稱這個改良過的軟體為 Apache,取其『一個修修改改的伺服器 (A patch server)』的雙關語!
- 這個 Apache 在 1996 年以後便成為 WWW 伺服器上市佔率最高的軟體了 (http://httpd.apache.org/)。
- 什麼是 URL (Uniform Resource Locator)
- <協定>://<主機位址或主機名稱>[:port]/<目錄資源>
- 動態 WWW 伺服器
- 主要的組成元件: 作業系統平台+WWW伺服器+資料庫系統+網頁程式語言,還有 client 的瀏覽器!相關性為:
- 須注意 WWW 伺服器與資料庫系統為兩個獨立的系統,因此需要透過網頁程式語言進行溝通!
- Linux 環境: Linux + Apache + Mariadb + PHP --> LAMP
- 架設基礎 WWW 伺服器
- 軟體安裝需求: httpd, mariadb, mariadb-server, php, php-mysql 等等!
- 服務啟動需求: mariadb, httpd 兩個!
- 若修改 php 的設定,則需要『重新啟動 httpd 這個服務』!因為 PHP 是 apache 內的一個模組!
- 練習:
- 啟動 mariadb 服務,啟動完畢後觀察是否啟動埠口?觀察是否有開機啟動?
- 由於預設 mariadb 沒有設定 root 密碼,因此執行 mysql_secure_installation 依序完成安全強化作業
(設定 root 密碼為 2727175 看看,其他幾乎均按下 enter 即可!)
- (option! 不要做)如果這個資料庫系統不是給 apache 等網路環境用的,可以取消網路連線 (port會關閉),
修改 /etc/my.cnf ,在 [mysqld] 裡面新增一行『 skip-networking 』後,重新啟動 mariadb 即可!
- 若有進行上述動作,請務必改回來!未來我們會啟用網路連線喔!
- 啟動 httpd 服務,啟動完畢後請查看埠口為幾號?同時測試防火牆是否正確對 internet 放行了?
- 前往瀏覽器 http://localhost 看看是否正確的啟動了 WWW 呢?
- 前往 /var/www/html 建立 index.html,裡面填寫學號與姓名,看看能否順利瀏覽到呢?
- 建立 test.php ,內容為: <?php phpinfo(); ?> ,看看有沒有順利瀏覽到一堆資訊呢?
- 查詢一下 /var/log/httpd 的內容,分為那兩種資訊?如何查看該資訊代表的意義?
- 認識 apache 設定檔基礎設定
- 基礎設定檔: /etc/httpd/conf/httpd.conf
- 基礎的設定值
- PHP 的基礎設定檔: /etc/httpd/conf.d/php.conf
- 練習:
- 讓你的 apache 可以監聽 port 80 及 port 9494,你可能需要處理 SELinux 的問題,同時需要注意防火牆
- 如何在網址列輸入 port 9494 的瀏覽?
- 將管理員帳號輸出為 student@your.host.name ,嘗試輸入一個不存在的網頁,看看情況如何?
- 將語系交給網頁自行決定,不要統一使用 utf8 輸出!
- 讓 welcome.html 與 welcome.php 也可以是首頁
- Apache 系統效能優化處理
- 必須要判斷 apache 使用何種管理機制才行
# apachectl -t -D DUMP_MODULES |grep mpm
mpm_prefork_module (shared)
如上所示,就是 prefork 這個模組!如果是該模組,那就可以使用底下的方法來增加效能了!
- 修改 prefork 模組的方式
# vim /etc/httpd/conf.d/prefork.conf
KeepAlive Off
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 1024
MaxClients 1024
MaxRequestsPerChild 4000
</IfModule>
# apachectl configtest
Syntax OK
# systemctl restart httpd
- Apache 的個人首頁設定
- 預設系統的個人首頁網址為 http://your.host.name/~username/
- 個人首頁的修改:
- 檢查 httpd 是否有放行 homedir 的 SELinux 項目,若無,請自行設定妥當!
- 用戶家目錄權限的設定,例如以 student 為例,應該要這樣處理 (用 student 身份喔!):
$ chmod 711 ~student
$ mkdir ~student/www
$ echo "check student web page" > ~student/www/index.html
之後在網址列輸入 http://your.host.name/~student 查閱是否有資料即可!
- 練習:
- 根據上述資料,設定好個人首頁,個人首頁目錄為 ~user/www ,且需要處理 SELinux 相關設定!
- 讓所有新建的用戶預設家目錄均有名為 www 的子目錄
- 讓所有新建的用戶預設都有 www/index.html 的檔案,內容為『 my directory 』
- 新建名為 webuser1 的用戶,且該用戶具有個人首頁 (注意權限)
- 在 /root/bin 建立名為 addwebuser.sh 的腳本,該腳本可以建立新的用戶,
且會主動的修改 /home/帳號 的權限。腳本使用的方式為" addwebuser.sh 帳號 "
- 錯誤瀏覽訊息公告
- Apache 的訊息代碼意義為:
- 100-199:一些基本的訊息
- 200-299:用戶端的要求已成功的達成
- 300-399:Client 的需求需要其他額外的動作,例如 redirected 等等
- 400-499:Client 的要求沒有辦法完成(例如找不到網頁)
- 500-599:主機的設定錯誤問題
主要的訊息代碼都可以在 access 或者是 error log 裡面找到!
- 你可以在 /etc/httpd/conf/httpd.conf 找到錯誤代碼為 404 的設定值,然後處理所需要的顯示項目來處理!
- 練習:
- 讓你的錯誤代碼 404 會自動顯示 http://your.host.name/missing.php 這個檔案
- 上述的檔案內容中,請使用到 PHP 的 $_SERVER['SERVER_ADMIN'] 這個變數,然後做好相關的連結資料。
- httpd 的目錄保護功能 (僅規範到的 IP 來源可以登入瀏覽)
- 不同的 Apache 版本其設定不同,CentOS 7 的版本使用的是 Require 這個設定項目,且涵蓋於 <Directory "/path"> 項目內!
- 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
- 練習:有個目錄放置的資料僅針對內網放行,例如 http://your.host.name/private 這個目錄!
- Proxy 伺服器
- 有些時候,你需要在某些地方架設一台可以代為轉遞的代理伺服器 (proxy server),這樣才能協助使用內部服務。
- 目前 proxy server 的角色大概都被 VM (虛擬機器) 取代了!此外,網路頻寬也都夠大了,因此 proxy server 就很少使用了。
- CentOS 上面,預設使用 squid 這個軟體作為代理伺服器!
- Squid 可以設定接受的來源,也能夠設定拒絕或接受的目的地伺服器網址!語法為:
# 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 # 再接受允許的用戶端!
- 上表中的 http_access 是有順序的!所以要先拒絕再放行,否則會出問題喔!
- 建立使用密碼保護的瀏覽目錄
- 承上題,當你的主管會到外部去出差,他也需要用到上述的保護目錄,因此使用固定的 IP 保護就顯的有點蠢~
此時可以使用 apache 預設提供的密碼保護功能來處理!
- 一般建議你使用某個目錄底下,允許使用設定修改的設定檔 .htaccess 這個檔案,而其中僅有 AuthConfig
這個項目應該就 OK 了!不需要全部放行。有點像這樣:
<Directory "/some/where">
Options XXX
AllowOverride AuthConfig
</Directory>
# systemctl restart httpd
- 接下來切換到該目錄下 (/some/where),建立一個名為 .htaccess 的檔案,這個檔案必須要 (1)指定密碼檔的檔名,
(2)指定該密碼檔內可用以驗證的帳號。檔案內容大概像這樣:
# vim .htaccess
AuthType basic
AuthName "你要顯示到彈出式視窗的文字"
AuthUserFile /some/auth/filename
require user 帳號名稱
# require valid-user
- 上述的 /some/auth/filename 檔案檔名是自己指定的,但是最好不要放在可被網頁瀏覽的目錄 (就是不要放在 /var/www/html/ 內!)。
至於該檔案的建立方案為:
# htpasswd [-c] /some/auth/filename username
- 練習:
- 讓你的網址列 http://your.host.name/protect/ 為受保護的目錄,該目錄底下可接受 AuthConfig 的認證設定改寫
- 建議密碼檔放置於 /var/www/apache.pw 這個檔案中
- 建立一個名為 myroot 的帳號,密碼為 2727175
- 若要再增加一個名為 myadmin 帳號,密碼為 2727175 的用戶時,該如何處理?
- 使用加密的 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 ?若有連線的憑證問題,如何查閱憑證資料並放行該次連線?
- 自製專屬憑證資料
- 從前一個練習的憑證資料觀察中,我們可以發現憑證資料可能跟我們系統的原本設定不同,因此,
就讓我們來自製專屬的憑證資料!
- 練習基本建立憑證的方法為:
- 進入 /etc/pki/tls/certs 後,使用『 make yourname.key 』建立一把私鑰 (需要輸入四位數密碼)
- 將 yourname.key 更改檔名為 yourname.raw 之後,使用『 openssl rsa -in yourname.raw -out yourname.key 』
來將密碼取消 (否則啟動 httpd 時,會出現問題!建制完畢後, yourname.raw 即可刪除)
- 使用『 make yourname.crt SERIAL=YYYYMMDDNN DAYS=3650 』建立憑證檔案,記得 common name 要輸入你的對外主機名稱
- 將 yourname.key 挪到 /etc/pki/tls/private 底下,並將權限修訂成為 400 (或 600)。
- 接下來請到 /etc/httpd/conf.d/ssl.conf 裡面調整 localhost.crt 與 localhost.key 的項目,重起 httpd 即可!
- 讓加密與不加密的資料分開!讓系統比較安全些!請修改 ssl.conf 的內容!假設我們需要將加密資料放置於 /var/www/https 的話,
可以這樣做:
- 先建立 /var/www/https 目錄,同時塞一個特色的 index.html 內容在內!
- 前往 /etc/httpd/conf.d/ 修改 ssl.conf ,主要修改的項目為:
DocumentRoot "/var/www/https"
ServerName your.host.name:443
重新啟動過 httpd 之後,即可生效了!
- 虛擬主機的設定
- 所謂的虛擬主機是,讓不同的主機名稱可以對應到不同的主網頁去,感覺就好像有多個伺服器提供個別的服務這樣。
- 最主要的大前提,是你的 IP 需要有多個主機名稱才行。
- 設定的行為很單純,設定如下的設定項目即可!
# vim /etc/httpd/conf.d/yourname.conf
<VirtualHost *:80>
ServerName server.name.1
DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:80>
ServerName server.name.2
DocumentRoot /var/www/web2
</VirtualHost>
- 練習:
- 讓 www.yourname 對應到 /var/www/html 目錄去
- 讓 ftp.yourname 對應到 /var/ftp 目錄去
- 讓 web.yourname 對應到 /var/www/web 目錄去
- 虛擬主機招商的綜合練習
- 你的客戶或者是合作廠商,要求建立一個 WWW 伺服器,他要的網址為 http://web.yourname
(hint: 我們之前放置在哪個目錄下?)
- 你的客戶要求要給予一個帳號與密碼讓她可以上傳/下載網頁,假設帳號為 clientuser 密碼為 clientpass
(hint: 你得要思考一下,該客戶登入之後是否能夠操作 shell?家目錄又應該要設定在哪裡?且權限又該如何設定?)
- 你的客戶要求需要使用 FTP 與 samba 這兩個服務喔!其中你必須要注意,FTP 必須要 chroot,讓該帳號無法亂跑!
此外,CentOS 7 的 vsftpd 預設不許 chroot 後的上傳,因此必須要加入 allow_writeable_chroot=YES 這個設定才行!
其他的請自行參考 google 上面的說明!
- 架站機的安裝!以 phpBB 討論區為例
- 很多所謂的架站機大多使用 PHP 網頁程式語言,搭配資料庫系統,就能夠提供中型企業所需要的入口網站!包括 wordpress, Xoops, phpBB 等。
這些架站機與社群網站不同的地方,在於易於查詢,有相關的模組可以搭配使用!
- 首先,你的系統必須要有資料庫~假設我們使用 mariadb 資料庫,且搭配底下的帳號與密碼機制 (最好不要使用 root 帳號!)
- 資料庫: dicdb
- 使用者: dicuser@localhost
- 密 碼: dicpass
你需要的處理流程為:
# mysql -u root -p
Enter password:
MariaDB [(none)]> create database dicdb; //注意每個指令後面都要加上分號 (;)
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> grant all privileges on dicdb.* to dicuser@localhost identified by 'dicpass' ;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql | // 用來記錄 MySQL 帳號、主機等重要資訊的主要資料庫!
| test |
| dicdb | // 我們剛剛建立的資料庫在此
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> use mysql;
MariaDB [(mysql)]> select * from user where user = 'dicuser';
// 上面兩個指令在查詢系統有沒有 vbirduser 這個帳號,若有出現一堆東西,
// 那就是查詢到該帳號了!這樣就建置妥當囉!
MariaDB [(mysql)]> exit
- 請前往 這裡 參考作法,之後請將我們需要的 phpBB
網址列設定為: https://your.server/ 這樣!