網頁&資料庫 Linux主機服務(Linux主機伺服器架設技術)
網頁&資料庫 Linux主機服務(Linux主機伺服器架設技術)
Linux 上預載之網頁及資料庫伺服器有,網頁(WWW):Apache2,動態網頁語言:PHP5,資料庫:MySQL5。
這三套的組合,可供網站管理者放置純靜態網頁(HTML)以及含 PHP+MySQL 的動態網頁。
也因此,可以架設一些具 Web 2.0 互動功能的網站,如 XOOPS(CMS), WordPress(部落格), Moodle(數位學習), MediaWiki(共筆系統), osTube(影音平台), Joomla(CMS), Drupal(CMS)…等等。這樣一來可以服務學校同仁,令所有行政人員皆可自主貼公告、影片及照片,二來減少網管網站內容維運的工作壓力。
開啟PORT
* TCP 80 Apache2 + PHP
* TCP 443 加密通道(HTTPS)
* TCP 3306 MySQL
網頁伺服器 Apache2
基本設定
基本結構
* 預設網頁存放位置: /var/www
注意:除了上傳之必要子目錄外,此資料夾切不可以讓 www-data 可完整讀寫
* 預設個人網頁位置: /home/user/public_html
* 設定檔位置: /etc/apache2
主設定檔: /etc/apache2/apache2.conf
必載入之相關設定: /etc/apache2/conf.d/*
注意:在此目錄下的所有設定檔皆會被執行,所以若有任何修改,其備份設定檔不可留在原地
可用模組: /etc/apache2/mods-available
模組啟用: /etc/apache2/mods-enabled
可用虛擬站台: /etc/apache2/sites-available
虛擬站台啟用: /etc/apache2/sites-enabled
* 記錄檔
存取記錄: /var/log/apache2/access.log
錯誤記錄: /var/log/apache2/error.log
模組管理
* 模組安裝管理
列出可供安裝的 apache2 套件,裡面名為 apache2-xxx 之套件就是可安裝的模組:
root@dns:~# apt-cache search libapache2
安裝模組:
root@dns:~# apt-get install libapache2-mod-xxxx
* 啟用模組
1. 列出模組真實名稱
root@dns:~# cd /etc/apache2/mods-available
root@dns:~# ls
2. 啟用所找到模組,例如:啟用個人網頁模組
root@dns:~# a2enmod userdir
注意:模組設定檔大多會有 *.load 及 *.conf 但啟用時,不用輸入副檔名
3. 重新啟動 Apache2
root@dns:~# service apache2 restart
* 註:Apache2 模組並不等於 PHP5 模組,請勿搞混
首頁基本參數
* 首頁設定檔: /etc/apache2/sites-available/default
* 參數解說
參數 選項 說明
DocumentRoot /var/www 首頁資料夾位置在 /var/www
Options Indexes 首頁沒 index.html 時,自動列出檔案清單
FollowSymLinks 允許使用 Alias 建立的資料夾捷徑(ex. phpmyadmin)
MultiViews 增強多國語言支持(Big5 & UTF8 同存也算),但會影響效能
AllowOverride All 支援 htaccess 程度,若 All 代表完全支援 htaccess 語法
Order
allow, deny allow from 及 deny from 抵觸時,以 allow 占較高優先權
allow from all 允許所有 IP Address 瀏覽本網站
優化Big5與UTF8網頁並存時之處理
* /etc/apache2/conf.d/charset → 把 AddDefaultCharset 註解掉
root@dns:~# vi /etc/apache2/conf.d/charset
# AddDefaultCharset UTF-8
* 在 /etc/apache2/sites-available/default ,加上 MultiViews
root@dns:~# vi /etc/apache2/sites-available/default
…
DocumentRoot /var/www
<Directory />
Options FollowSymLinks Multiviews
AllowOverride All
</Directory>
<Directory /var/www/>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
…
個人網頁
個人網頁功能是讓一般的使用者可以在自己的家目錄底下建立網頁,塔配 ftp 功能,讓使用者自己管理自己的網站。
* Linux/Linux Server 預設個人網頁位置: /home/username/public_html
* 連線方式: http://your.host.name/~username/
Linux e 及 sqz 啟用個人網頁功能
Linux e 版本起,預設並沒啟用個人網頁的功能,因此要做一些調整。
* 啟動個人網頁
root@dns:~# a2enmod userdir
* 重新啟動 Apache2
root@dns:~# service apache2 restart
* 若要讓個人網頁也可以執行 PHP Code, Linux sqz 這個版本必須繼續修改 /etc/apache2/mods-available/php5.conf , 把下面幾行加 # 註解
<IfModule mod_php5.c>
<FilesMatch ".ph(p3?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
# Tre-enable php in user directories comment the following lines
# (from <IfModule …> t</IfModule>.) DNOT set it tOn as it
# prevents .htaccess files from disabling it.
# <IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_value engine Off
# </Directory>
# </IfModule>
</IfModule>
自訂個人網頁位置
有時,自舊機器移轉至 Linux 時,由於個人網頁的舊設定值是 /home/user_name/html 與 Linux 上的預設值 /home/user_name/public_html 不同,因而出現一些問題。因此,我們可透過修改一些參數,而不必去把每個有個人網頁的使用者找出來修改其網頁資料夾位置仍能達成個人網頁的使用。
* 注意: Linux sqz 版預設沒有啟動個人網頁功能,請先啟用
root@dns:~# a2enmod userdir
root@dns:~# service apache2 restart
* 設定檔 /etc/apache2/mods-available/userdir.conf
* 修改下面紅字的部分
<IfModule mod_userdir.c>
UserDir html
UserDir disabled root
<Directory /home/*/html>
AllowOverride FileInfAuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
</IfModule>
* 重新啟動 Apache2 伺服器
root@dns:~# service apache2 restart
* 注意: /home/user_name 資料夾的權限必須為 755 才可以
自訂錯誤訊息
這裡所謂的錯誤訊息,是指外面連到學校網頁時,連到某些不存在或有設密碼的網頁時,Apache2 會送出一些警告訊息,以通知瀏覽者。但是,由於這些錯誤訊息並沒有中文版,會造成一些困擾。不過,我們仍可自行製作屬於自己的錯誤訊,比如:瀏覽到不存在網頁,您可以說「別搞怪!本站沒此頁面…看…什麼!」。
* 設定檔位置,在此,筆者以 /etc/apache2/apache2.conf 為例
Linux Server(Janaca) ~ Linux e系列: /etc/apache2/apache2.conf
Linux sqz : /etc/apache2/conf.d/localized-error-pages
* 修改步驟如下:
1. 修改設定檔啟用自訂頁面,依本例:只建立 404 及 403 兩訊息,其餘不變
root@dns:~# vi /etc/apache2/apache2.conf
找到以下內容,修改紅字部分
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boboo."
ErrorDocument 403 /errmsg/e403.php
ErrorDocument 404 /errmsg/e404.php
#ErrorDocument 402 http://www.example.com/subscription_info.html
2. 找一個地方並寫好自訂訊息頁面,依本例其位置在: /var/www/errmsg/
* 編輯 e403.php 權限不足警告頁例子
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="zh-tw">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>403 Permission Deny!</title>
</head>
<body>
<br><br>
<h2 align="center">403 Permission Deny! 抱歉您無權閱讀本網頁!
<br><br>
<?php ech"<a href='http://".$_SERVER["HTTP_HOST"]."/>回本站首頁</a>" ?>
</h2>
</body>
</html>
* 編輯 e404.php 找不到頁面的警告頁例子
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="zh-tw">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>404 not find!</title>
</head>
<body>
<br><br>
<h2 align="center">404! 找不到您要求的網頁!
<br><br>
<?php ech"<a href='http://".$_SERVER["HTTP_HOST"]."/>回本站首頁</a>" ?>
</h2>
</body>
</html>
3. 重新啟動 Apache2
root@dns:~# service apache2 restart
新增虛擬站台
在此,筆者是以下列之模擬情境列文說明,此情境適用於當學校有另一個人需獨立負責某一網站,網管人員可以在不交出 root 權限下,開放一組 PHP+MySQL 網頁空間給該使用者。
* 管理者開設一組 Linux 及 MySQL 的 user 帳號/密碼,如:myuser。
* 因此在 /home 及 /var/lib/mysql 底下皆會產生 myuser 資料夾。
使用者只能用 ftp 及 phpmyadmin 管理自己的網頁及資料庫(看不到其他資料)。
* 最後管理者改變網址之指定,如下所示:
http://your.host.name/~myuser –> http://myuser.your.host.name/
開設 myuser 帳號
* 新增 Linux 帳號
root@dns:~# adduser myuser
* 使用 phpmyadmin 建立 MySQL 空間
1. 建立資料庫 myuser
在 phpmyadmin 首頁就有建立資料庫的功能,請依自己的需求建立
2. 下 SQL 語法,建立 myuser 使用者並使其只能完全存取 myuser 資料庫
GRANT ALL PRIVILEGES
ON myuser.*
T'myuser'@'localhost'
IDENTIFIED BY 'myuser_pwd';
修改 DNS 設定
新增 myuser.your.host.name 網址
以大成國小 dns 正解設定檔 /etc/bind/db.dc1es.tnc.edu.tw 舉例如下:
:
www IN CNAME dns.dc1es.tnc.edu.tw.
myuser IN CNAME dns.dc1es.tnc.edu.tw.
;
mail IN A 163.26.182.1
s2 IN A 163.26.182.2
:
以上例而言:筆者新增了一筆 myuser.dc1es.tnc.edu.tw → 163.26.182.1 的 dns 記錄,也就是說目前 163.26.182.1 有多個英文網址,比如 :
* dc1es.tnc.edu.tw
* dns.dc1es.tnc.edu.tw
* www.dc1es.tnc.edu.tw
* mail.dc1es.tnc.edu.tw
* myuser.dc1es.tnc.edu.tw
:
:
等
等
新增 myuser 虛擬站台
* 設定檔: /etc/apache2/sites-available
* 工作原理
原預設值是針對 hostname 設定(ex: dns.dc1es.tnc.edu.tw)
要啟用多組設定,不能針對您所要的 myuser 設定,必須考慮周詳。亦即把使用者連至學校首頁的所有可能性皆設妥。例如: http://www.dc1es.tnc.edu.tw 、http://dc1es.tnc.edu.tw 、http://163.26.182.1
修改 /etc/apache2/sites-available/default
修改 default 以供 http://dc1es.tnc.edu.tw 使用
* root@dns:~# vi /etc/apache2/sites-available/default
Linux Server ~ Linux t3 前面幾行舉例如下:
NameVirtualHost *
<VirtualHost *>
ServerAdmin webmaster@dns.dc1es.tnc.edu.tw
# ServerName dc1es.tnc.edu.tw
DocumentRoot /var/www/
:
:
Linux e1 ~ Linux sqz 前面幾行舉例如下:
<VirtualHost *:80>
ServerAdmin webmaster@dns.dc1es.tnc.edu.tw
ServerName dc1es.tnc.edu.tw
ServerAlias www.dc1es.tnc.edu.tw
ServerAlias 163.26.182.1
DocumentRoot /var/www/
:
:
建立 /etc/apache2/sites-available/myuser
建立 myuser 供 http://myuser.dc1es.tnc.edu.tw 使用
* root@dns:/etc/apache2/sites-available# vi myuser (內容如下所示)
Linux Server 示例
<VirtualHost 163.26.182.1:80>
ServerAdmin myuser@dc1es.tnc.edu.tw
ServerName myuser.dc1es.tnc.edu.tw
DocumentRoot /home/myuser/public_html/
<Directory /home/myuser/public_html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
AddType application/x-httpd-php .php
</Directory>
</VirtualHost>
Linux Server 示例
<VirtualHost *:80>
ServerAdmin myuser@dc1es.tnc.edu.tw
ServerName myuser.dc1es.tnc.edu.tw
DocumentRoot /home/myuser/public_html/
<Directory /home/myuser/public_html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
AddType application/x-httpd-php .php
</Directory>
</VirtualHost>
啟動各服務
* root@dns:~# a2ensite myuser
* root@dns:~# service bind9 restart
* root@dns:~# service apache2 restart
Apache2 資安管理
特定網頁之連線限制
若學校有些網頁只限校內 IP 讀取(intranet),但又不想另外架一台網頁伺服器,這時可以透過對資料夾的讀取權限制來達成此一目的。其設定方式可以參考 Linux Server 上 ra-phpmyadmin 之參數寫法,詳見以下說明:
設定方式
* 設定位置: /etc/apache2/conf.d
* 舉例說明: /etc/apache2/conf.d/ra-phpmyadmin
# 要鎖的資料夾, 舉例而言 /var/www/myweb –> 要寫成 <Location /myweb>
<Location /phpmyadmin>
order deny,allow
deny from all
# 可連線區, 新增教網中心網段
allow from 127.0.0.1 163.26.182.0/24 203.68.102.0/24
Options FollowSymLinks MultiViews
</Location>
無法連線之錯誤訊息
Forbidden
You don't have permission taccess /phpmyadmin/ on this server.
Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch Server at 163.26.182.234 Port 80
解除方式
解除的方式很簡單,把 ra-phpmyadmin 搬走即可,做法如下:
* root@dns:~# mv /etc/apache2/conf.d/ra-phpmyadmin /root
* root@dns:~# service apache2 restart
* 註:絕對不可以把原檔改個名字仍留 conf.d 資料夾內,因為這個資料夾內所有的檔案(無論檔名為何)皆會被執行。
上傳區禁止執行 Script 語言
有時會因一些架站軟體的要求,要建立資料上傳區,如 /var/www/uploads ,而且其檔案權限必須是網頁伺服器(www-data)可讀取(或設成 777)。此時,若有心人士,無論是經由合法手段或透過 PHP 程式漏洞,把 *.php 丟到 uploads ,再經由瀏覽器執行,這樣就會產生資安風險。但如果,不讓 Apache2 伺服器對 uploads 底下特定類型 script 予以解譯並執行的話,那麼此風險就可降到最低。詳細做法如下:
* 先確認 /etc/apache2/sites-available/default 之 AllowOverride 參數改為 All,擷取部分內容如下
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
* 建立 /var/www/uploads/.htaccess
root@dns:~# vi /var/www/uploads/.htaccess (內容示例如下)
<FilesMatch ".(php|php3|php4|php5|phtml|pl|py|sh|cgi)$">
deny from all
</FilesMatch>
* 註:影響力只達 .htaccess 所在之資料夾
* 改 .htaccess 權限為 root 所有,其他身份唯讀,以免被使用者上傳自己的 .htaccess 覆蓋
root@dns:~# chown root.root /var/www/uploads/.htaccess
root@dns:~# chmod 644 /var/www/uploads/.htaccess
鎖密碼網頁製作
假設有個資料夾,裡面的網頁具有機密性,只允許特定人員登入後才可觀看,這可以透過 .htaccess 的設定來協助達成。
確認 AllowOverride 參數
如上文所言,要啟用 .htaccess 之前,要先確認 /etc/apache2/sites-available/default 之 AllowOverride 參數是否為 All 。
建立 .htaccess
假設 http://your.host.name/topsecu/ 這個網址是要帳號密碼認證,那麼其在主機的實體位置為 /var/www/topsecu ,因此,必須在此處建立 .htaccess ,其內容示例如下。
* root@dns:~# vi /var/www/topsecu/.htaccess
AuthName "TopSecu"
AuthUserFile /var/passwords/topsecu.pwd
AuthType Basic
Require valid-user
* AuthName 站名
* AuthUserFile 密碼檔
* AuthType Basic 基本型式授權(不必分組)
* Require valid-user 要有帳號
建立密碼檔
* 第一次建立
root@dns:~# mkdir /var/passwords
root@dns:~# htpasswd –c /var/passwords/topsecu.pwd username
* 「-c」是供第一次建立用,若只是修改密碼或新增第二組帳號密碼,就不必再加此參數。
* 經過上述動作,會建立一組帳號為 username 的認證
網頁程式 PHP
基本設定
Apache2 是網頁伺服器,PHP5網頁語言是以 Apache2 模組的形式存在。因此,若有任何設定變更,只要重新啟動 Apache2 即可。
* 設定檔: /etc/php5/apache2/php.ini
PHP5 模組管理
PHP5 的模組安裝/移除與 Apache2 做法一樣,皆是透過 Debian 的 DEB 套件庫來處理,舉例如下:
* 模組搜尋
root@dns:~# apt-cache search php5
* 模組安裝
root@dns:~# apt-get install php5-imagick
* 模組移除
root@dns:~# apt-get remove php5-imagick
* 模組異動後,套用設定
root@dns:~# service apache2 restart
加大檔案上傳限制
PHP 預設檔案上傳限制為 2MB ,這對學校來說常常不夠用,不過我們可以透過 php.ini 的修改,來加大上傳限制。不過這裡的上傳限制與使用者網路空間限制(Quota)的意義不同,這裡是指用 PHP 寫的網站,若有上傳介面(如 SFS3, XOOPS…),無論是圖片或檔案之上傳限制。
* 修改 /etc/php5/apahce2/php.ini ,修改下列三個參數
root@dns:~#: vi /etc/php5/apache2/php.ini
;記憶體限制
memory_limit = 128M
;PHP 表單 POST 限制
post_max_size = 72M
;檔案大小限制
upload_max_filesize = 64M
其他設定
以下兩者皆已是預設值,不過仍提出以供參考
* 注意 php.ini 內的 utf-8 或 big5 編碼問題
;default_charset = "iso-8859-1"
註:加「;」變成註解,才可以讓 php 頁面自訂語系
* 若 php 程式要重送 header (ex.強迫轉址),請注意
output_buffering = 4096
加速 PHP 執行
* Linux t1~t3 可以使用 APC 加速 PHP 執行
1. root@dns:~# apt-get update
2. root@dns:~# apt-get install php-pear
3. root@dns:~# apt-get install php5-dev apache2-prefork-dev build-essential
4. root@dns:~# pecl install apc
出現 Use apxs tset compile flags (if using APC with Apache)? [yes] : 時,按「Enter」繼續
5. 編輯 /etc/php5/apache2/php.ini ,加上
extension=apc.so
6. 重新啟動 Apache2
root@dns:~# service apache2 restart
* Linux e1~sqz 可以使用 Xcache 加速 PHP 執行
xcache 簡介:它是 PHP 運算碼(opcode)快取器
安裝
root@dns:~# apt-get install php5-xcache
重新啟動 Apache2
root@dns:~# service apache2 restart
資料庫 MySQL
Linux 上自由軟體授權的資料庫目前有兩大勢力,一是 MySQL 另一是 PostgreSQL ,Linux 上預載的是 MySQL ,因此我們只針對 MySQL 進行簡易說明。
* 重要中文參考文件,MySQL 5.1 中文手冊:http://twpug.net/docs/mysql-5.1/
基本觀念(必讀)
* 主設定: /etc/mysql/my.cnf
* 開啟埠
對外:TCP 3306
對本機:不必開通訊埠
註:若 PHP 程式碼與 MySQL Server 位於同一台機器,可以把 3306 埠關閉
* 記錄檔: /var/log/mysql.log
* 系統資料庫: /var/lib/mysql/mysql
各 MySQL 版本的系統資料庫格式不一樣,若錯用會導致資料庫無法啟動
若此一資料庫被誤刪,可用 mysql_install_db 指令建立
* 資料庫位置: /var/lib/mysql
* 資料庫解說
在 /var/lib/mysql 內每個資料夾皆是一組資料庫
資料夾及其檔案之擁有者為 mysql.mysql
資料夾內同名字之三個檔案組成一個資料表
*.frm –> 欄位定義
*.MYD –> 實體資料
*.MYI –> 資料索引
MySQL 管理
MySQL系統管理
* 關於 MySQL 管理幾個基本觀念
MySQL 有自己的帳號密碼
MySQL 最高權限帳號與 Linux 一樣是 root ,但密碼不同(除非設成一樣)
MySQL 的帳號密碼是給網頁程式碼(ex. php)連線用,使用者使用的機會,只僅限 phpmyadmin 連線時才會需要
Linux 上所設定的管理密碼(Linux-csetup-utf8)就是 MySQL 的 root 密碼
* 啟動/關閉/重新啟動
root@dns:~# service mysql start|stop|restart
* 初始化系統資料庫
root@dns:~# mysql_install_db
註:本功能僅限 /var/lib/mysql/mysql 已被誤刪的情況下才可以使用
* 初設 MySQL root 密碼
root@dns:~# mysqladmin -u root -p password
註1:輸入 Linux root 密碼後即才可繼續輸入 MySQL 密碼
註2:Linux 本動作不必做,因為 Linux-csetup-utf8 己幫忙處理過了。
* 修復資料表索引
root@dns:~# mysqlcheck -u root -p -f 資料庫名 資料表名
忘記 MySQL 密碼
* 方法一:執行 Linux-csetup-utf8,重設管理密碼
注意:它除了會幫您重設密碼外,也會額外重設許多設定,因此不太建議使用此方法。
* 方法二:直接使用 MySQL 工具重設
1. 停止 MySQL
root@dns:~# service mysql stop
2. 建立 /root/newpwd.txt
root@dns:~# vi /root/newpwd.txt
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPassword');
3. 啟動 MySQL
root@dns:~# mysqld_safe –init-file=/root/newpwd.txt &
4. 關閉 MySQL
root@dns:~# service mysql stop
5. 刪除 newpwd.txt
root@dns:~# rm -rf /root/newpwd.txt
6. 啟動 MySQL
root@dns:~# service mysql start
註:重新啟動後 MySQL root 密碼已被重設
資料庫管理
整個資料庫管理,建議使用 phpmyadmin 網頁工具,簡介如下:
* phpmyadmin 安裝
root@dns:~# apt-get update
root@dns:~# apt-get install phpmyadmin
註:大多數的 Linux 多已安裝此套件
* phpmyadmin 使用:直接使用網頁瀏覽器,連結至 phpmyadmin 網站即可
舉例:http://your.host.name/phpmyadmin
連線後,以 MySQL 的帳號密碼進入
只有用 root 登入,才會有全部功能
可以透過 GRANT 語法,建立特定帳號,而它只能掌控單一資料庫(詳見本文:建立虛擬站台段落)
* 資料庫搬家
Linux 系列 Server 之 MySQL 資料庫皆在 /var/lib/mysql
只要下指令把 /var/lib/mysql 底下之資料庫(夾)複製至新主機相同之位置,並修改權限擁有者為 mysql 即可完成搬移任務。以 sfs3 資料庫為例,做法如下:
1. 複製
root@dns:~# scp root@your.old.host:/var/lib/mysql/sfs3 /var/lib/mysql
2. 修改擁有者
root@dns:~# chown -R mysql.mysql /var/lib/mysql/sfs3