2019年12月13日 星期五

在 macOS 安裝 Apache HTTP Server


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


(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


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


因為 /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 "/Usrs/user_name/www">


注意:因為 macOS 的系統完整保護 (System Integrity Protection, SIP)機制,建議文件根目錄設定為使用者家目錄下的檔案夾,或是使用預設值。


在使用者家目錄建立文件根目錄檔案夾並且新增一個 index.html 檔案:
mkdir ~/www
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 使用目前使用者的權限執行,所以要注意監聽埠、檔案夾權限等設定問題。



沒有留言: