如何使用 Apache Virtual Host 功能在 同一台伺服器建立多個網站
自從換了固定 IP 的上網方案之後,盡可能壓榨出每一分的應用就變成理所當然的事情了,所以這次小獅要跟大家分享一下在同一個 IP 下,透過 Virtial Host 的功能,對應不同 Domain 顯示不同網頁的作法!
前情提要
小獅這次要建立的有 2 個網站:
- home.alexleo.click
- 暫時堆放一些隨便寫的 HTML/PHP 頁面
- img.alexleo.click
- 本站未來的圖片伺服器,也就是圖床的意思
建立網頁資料夾
Apache 預設的網頁資料夾就在 /var/www
資料夾底下,為求方便,我們這次就先不弄個人網頁的設定了(反正目前也只有小獅一人負責伺服器管理…)
- 先切進 /var/www 資料夾下看看有什麼吧!
cd /var/www
ls -al
- 使用
sudo
權限建立 img 網域的資料夾(名稱隨意)sudo mkdir img
- 檢查一下權限(重點在於提供一般使用者讀取權限)
剛才建立的資料夾,是作為各個網站(Virtial Server)的根,比如說在瀏覽器輸入 img.alexleo.click 時,就會自動去搜尋底下的 index.html 或 index.php,不會看到更上層的檔案,所以被稱作根目錄
設定測試頁面
先用自己習慣的文字編輯器,在剛才建立的網頁根目錄中,新增測試用的 HTML 檔案(差不多就是一個 Hello World 的感覺),小獅習慣使用 vim
sudo vim html/index.html
檔案內容:
<html> <head> <title>Welcome to home.alexleo.click!</title> </head> <body> <h1>Success! The home.alexleo.click virtual host is working!</h1> </body> </html>
另一個資料夾也是同樣的手法
sudo vim https://img.alexleo.click/Apache_Multi-Site/index.html
檔案內容:
<html> <head> <title>Welcome to img.alexleo.click!</title> </head> <body> <h1>Success! The img.alexleo.click virtual host is working!</h1> </body> </html>
編輯完成之後按 Esc 輸入 :wq
按 Enter 退出
如果本來就有預設的
index.html
檔案,可能因為快取機制的關係沒辦法馬上顯示出來,可以使用以下指令重新啟動 Apachesudo systemctl restart apache2
設定 virtual Host 設定檔
在開始之前,先讓我們看看目前電腦裡有哪些設定檔吧!
cd /etc/apache2/sites-available/ ls -al
注:因為小獅忘記截圖,所以上圖使用的是另一台伺服器
接下來,讓我們先看看預設值(已套用 Let’s Encrypt)長什麼樣子吧!
# 怕改壞的話可以不加 sudo,這樣會變成唯讀 sudo vim 000-default.conf
中文解釋版
<VirtualHost *:80> # 設定伺服器的 IP / Domain # 預設設定檔(000-default.conf)中可以不設定,但手動新增的設定檔就一定要 # 注:一般 HTTP(S) 請求標頭中會有 Host 項目,必須與 ServerName 相符才會處理 #ServerName www.example.com # 網站管理員的電子郵件信箱(可隨意填寫) ServerAdmin webmaster@localhost # 網站根目錄位址(限絕對位址) DocumentRoot /var/www/html # 記錄資料的詳盡程度,依次為 trace8, ..., trace1, debug, info, # notice, warn, error, crit, alert, emerg. #LogLevel info ssl:warn # 記錄檔位址 # Red Hat 陣營 - /var/log/httpd # Debian 陣營 - /var/log/apache2 # FreeBSD - /var/log/httpd-error.log ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # 可以指定這個 VirtualHost 專有的設定檔(位於 conf-available 資料夾中) # 即使使用 a2disconf 設定全域(global)停用,仍然有效 #Include conf-available/serve-cgi-bin.conf # 將特定格式的使用者請求 URL 轉為 Request(另譯為 "偽靜態") # 據說以前對 SEO 相當有效,錯誤的設定可能會影響安全性 # 建議整段刪除即可 RewriteEngine on RewriteCond %{SERVER_NAME} =home.alexleo.click RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] </VirtualHost>
複製一份預設的設定檔來修改
sudo cp 000-default.conf img.alexleo.click.conf
依照需求修改內容,以這次來說,我只有改 ServerName、DocumentRoot
<VirtualHost *:80> ServerName img.alexleo.click ServerAdmin webmaster@localhost DocumentRoot /var/www/img ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
按 Esc 後 :wq
退出
套用修改後的設定檔
請 Apache 啟用剛才的設定檔,不需要輸入路徑,可以使用 Tab 自動完成
sudo a2ensite img.alexleo.click.conf
注:圖片中的警告是因為我忘記設定 locale,請注意紅框處即可
雖然提示訊息是使用 service 指令,不過實際上我們是使用 Systemd 系統,所以建議使用 syystemctl 來操作喔!
sudo systemctl reload apache2
開啟瀏覽器!
同場加映:我有使用 Let’s Encrypt 該怎麼辦?
如果你先前設定過 Let’s Encrypt 的話,可能會發現憑證出錯了!這是因為你原本的憑證設定並未包含新的網域所導致,所以我們會需要重新設定 Let’s Encrypt 憑證
如果你之前是跟著其他教學做的,請務必檢查一下
/etc/apache2/apache2.conf
裡面有沒有包含 ServerName 設定,我會建議加個 # 號把它註解掉
啟動 CertBot(Let’s Encrypt 提供的工具程式)
sudo letsencrypt --apache
詢問是否要延伸設定到新的 Domain,選 是 <Expand>
用上下鍵選擇要套用的 Domain,空白鍵選取
選擇重導向所有流量到 HTTPS
恭喜設定完成~
後記
千萬要記得截圖啊,小獅這次各種重做就是為了那幾張圖 Orz
另外,小獅後來發現預設的那個 default-ssl.conf 可以刪掉沒關係,並不會影響運作
(而且個人私心認為這樣比較對稱…)
總之本站的圖床最近應該會搬新家,到時候有機會再來寫 CDN 或 AWS 的教學
~ 完 ~