Apache HTTP Server (httpd) 是一款常見的開源網頁伺服器軟體。近年來面對 Nginx、IIS 等網頁伺服器軟體的競爭,仍然具有很高的市佔率。是不少的網頁開發套件 (例如,XAMPP) 內建的網頁伺服器。httpd 的設定問題容易在網路上找到相關的解決方法,適合做為小型開發專案或是輕量服務需求的網頁伺服器。
卸載 macOS 內建的 httpd
檢查 macOS 是否內建 Apache HTTP Server (httpd)1,並且已經將其載入到 Launchd:
sudo launchctl list | grep httpd
如果 macOS 有內建 httpd,並且已經將其載入到 Launchd 時;必須先將其從 Launchd 中卸載:
sudo apachectl stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
(launchctl 以及 Launchd 的簡介請參考。)
註1:配合 macOS Server 5.7 以後不再支援來自開源軟體的圖形化管理介面,從 macOS 10.14 開始,已不再內建 httpd (請參考 macOS Server 的前世今生)。
使用 Homebrew 安裝 httpd
安裝 httpd 最簡單的方式是使用網頁開發套件。但是,使用套件會有下列的缺點:打包好的軟體不一定包含需要的軟體、軟體的版本受到限制、更新的速度較慢等。為了安裝與管理應用程式,套件管理工具被廣為使用。其中 Homebrew 是 macOS 使用者最常使用的套件管理工具 (Homebrew 的簡介請參考)。使用 Homebrew 安裝 httpd 只需要執行下列的命令:
brew update
brew upgrade
brew install httpd
brew upgrade
brew install httpd
Homebrew 會執行下列的安裝工作:
1. 安裝檔案夾在 /usr/local/Cellar/httpd/2.24.xx (xx為版本號碼),
2. 執行程式 (例如,apachectl、httpd 等) 會被符號連結 (symlink) 到 /usr/local/bin,
3. 設定檔則是放在 /usr/local/etc/httpd,
4. /usr/local/opt 檔案夾中的 apache-httpd、apache2、以及 httpd 是安裝檔案夾的符號連結。
我們可以透過執行 echo $PATH 檢查 PATH 環境變數的設定,確認在使用 apachectl 等命令時,會優先執行使用 Homebrew 安裝的 httpd:
echo $PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
因為 /usr/local/bin 在路徑設定的最前面,所以被 symlink 到該檔案夾的命令會被優先執行。
安裝完成後可以執行下列的命令來啟動 httpd:
apachectl start
開啟瀏覽器,連線到 http://localhost:8080/,可以看到 It works! 的網頁。
注意:存取記錄 (Access Log) 跟錯誤記錄 (Error Log) 預設是記錄在 /usr/local/var/log/httpd/ 檔案夾,並且對應到 /private/var/log/apache2/ 檔案夾。如果之前已經使用過 root 啟動過 httpd,命令前面需要加上 sudo,不然執行 apachectl start 時會出現需要 root 權限的提示,執行 httpd -k start 時會出現 AH00091: httpd: could not open error log file /private/var/log/apache2/error_log.
解決的方法為使用 root 權限刪除記錄檔。
設定 httpd (修改 httpd.conf)
/usr/local/etc/httpd/httpd.conf 是 httpd 的主要設定檔。為了使用上的需求,我們需要修改某些設定。下面列出幾個常見的設定。
監聽埠
安裝完後的預設監聽埠是 8080,而不是常用的 80 埠;我們需要找到 httpd.conf 中的 Listen 設定,更改為監聽 80 埠:
Listen 80
伺服器名稱
當沒有在 httpd.conf 設定伺服器名稱時,在啟動或關閉 httpd 時會出現下列的訊息:
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using MacBook-Pro.local. Set the 'ServerName' directive globally to suppress this message
找到 ServerName 設定,取消註解並且改為下列的設定:
ServerName localhost
文件根目錄
做為個人開發平台,預設的文件根目錄 /usr/local/var/www,在文件的相關操作上會比較不方便。將文件根目錄改設為使用者家目錄下的 www 檔案夾,可以方便文件的編修以及檢視。找到 httpd.conf 中的 DocumentRoot 設定,指定文件根目錄到使用者家目錄下的檔案夾:
DocumentRoot "/Usrs/user_name/www"
<directory "/usr/local/www></directory>
<directory "/usr/local/www></directory>
在文件根目錄設定的下方會有一個針對該檔案夾的設定,我們需要改為新的文件根目錄:
<Directory "/Usrs/user_name/www">
注意:因為 macOS 的系統完整保護 (System Integrity Protection, SIP)機制,建議文件根目錄設定為使用者家目錄下的檔案夾,或是使用預設值。
在使用者家目錄建立文件根目錄檔案夾並且新增一個 index.html 檔案:
mkdir ~/www
echo "<h1>My Page</h1>" > ~/www/index.html
echo "<h1>My Page</h1>" > ~/www/index.html
重新啟動 httpd:
sudo apachectl -k restart
注意:因為使用了 80 埠,此時命令要加上 sudo。
開啟瀏覽器,連線到 http://localhost/,可以看到 My Page 的網頁。
將 httpd 設定為開機時啟動的守護行程 (Daemon)
要讓 httpd 能夠在開機自動執行,可以執行下列的命令:
sudo brew services start httpd
brew services 的簡介可以參考這裡。
安裝 Homebrew-services 後,也可以使用它將 httpd 從 Launchd 移除:
sudo brew services stop httpd
或是重新加入 Launchd:
sudo brew services restart httpd
將 httpd 設定為登入時啟動的任務項 (Agent)
要讓 httpd 能夠在登入後自動執行 (注意,此時 httpd.conf 中的監聽埠不可以小於 1024,LOG 檔的擁有者要是使用者),可以執行下列的命令:
brew services start httpd
安裝 Homebrew-services 後,也可以使用它將 httpd 從任務項中移除:
brew services stop httpd
或是重新加入任務項:
sudo brew services restart httpd
僅啟動 httpd
Homebrew-services 也可以只用來啟動 httpd:
brew services run httpd
brew services run 使用目前使用者的權限執行,所以要注意監聽埠、檔案夾權限等設定問題。
沒有留言:
張貼留言