第 11 堂課 - 網頁伺服器 (Apache server) part3
上次更新日期 2019/01/10
現在讓我們來處理動態 WWW 伺服器吧!包括可以處理自動架站機的任務等等。另外,這個章節可以搭配本系『資料庫實務』課程的內容, 讓你的 SQL Server 可以在 WWW 伺服器上面實際運作!方便你未來自己搭建資料庫系統,預先對你的專題課進行理解!
- 11.1: 動態 WWW 網站的建置
- 11.2: Mariadb 資料庫與資料庫用戶建置
- 11.3: PHP 討論區架站練習
- 11.4: 建立一個小型的資料庫系統
11.1: 動態 WWW 網站的建置
第九堂課談到動態網站就是 LAMP,亦即 Linux + Apache + Mariadb + PHP,前兩個我們大概安裝妥當了,接下來處理其他兩個軟體! 好讓我們的 Apache 伺服器變成正確可運作的動態 WWW 網站吧!
一般來說,Mariadb + PHP 需要的軟體還有 mariadb, mariadb-server, php, php-mysql,此外,資料庫是獨立於 WWW 伺服器之外的,因此也需要自行安裝與處理。
- 處理 Mariadb 資料庫的行為
資料庫軟體是個提供使用者建立資料庫的界面,我們 CentOS 最常使用的就是 Mariadb 以及 PostgreSQL 這兩個東西, 其中又以 Mariadb 比較常見!這個資料庫軟體是多人共用的,因此也需要帳號來管理~所以, Maraidb 有個內建的資料庫軟體使用帳號, 這個帳號與 Linux 帳號無關~單純就是 Mariadb 自己的帳號!
基本上,Mariadb 建立完畢後,會有個沒密碼的 root 管理員,你應該要知道,root 沒有密碼保護這是多可怕的事情! 所以,我們當然需要做點設定才好:
- 先啟動 httpd,啟動完畢後,不要再重新啟動,等待下一題再重啟。
- 請安裝 mariadb, mariadb-server, php, php-mysql 等軟體 (尤其是 php-mysql !很重要)
- 啟動 mariadb 服務,啟動完畢後觀察是否啟動埠口?觀察是否有開機啟動?(軟體名 mysql)
- 使用 mysql -u root 來嘗試無密碼登入資料庫看看:
- 使用『 show databases; 』查看所有資料庫
- 使用『 use mysql; 』切換到 mysql 資料庫
- 使用『 show tables; 』查看這個資料庫所含有的資料表
- 使用『 describe user; 』來查看這個資料表內的各個資料欄位
- 使用『 select * from user; 』來顯示所有的資料內容
- 使用『 select * from user where Host = 'localhost'; 』來規範條件
- 最終使用『 exit 』來離開資料庫。
- 由於預設 mariadb 沒有設定 root 密碼,因此執行 mysql_secure_installation 依序完成安全強化作業 (設定 root 密碼為 2727175 看看,其他幾乎均按下 enter 即可!)
- 分別使用『 mysql -u root [-p] 』來嘗試無密碼、有密碼的登入行為。
- PHP 網頁程式語言的支援與運作
PHP 是嵌入於 apache 的一個模組,所以,如果修改了任何 php 的資訊,一定要重新啟動 httpd 才行。我們來嘗試看看沒有重新啟動 apache 時,會有什麼後果吧!
- 在尚未重新啟動 httpd 前,請先前往 /var/www/html 建置名為 phptest.php 的檔案,檔案內容如下:
[root@localhost ~]# vim /var/www/html/phptest.php <?php phpinfo(); ?>
- 使用瀏覽器瀏覽 http://localhost/phptest.php ,看看能否看到實際的資料展示?
- 重新啟動 httpd,然後重新觀察上面的網址,看看出現什麼變化?
- 重新編輯 phptest.php ,隨便加上幾個字,例如加入莫名其妙的『 hehe 』在 phpinfo() 之前,儲存之後再次以瀏覽器觀察 phptest.php 的內容。
- 此時請前往 /var/log/httpd 觀察 error_log 的內容 (看最後面幾行資料),確認問題的所在。
- 確認修改完畢後,再次觀察上述網址。
事實上,上面這個練習相當相當重要!未來你的網站出現任何錯誤時,尤其是因為 PHP 的語法錯誤所導致的情況下, 看 error_log 就可以知道問題的發生點喔!所以才說,這個練習相當重要!
11.2: Mariadb 資料庫與資料庫用戶建置
其實資料庫也是可以多人共用的環境!而資料庫的管理員就是 root 。目前我們已經設定好 Mariadb 的 root 管理員帳號,不過,一般使用資料庫時,不建議使用 root,否則萬一網頁被綁架就會很麻煩。因此,通常我們會建議你建立一個一般帳號來提供用戶連接資料庫。 假設你要建立的資料庫資訊如下:
- 資料庫: 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
上面的指令在建立資料庫 (dicdb) ,透過 grant 那一行,同時將 dicdb 的資料庫使用權交給 dicuser 這個帳號,並同步設定好這個帳號的密碼! 最後一個 select 的指令,在查詢是否正確的設定好使用者帳號而已。
- 修改 PHP 上傳限制
另外,一般 PHP 的上傳最大檔案預設只有 2MB 而已,如果你有要放行比較大的檔案上傳,就需要修改 PHP 的設定。設定的方法如下:
[root@localhost ~]# vim /etc/php.ini upload_max_filesize = 16M [root@localhost ~]# systemctl restart httpd
這樣就可以讓你的 PHP 資料傳輸,可以到達 16M 的程度,至少小檔案傳輸是沒問題的了。
11.3: PHP 討論區架站練習
很多所謂的架站機大多使用 PHP 網頁程式語言,搭配資料庫系統,就能夠提供中型企業所需要的入口網站!包括 wordpress, Xoops, phpBB 等。 這些架站機與社群網站不同的地方,在於易於查詢,有相關的模組可以搭配使用!
要架設這些簡易的架站機你的系統就必須要是動態網頁伺服器才行。我們在上面的練習過程中已經取得了正確的參數, 因此將可以用來作為架站機的基礎資料庫設定。
phpBB 是透過 PHP 搭配資料庫系統所建置的一套討論區軟體,在社群網站尚未流行前,是一個相當熱門的討論區自由軟體。 這個軟體也有中文化喔!官方網站與台灣支援網站如下:
因為 phpBB 是一個用 PHP 與資料庫軟體撰寫的套裝軟體啊,所以你得要下載這個軟體包才行。此外,因為 phpBB 支援多國語系,但預設為英文語系, 所以,你也得要下載語言包才行。官網的下載點如下:
- phpBB 套裝軟體:https://www.phpbb.com/downloads/ (記得下載 .bz2 格式)
- 語言包:https://www.phpbb.com/languages/
- 全班請推派一人進行網際網路下載 (只要一人,不要多!),假設名稱為 Z 同學。
- 請 Z 同學下載完畢後,自行放置到 FTP 可下載的位址 (注意,提供的是匿名下載的功能喔!)
- 請全部同學到 Z 同學提供的 IP 位址去下載這兩個資料即可。
假設未來我們想要的網址為 http://你的主機名稱/phpbb ,因此應該要將下載的檔案放置於 /var/www/html/phpbb 目錄才行。 假設下載的檔案放置在 /root 處,請依序進行底下的任務即可:
# su - # cd /var/www/html # tar -jxvf /root/phpBB-3.X.Y.tar.bz2 (X, Y 為版本名) # 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 (就是改檔名)
然後開始中文化的軟體包處理!
# cd /dev/shm # # 底下的指令,請務必使用 <tab> 按鈕來達成,不要硬打字~會失敗的!要注意! # unzip /root/mandarin_chinese_traditional_script_3_X_Y.zip # mv mandarin_chinese_traditional_script_3_X_Y/language/zh_cmn_hant/ /var/www/html/phpbb/language/ # mv mandarin_chinese_traditional_script_3_X_Y/styles/prosilver/theme/zh_cmn_hant/ /var/www/html/phpbb/styles/prosilver/theme/ # mv mandarin_chinese_traditional_script_3_X_Y/ext/phpbb/viglink/language/zh_cmn_hant/ /var/www/html/phpbb/ext/phpbb/viglink/language/
接下來使用瀏覽器來進行後續的安裝即可,瀏覽器輸入: http://localhost/phpbb/ 來啟動!
- 先看左上方的『 Select language: 』位置,點選一下,選『正體中文』之後,按下 change 按鈕!
- 在看左側子導覽列,可以看看介紹、支援、授權等資料,隨便看看就好。
- 左上方兩個頁面標籤,選擇『安裝 (INSTALL)』,之後看到最下方有個『安裝』的小按鈕,按下去!
- 出現檢測的畫面,畫面中不能有任何錯誤的方塊 (紅色或黃色),如果有,就需要修改。大部分的修改都是目錄的權限錯誤而已,
不過,我們也需要額外的軟體支援,所以,瀏覽器保留不動,將終端機拉出來,開始進行底下的動作:
# 1. 先安裝軟體,安裝完畢還需要重新啟動 httpd 才行! # yum install php-gd ImageMagick php-xml php-dom # systemctl restart httpd # 2. 修改權限,讓 httpd 可以讀寫底下這些基礎目錄 # cd /var/www/html/phpbb # chmod 777 cache store files images/avatars/upload # chmod 666 config.php # ll -d cache store files images/avatars/upload config.php drwxrwxrwx. 2 student root 40 12月 20 03:16 cache -rw-rw-rw-. 1 student root 0 12月 20 04:32 config.php drwxrwxrwx. 2 student root 40 12月 20 03:16 files drwxrwxrwx. 2 student root 40 12月 20 03:16 images/avatars/upload drwxrwxrwx. 2 student root 40 12月 20 03:16 store <-看這裡->
如果再次按下『 重新測試 (test again) 』沒問題就會通過測試!若持續有問題,就會出現錯誤訊息在瀏覽器上! - 出現管理員設定畫面,幾個項目可以這樣選擇的:
- 管理員帳號: 自己填自己喜歡的
- 管理員email:填自己的 email
- 管理員密碼: 填自己喜歡的
- 管理員密碼: 填自己喜歡的
- 出現『 資料庫配置 』的選擇後,分別輸入底下的資料即可:
- 資料庫類型 : 直接選擇『MySQL with MySQLi Extension』 即可
- 資料庫主機名: localhost
- 資料庫 port : 3306
- 資料庫管理員: dicuser
- 資料庫密碼欄: dicpass
- 資料庫資料名: dicdb
- 資料庫前導字: phpbb_
- 出現『 伺服器配置 』的頁面,都保留預設值,但是『網域名稱』請改寫一下,變成你主機對外的主機名稱, 例如『 server.linux.dic 』或『 pcXX.linux.dic 』之類的名稱喔!其他都不改,然後就按下『送出』
- 出現『電子郵件配置』的部份時,通常必須要使用 smtp 的 email, 因為你的本機並不是正確的 email server 才對!只是就得要填寫你的帳號與密碼了!有點困難~所以先不要設定,直接按下『送出』即可。
- 出現『討論區配置』時,選擇『正體中文』,然後討論區的名稱與討論區的簡介都隨便你填寫! 例如填寫『伺服器架設』與『伺服器設定測試中』之類的!未來可以再修訂!然後就送出了!
- 若一切順利,則資料庫會被主動的連接與建立!最後會出現『安裝程序已經成功完成』的字樣~然後點選『帶我去管理員控制台』的連結!
- 出現了『管理員控制台』的畫面,請在各頁籤之間切換觀察一下,包括一般、版面、發表、會員、權限、自訂等等,
大約查詢等待約數分鐘 (不會超過 5 分鐘),再次回到『一般』標籤頁面,就會看到警告視窗!告訴你有個目錄沒有移除,
有個檔案權限不對等等。因此,再次拉出終端機來處理:
# chmod 444 /var/www/html/phpbb/config.php # rm -rf /var/www/html/phpbb/install/
再次重新點選『一般』頁面,應該要發現沒有任何錯誤框框了才對! - 再看右上方有個『討論區首頁』,點選他,就可以開始使用你的 PHPBB 討論區了!
這樣就完成了你的 PHP 討論區架設了!相當簡單。另外,請前往查詢 /var/www/html/phpbb/config.php 的內容, 那大概你就知道如何進行 SQL 的相關連線了!
11.4: 建立一個小型的資料庫系統
上面是直接透過一個資料庫界面,建立一個資料庫與一個管理帳號,然後就直接上 PHP 相關的套裝軟體,相當簡單的動作與行為。 但是未來系上是需要進行專題的!專題的內容就與上面的套裝軟體不一樣,我們可能得要直接自己上資料庫這樣。因此,底下提前做一個小型的資料庫系統, 協助大家來使用文字界面的方式,建立與管理一下資料庫相關的動作。
- 建立一個獨立的資料庫、資料庫管理帳號密碼
假設你要建立底下的資料庫訊息:
- 使用者資料庫名: userdb
- 使用者帳號: username
- 使用者密碼: userpw
- 所需要的連線主機名稱 (預設都是 localhost 喔!)
參考 11.2 小節的作法,直接進行底下的任務:
[root@localhost ~]# mysql -u root -p MariaDB [(none)]> create database userdb; MariaDB [(none)]> grant all privileges on userdb.* to username@localhost identified by 'userpw' ; MariaDB [(mysql)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | dicdb | | mysql | | performance_schema | | userdb | (就是這個新增的資料庫系統!) +--------------------+ 5 rows in set (0.00 sec) MariaDB [(mysql)]> exit
這樣你就做好最基礎的資料庫練習的前提了!
- 測試資料表的建立、資料欄位的建立、資料表的丟棄
現在假設你需要建立一個名為 mytest 的資料表,這個資料表裡面有個名為 name 的資料欄位,這個資料欄位累行為字元,且用了 10 個字元的長度。 處理的方案如下:
[root@localhost ~]# mysql -u username -p Enter password: # 先查看你有的資料庫名稱 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | userdb | +--------------------+ 2 rows in set (0.00 sec) # 開始使用 userdb 這個資料庫! MariaDB [(none)]> use userdb; Database changed # 建立名為 mytest 的資料表,且具有 name 這個欄位,累行為字元,長度為 10 MariaDB [userdb]> create table mytest ( name character(10) ); Query OK, 0 rows affected (0.00 sec) # 查看這個資料庫內含有的資料表 MariaDB [userdb]> show tables; +------------------+ | Tables_in_userdb | +------------------+ | mytest | +------------------+ 1 row in set (0.00 sec) # 觀察 mytest 這個資料表內的欄位資訊 MariaDB [userdb]> describe mytest; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | name | char(10) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 1 row in set (0.00 sec) # 將整個資料表丟棄!要注意!這個是測試的資料表,所以被我們捨棄的意思! MariaDB [userdb]> drop table mytest; Query OK, 0 rows affected (0.00 sec) # 確認,確實沒有資料表了! MariaDB [userdb]> show tables; Empty set (0.00 sec) MariaDB [userdb]> exit
大致上建立資料表與資料表欄位內容就是上面這樣的資訊~現在,你也知道建立資料庫連同資料表的大致語法是:
create table 表格名 ( 欄位名 資料類型 (長度), 欄位名 資料類型 (長度), 欄位名 資料類型 (長度), ... primary key (欄位名) );
詳細的資訊請參考各資料庫課程。本案例中,想要建立一個會員資料表,表格名稱為 userinfo,至於內容是這樣的:(假設會員資料表的表格名稱為 userinfo)
- 使用者代碼: uid int,自動增加,且不可以為空,且為主鍵
- 登入帳號: login_name character(40) ,假設僅允許英文與數字,且不可為空
- 登入密碼: login_pass character(64),假設使用 sha256 [hash('sha256',$pw)] 所需要的長度,且不可為空
- 真實姓名: realname character(40),不可為空
- 電子郵件: u_email varchar(100),可以為空值
- 生日: u_bday date,不可為空值
- 性別: u_sex tinyint,只有 0 與 1,0 為女性 1 為男性,不可以為空值
- 啟動: u_active tinyint,只有 0 與 1,0 為尚未開啟,1 為已經啟動,預設為 0
- 註冊日期: u_regd timestamp(8),預設為當日數值
建立的語法是這樣:
[root@localhost ~]# mysql -u username -p Enter password: MariaDB [(none)]> use userdb; Database changed MariaDB [userdb]> create table `userinfo` ( -> `uid` int auto_increment not null, -> `login_name` varchar(40) not null, -> `login_pass` varchar(64) not null, -> `realname` varchar(40) not null, -> `u_email` varchar(100) null, -> `u_bday` date not null, -> `u_sex` tinyint not null default 0, -> `u_active` tinyint not null default 0, -> `u_regd` timestamp(6) not null, -> primary key (uid) -> ) character set utf8 collate utf8_unicode_ci ; Query OK, 0 rows affected (0.00 sec) MariaDB [userdb]> show tables; +------------------+ | Tables_in_userdb | +------------------+ | userinfo | +------------------+ 1 row in set (0.00 sec) MariaDB [userdb]> describe userinfo; +------------+--------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+-------------------+-----------------------------+ | uid | int(11) | NO | PRI | NULL | auto_increment | | login_name | varchar(40) | NO | | NULL | | | login_pass | varchar(64) | NO | | NULL | | | realname | varchar(40) | NO | | NULL | | | u_email | varchar(100) | YES | | NULL | | | u_bday | date | NO | | NULL | | | u_sex | tinyint(4) | NO | | 0 | | | u_active | tinyint(4) | NO | | 0 | | | u_regd | timestamp(6) | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +------------+--------------+------+-----+-------------------+-----------------------------+ 9 rows in set (0.00 sec)
這樣就建立好資料表與資料表欄位。現在,嘗試填入一些資訊吧!
MariaDB [userdb]> insert into userinfo (login_name,login_pass,realname,u_bday,u_sex) values ('axxxcyyy','1234','melody','200101',1); MariaDB [userdb]> insert into userinfo (login_name,login_pass,realname,u_bday,u_sex) values ('axxxcyy2','2234','amanda','200301',2); MariaDB [userdb]> insert into userinfo (login_name,login_pass,realname,u_bday,u_sex) values ('axxxcyy3','3234','niki','200303',3);
透過手動的方式,塞了三筆資料進去資料庫內!現在,來檢查一下能不能將資料顯示出來!?
MariaDB [userdb]> select * from userinfo; +-----+------------+------------+----------+---------+------------+-------+----------+----------------------------+ | uid | login_name | login_pass | realname | u_email | u_bday | u_sex | u_active | u_regd | +-----+------------+------------+----------+---------+------------+-------+----------+----------------------------+ | 1 | axxxcyyy | 1234 | melody | NULL | 2020-01-01 | 1 | 0 | 2019-01-10 18:59:47.603286 | | 2 | axxxcyy2 | 2234 | amanda | NULL | 2020-03-01 | 2 | 0 | 2019-01-10 19:00:10.314283 | | 3 | axxxcyy3 | 3234 | niki | NULL | 2020-03-03 | 3 | 0 | 2019-01-10 19:00:28.227086 | +-----+------------+------------+----------+---------+------------+-------+----------+----------------------------+ 3 rows in set (0.00 sec) MariaDB [userdb]> exit
這樣,你的資料庫假裝已經建立好囉!
- 透過 PHP 方法,連結到資料庫
現在,開始使用 PHP 來將資料整個秀出來看一下!使用的方法簡單如下處理:
- 先建立 /var/www/html/functions.php 檔案,內容有點像這樣:
[root@localhost ~]# vim /var/www/html/functions.php <?php $db_link = mysql_connect('localhost', 'username', 'userpw'); if ( ! $db_link ) { echo "資料連結失敗了!\n"; die; } $db_sel = mysql_select_db ('userdb', $db_link); if ( ! $db_sel ) { echo "資料庫選取失敗了!\n"; die; } ?>
- 使用瀏覽器瀏覽 http://localhost/functions.php ,如果出現一片空白,那應該就是 OK 了! 如果出現資料庫連結失敗,那就需要注意了!
- 建立使用者資料匯出的網頁,檔名設定為 userlist.php 好了,內容有點像這樣:
[root@localhost ~]# vim /var/www/html/userlist.php <?php include ('functions.php'); ?> <!doctype html> <html> <head> <meta charset='utf-8' /> </head> <body> <?php $result = mysql_query ('select uid, login_name, realname, u_email, u_bday, u_sex, u_regd, u_active from userinfo', $db_link ); $db_line = mysql_num_rows($result); echo "總資料數:" . $db_line ; echo "<br /><br />"; while ( $row = mysql_fetch_row($result) ) { for ( $i=0; $i<count($row); $i++ ) { echo $row[$i] . ", "; } echo "<br />"; } ?> </body> </html>
- 請到瀏覽器上,輸入 http://localhost/userlist.php ,應該就可以看到成果了:
我們已經手工打造出一個資料庫、資料表、PHP 連結網頁了!未來上面那個 mysql_query 一直重複應用,就會得到你的資料了!
- 資料庫備份的功能
上面的動作都是先在指令列上面完成的!那,有沒有可能將這些東西『備份』下來呢?可以的!可以將資料庫內容備份成為文字檔! 方法也是很簡單!
[root@localhost ~]# mysqldump -u username -p userdb > userdb.database Enter password: [root@localhost ~]# ll userdb.database -rw-r--r--. 1 root root 2586 1月 10 19:25 userdb.database [root@localhost ~]# cat userdb.database | grep -v '^/' | grep -v '^-' | grep -v '^$' DROP TABLE IF EXISTS `userinfo`; CREATE TABLE `userinfo` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `login_name` varchar(40) COLLATE utf8_unicode_ci NOT NULL, `login_pass` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `realname` varchar(40) COLLATE utf8_unicode_ci NOT NULL, `u_email` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `u_bday` date NOT NULL, `u_sex` tinyint(4) NOT NULL DEFAULT '0', `u_active` tinyint(4) NOT NULL DEFAULT '0', `u_regd` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; LOCK TABLES `userinfo` WRITE; INSERT INTO `userinfo` VALUES (1,'axxxcyyy','1234','melody',NULL,'2020-01-01',1,0,'2019-01-10 10:59:47.603286'), (2,'axxxcyy2','2234','amanda',NULL,'2020-03-01',2,0,'2019-01-10 11:00:10.314283'), (3,'axxxcyy3','3234','niki',NULL,'2020-03-03',3,0,'2019-01-10 11:00:28.227086'); UNLOCK TABLES;
未來要復原就方便得很了!