在 Apache 上使用 VirtualHost 的方式執行 Golang 的 Web 站台

主要是參考網路上的這一篇:http://www.jeffreybolle.com/blog/run-google-go-web-apps-behind-apache

作者給出了一個簡單的 Go Web 程式:

package main

import(
    "http"
    "log"
    "os"
)

const resp = `<html>
    <head>
        <title>Simple Web App</title>
    </head>
    <body>
        <h1>Simple Web App</h1>
        <p>Hello World!</p>
    </body>
</html>`

func handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte(resp))
}

func main() {
    http.HandleFunc("/", handler)
    err := http.ListenAndServe(":8080", nil)

    if err != nil {
        log.Println(err)
        os.Exit(1)
    }
}

這個 Web 程式主要是監聽 8080 Port,用 go build 之後得到的執行檔可直接作為 Web Server 運行。然後在 Apache 上安裝幾個 Module 後重啟 Apache。

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod rewrite
sudo service apache2 restart

接下來在 /etc/apache2/sites-available/ 目錄下建立 VirtualHost 的設定檔案 (gowebsite):

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName www.example.com
    ServerAlias example.com

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all

        RewriteEngine on
        RewriteRule ^(.*)$ http://localhost:8080/$1 [P,L]
    </Directory>
</VirtualHost>

接著在 Apache 啟動這個設定檔,將此 VirtualHost 設為啟動:

sudo a2ensite gowebsite
sudo service apache2 restart

整個過程就是在 VirtualHost 設定檔中設定此站台資料透過 Proxy Module 來由 localhost:8080 取得,當然這邊也可以同時在很多不同的 Port 中執行很多的 VirtualHost 站台。

開機時自動啟動 Go Web 應用程式 – Upstart 設定方式

補上篇,Go Web 應用程式需要在 Command Line 下啟動,在 Production 環境中我們可以在 Ubuntu 中使用 Upstart 設定為開機時自動啟動,設定如下:

file: /etc/init/go-http.conf

# Upstart Configuration
description     "Golang Web App"
author          "xxxxx xxx"

start on (net-device-up
          and local-filesystems
          and runlevel [2345])
          
stop on runlevel [016]

respawn

exec /path/to/http

然後就可以使用這個指令來啟動:

$ sudo service go-http start
go-http start/running, process 12537

Upstart 在 Ubuntu like 系統上是預設安裝的應用程式,在其他的 Linux 下可能需要另外安裝。設定好了之後重新開機時就會像一般的 Daemon 一樣自動啟動應用程式。這個設定會在網路已經啟用的狀況下才啟動你指定的程式,對於 Upstart 有興趣深入了解的朋友可以參考這篇:http://upstart.ubuntu.com/cookbook/

2014/2/15 [補充] Debian 與 Ubuntu 都將支持使用 systemd 而不再用 Upstart, 因此稍晚這篇要改成 systemd 的設定方式。

Kali Linux Taiwan mirror

官方的 Source 在台北連線實在很慢,經常跑起來只有 1xK/Sec,找到了淡江大學資訊中心的伺服器有 Mirror 一份,直接改 /etc/apt/sources.list 替換成下面這兩個位址就可以了,在台北家裡連線速度可以到每秒 8xxK,系統更新速度當然快多了。

http://ftp.tku.edu.tw/kali/ 
http://ftp.tku.edu.tw/kali-security/

移除不再需要的 Time Machine 檔案

Time Machine 出問題,一直提示空間不足無法成功備份,但是重做後又不會正確刪除到足夠的空間進行備份,手動刪除了幾個檔案還是相同的情況,放著不管結果它自己一個晚上自己不曉得自動重新備份了幾次,早上起來發現機器很燙。

原想刪除掉整個備份重來,從 System Preference/Time Machine 移除掉備份硬碟後發現裡頭的 Backups.backupdb 目錄還在並未釋放,這應該算是『功能』吧,可以避免誤刪備份。試著用基本的

sudo rm -rf -R [backup folder]

指令刪除的時候一直提示 “Operation not permitted”,找了一些資料後用來解決的方法如下,做個簡單的記錄:

sudo /System/Library/Extensions/TMSafetyNet.kext/Helpers/bypass rm -rfv [backup folder]

記得把 [backup folder] 改為你自己的路徑 (如:/Volumes/Backup\ Disk/Backups.backupdb/),我的作業系統是 10.9.4,如果是 10.8 以前的版本請試著找找:

/System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass

Update:

sudo tmutil delete [backup folder]

看來是比較新的方法,有說法是 bypass 已經 outdated,不過還是可以用。

Migrate from Parallels to VirtualBox (.hdd to .vdi format)

因為 Parallels Desktop 每次換新的版本都要 $$,每次 OSX 更新都要換版本,從版本 6 到 9 後已經對他失去了耐心,網路上一片討伐,也覺得對不起以前被我推薦使用 PD 的朋友,這次升級 Yosemite 後雖然 PD9 升級到最新版本後還是可以用,但準備開始把 PD 的虛擬機都轉到 VirtualBox 上做測試了。發現以前使用網路上的轉換方法需要多做一個步驟,新的方法可以直接轉為 VDI 格式,因此寫這篇文章分享一下方法。

舊的方法如下:
1. 正常的將虛擬機關機,而不要在 Suspend 的狀態操作。
2. 開啟 Parallels 虛擬機存放資料夾,所有虛擬機副檔名應為 .pvm
3. 右鍵點選欲轉換目標虛擬機 -> Show Package Content
4. 找到 .hdd 檔案,一樣右鍵 -> Show Package Content
5. 找到 .hds 檔案複製到 VirtualBox 虛擬機路徑 … (喝杯咖啡去)
6. 打開 VirtualBox 新建虛擬機,使用 “use existing virtual HDD file” 選項

這個方法仍使用 HDD 格式,若想要用 VirtualBox 原生的 VDI 格式 需要轉換…

新的方法:
還是需要定位到 .hds 檔案,然後直接轉換為 VirtualBox 的 VDI 格式:

VBoxManage clonehd Windows\ 8.1-0.hdd.0.\{5fbaabe3-6958-40ff-92a7-860e329aab41\}.hds ~/VMs/Win8.1.vdi --format VDI

仍在測試中,不曉得經過了這幾年 VirtualBox 在 Oracle 下的進步情況如何。

[簡記] Mac 的 Fusion Drive 建立方式

  1. 硬碟與 SSD 各分割一個扇區
  2. diskutil list
  3. diskutil cs create Fusion disk0 disk1
  4. diskutil cs list (Copy UUID)
  5. diskutil coreStorage createVolume [UUID] jhfs+ “Macintosh Fusion” 100%

另外,Disk Sensei 這個工具可以協助在 EI Capitan 中 Enable Trim Support,據 這篇 說明是不用再 Disabling kext signing 因此更加安全。我在 Fusion Drive 環境測試過沒有問題,免購買試用版本可操作 Trim Enable,推薦。

新增解除 Fusion Drive 的方法,硬碟中資料會完全遺失請先備份:

  1. diskutil cs list (Logic Volume Group 後面那一串就是 UUID)
  2. diskutil coreStorage delete [UUID]

關於「人件經歷」

這個類別的產生與一本叫做「人件 (PeopleWare)」的書有關,讀這本書的時候驚奇的發現在自身工作經歷上有那麼多的畫面與書中描述雷同,拿到的這個翻譯版本雖然翻譯得不太好 (機器翻譯式中文),但是透過文字所表達出來的意念與自己無法用文字或口述言語表達出來的「感覺」是那麼地貼切,很快發現自己與作者是心靈契合的 (這個版本的翻譯者與校對者應該沒有這樣的感覺)。也許可以把自己相同的經歷透過一些簡短的文字傳達出來,引發某些朋友的共鳴。

dpkg 安裝軟體列表的備份方式

/* 刪除電腦中不用的小紙片 */
我們每個人都有過重裝系統的經歷,在安裝好系統之後,如何才能快速重裝原來那些自己所鍾愛的軟件?nixCraft 提供了一個有用的技巧。它的原理是在系統完好無損的時候,就做好已安裝軟件的備份工作。然後,在重裝系統後就可以利用先前備份的文檔來執行還原操作了。下面是相關的實施步驟(以 Debian 為例):

  1. 執行備份操作:
dpkg --get-selections > installed-software.log

這將當前系統中已安裝的軟件保存到 installed-software.log 中。

  1. 在還原時使用
dpkg --set-selections < installed-software.log

導入軟件列表,再利用 dselect 工具安裝軟件。
上述方法同樣適用於 Ubuntu。另外,原文也介紹了基於 RPM 包管理器的發行版如何執行的步驟,有興趣的可以直接去看。

sudo dpkg --set-selections /home/package.selections && apt-get dselect-upgrade

Docker 自啟動容器

建立好一個容器後把它轉成服務,並設定在每次開機時自動啟動。在 CentOS 上我們使用的是 Systemd 而不是之前 Ubuntu 的 Upstart,Systemd 的約定中設定文件應放置在 /etc/systemd/system 或是 /usr/lib/systemd/system 下,由於某些系統預設安全性修改 /etc 下的檔案權限問題比較多,為了各系統間相容建議都放在 /usr/lib/systemd/system。

以下以 Dockerize 的 OpenVPN 容器設定為服務為例,容器確定已經可以正常運行之後,在上述目錄下建立一個 docker-openvpn.service 檔案:

sudo vi /usr/lib/systemd/system/docker-openvpn.service

內容為:

[Unit]
Description=OpenVPN Docker Service
Author=Coolfire
After=docker.service

[Service]
TimeoutSec=300
Restart=always
ExecStart=/usr/bin/docker start openvpn

[Install]
WantedBy=multi-user.target

然後測試是不是可以跑起來:

sudo systemctl start docker-openvpn
docker ps

如果已經跑起來了,那麼把它設定開機自啟動:

sudo systemctl enable docker-openvpn

如果需要確認可以重開機看看服務是否不需人工干預自動跑起來了。

CoreOS 可參考:
http://chuansong.me/n/1067253