GCP Workshop3 - My Virtual Host

PIXNET 內部開了 SA Workshop,學習自架網頁 Server 服務。練習時間半小時。

第一課: 用 GCP 自架 Web server 安裝了 Apache Server

第二課: 安裝 PHP, MySQL, phpMyAdmin 安裝了 Apache Server

第三堂,我們將來設定自己 Server 上的 Virtual Host

Agenda:

  1. Write Your Virtual Host Config
  2. Configure Virtual Host
  3. Configure PHP Error Log
  4. Upload Your Application
  5. Homework

1. Write Your Virtual Host Config

假設今天我們擁有自己的域名(domain),我們可以透過 Apache 的 Virtual Hosting 來使得網域指向機器的位置來提供服務。

何謂 Virtual Hosting?

Virtual Hosting 就是同一台伺服器可以同時處理超過一個網域 (domain)。即是說,假設 www.example1.net 和 www.example2.net 兩個網域都指向同一部電腦,如果電腦上的網頁伺服器 (WWW Server) 支援 Virtual Hosting,那您用 www.example1.net 和 www.example2.net 去訪問同一個伺服器就可以取得不同的網站。 ref. http://wiki.linux.org.hk/w/Virtual_hosting_with_Apache

為了方便做 demo 我們先在自己的家目錄建立一個叫做 production 的資料夾

$ mkdir ~/production

接著進入撰寫 Virtual Host 設定正題:

$ cd /etc/apache2/
$ sudo cp sites-available/000-default.conf sites-available/win.blah.tw.conf
$ sudo vim sites-available/win.blah.tw.conf

在 Apache sites-available 裡面放的是該台 Apache2 會讀取的 Virtualhost 設定,建議檔案名稱以 網域 來做命名

以上述的例子,我擁有一個 win.blah.tw 的域名要來設定,複製預設的範本改名為 win.blah.tw.conf

  • 接著要修改的項目有:
    1. DocumentRoot 之上增加 ServerName win.blah.tw
    2. DocumentRoot 改成 DocumentRoot /home/win/production
    3. 在 Virtual Host Tag 之內增加以下內容:
<Directory /home/win/production/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
  • 名詞解釋:
    • ServerName: 指定設定的網站名稱
    • DocumentRoot: 存放網站內容的目錄路徑

2. Configure Virtual Host

接著必須讓 Apache2 能讀到你剛剛撰寫的配置檔,所以要把剛剛在 /etc/apache2/sites-available 底下撰寫的檔案建立連結到 /etc/apache2/sites-enabled

方法有二種:

  1. 手動建立:

    $ ln -s /etc/apache2/sites-available/win.blah.tw /etc/apache2/sites-enabled/win.blah.tw

  2. 透過 a2ensite 工具,這是 apache 2 enable site 的縮寫,等同於 1. 手動建立 的做法

    $ a2ensite win.blah.tw

完成以上步驟之後,重新啟動 Apache server 來進行測試

$ sudo service apache2 reload

3. Configure PHP Error Log

編輯 /etc/php/7.0/apache2/php.ini 檔案設定 Error 的回報層級,以及錯誤 Log 的寫入位置,調整:

  • add Error Reporting Level: error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
  • add error_log: error_log=/var/log/php-err.log

接著先開立一個空白錯誤檔案,並且調整該檔案的權限後再行測試即可

$ sudo touch /var/log/php-err.log
$ sudo chown www-data /var/log/php-err.log
$ sudo service apache2 restart

測試時你可以故意把 PHP Code 寫錯使得請求時回報錯誤,看錯誤訊息是否有進入該目錄檔案中。

可以透過 tail -f 來自動 watch

$ tail -f /var/log/php-err.log

4. Upload Your Application

在上述設定完畢之後,我們試著把你的網頁應用程式上傳到家目錄底下的 production 資料夾看看

上週練習中,我們已經有提供 PHP 的範例程式了,如果還沒有實作也可以下載我提供的 自家 API 練習範本程式

除了可以使用 wget 之外,我們已經可以利用 scp or rsync 指定網域的方式來傳送:

$ scp -r myprogram/ win@win.blah.tw:production/

只有檔案不同才上傳

$ rsync -a myprogram/ win@win.blah.tw:production/

Server 與 Client 都要裝 rsync,但如果你是 mac user 太好了! 內建就有

ps. 如果要停用這個 Virtual Host

$ sudo a2dissite win.blah.tw
$ sudo service apache2 restart

5. Homework: Set Staging Virtual Host

  • 試著建立 staging.win.blah.tw 的 Staging Virtual Host 看看

參考資料

配置 Apache 支援多個網域