如何安裝二個 MySQL 在同一台 Ubuntu Server 上

App 後台服務的必要性

我們在開發 App 時,除了單機版程式之外,往往至少需要一個後台來作服務的提供者。依筆者來看,這是手機 App 強大的地方之一。要比 CPU 速度,比視窗大小,手機不可能會比筆電或是桌機來得更好。要打電動或是上網,手機其實並不是個很好的媒體。然而手機 App 至少有二個地方完全的壓過了桌機與筆電:

1.可取得性:在任何地方,就如Jobs 當年的名橋段,從牛仔褲裡掏出了… 一支手機!筆電即始可以帶著走,但是也不是任何時間能夠打開使用。然而手機是連搭公車站著都可以使用,這就很不同了~ 一天之中,帶著筆電在外頭跑來跑去的,真正打開來的時間可能不到能夠使用手機的 1/5。

2. 通往世界的窗口:手機不只是手機,而是手機通過網路,可以連接全世界幾近無限的網路服務。這是這一波革命的核心價值之一。即始我在滿員電車裡,除了幻想著某些橋段之外,我可以查看郵件,上網購物,google 所有興趣的頁面,以及頁面導向的進一步頁面,查看交通路況,看看家裡小朋友有沒有乖乖睡午覺,連絡週末的聚會,立即回答老闆剛傳來的疑問… 太多太多事可以作。

所以,回到原議題,在大多數的 App 裡後台的服務是必要的。

如何搭建 App 後台服務

後台的選擇,依筆者的經驗,至少有二個方法:搭用別人架好的平台,如著名的 Parse.com,或者就是自己作苦工,建立自己的後台。二者各有優缺點,視專案而作適合的選擇。

而若要搭建自己的後台,又至少需要分為測試後台與正式後台二種。這樣才不會避免開發新功能時不小心將不該 Po 的資料傳送給使用者,而導至使用經驗的大幅降低。

若使用 parse.com 作為後台,這件事倒是相對容易很多,就開二個 parse 目錄即可。若自己搭建後台,那要如何區分正式後台與測試後台,就需要動些腦筋了。(註:2016年1月,Parse.com 已宣布 2017年1月將關閉服務。)

以使用LAMP作為後台伺服器為例,就會遇到了一個很基本的需求,儘管可以將多個網域指向同一台機器,然而該機器上的 Port 3306 (MySQL 預設 port)只有一個。當然使用二台機器就可以省一些事,但是卻增加了一些硬體成本以及維護成本。畢竟,有二台機器,就表示定期備份要作二倍的工。

這裡可以有二個選擇:使用二個不同的資料庫名字,或者,就架二個 MySQL。前者的優點是不用去傷腦筋怎麼架二個 MySQL,但是缺點卻是 PHP 程式在正式版與測試版之間需要作切換。後者的優點則相反,程式幾乎不需要作切換,但是如何安裝二個  MySQL 在同一台機器上,卻需要費一些工。

在同一個 Ubuntu Server 上設 2 個 MySQL service 設定步驟

由於筆者所使用的後台是 Ubuntu Server,而MySQL 官網上的文章是 Linux 的,並不適合 Ubuntu ,這讓我浪費了不少時間。在奮戰一下午之後,終於找到正確的路搞定這件事。以下是操作步驟。(注意,不同的 OS 步驟不相同,僅供參考)

筆者環境:

OS: Ubuntu 14.04.2 LTS

MySQL:  5.5.41-0ubuntu0.14.04.1 

1. 先備份原來的資料庫

你不會希望慘劇發生,除非你的機器本來資料庫裡就是空的。

命令:

mysqldump --all-databases --user=root --password=密碼 -h localhost > 檔名.sql

萬一出了什麼事,只要保留好這個檔案,一切可能還有救

2. Stop MySQL

sudo service mysql stop

3. 建立 data 目錄,等一下會把另一個 MySQL  安裝在這裡。所有權要改為 mysql,不然會有問題。

sudo mkdir /var/lib/mysql3308

sudo chown -R mysql /var/lib/mysql3308

4. 建立 log 目錄,第二台 MySQL 若有任何錯誤訊息,可以由這裡看到

sudo mkdir /var/log/mysql/mysql3308
sudo chown -R mysql /var/log/mysql/mysql3308

5. 建立 config 檔

sudo cp /etc/mysql/my.cnf /etc/mysql/my3308.cnf

請參考 https://github.com/naveensnayak/mysql-multi/blob/master/my3308.cnf

6. 修改 Apparmor ( Ubuntu 的軟體防火牆)設定檔 /etc/apparmor.d/usr.sbin.mysqld

加上

/var/lib/mysql3308/ r,

/var/lib/mysql3308/** rwk,

/var/run/mysqld/mysqld.pid3308 rw,

/var/run/mysqld/mysqld.sock3308 w,

/run/mysqld/mysqld.pid3308 rw,

/run/mysqld/mysqld.sock3308 w,

然後重開apparmor

sudo service apparmor reload

7. 安裝另一份 MySQL

sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql3308 --defaults-file=/etc/mysql/my3308.cnf

這裡若你步驟6作得不對的話,就會出問題。

mysqld_safe Logging to '/var/log/mysql/mysql3308/error.log'.
mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql3308
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid3308 ended

然後用 netstat -ltn 可以看到, port 3308 根本沒起來。

用 tail -100 /var/log/mysql/mysql3308/error.log 可以看到錯誤訊息。

8. 連線

mysql -h 127.0.0.1 --port=3308 -u root

這裡很重要的是,host 要用 127.0.0.1 而不能用 localhost,若使用 localhost 它會忽略 port 參數,而連到了 port 3306 的 MySQL。然後若你還作了什麼操作的話,就會發生悲劇了。

9. 修改 root 密碼

剛架好的 MySQL 的 root 是沒有密碼的,連上之後可以用這個指令來修改密碼。

update mysql.user set password=PASSWORD('密碼') where User='root';

恭喜!終於大功告成,可以用一台機器可以架二個 MySQL 了。

 

WordPress 用 SSH 更新設定教學(Amazon EC2 Ubuntu 伺服器)


WordPress的發展與安全性問題

WordPress 在十幾年前一開始只是個簡易的免費部落格平台,然而因為因為它簡單而又強大,而且有豐富的外掛可以使用,經過多年發展至今被大量普遍的使用 。不過安全性卻是這個平台的一大問題,因為使用的主機很多,而且很多主機普遍並不會配有專業的 MIS 網管人員,所以變成駭客的好機會。筆者也曾經歷 WordPress 網站被駭客入侵,變成僵屍網路的一環,然後差點被 Amazon 強制停機的處境。

為了提昇安全性,WordPress 必需隨時更新至最新版本,而更新的方式傳統是用 FTP 來上傳檔案,不過也可以改用FTPS或 SSH 來傳輸 。不用說,當然要用後者比較安全。(不然也不用刻意發展新協定了,不是嗎?)

在安裝完 WordPress 之後,理所當然的,我們會想要挑一個我們喜歡的佈景主題(Theme)。然而在安裝時,會發現看到下面的畫面而無法繼續:

無法安裝 WordPress Theme

所以要順利安裝新的佈景主題,我們就要先完成 SSH 的設定:

Step 1. 新增帳號 wp-update

在 Amazon Ubuntu 上 WordPress 裝好後,/var/www/html 下的檔案的 owner 要嘛是 www-data,要不然就是 ubuntu,雖然一路都使用www-data 或 ubuntu 也很方便,但這樣安全性比較差,因為 apache process 的使用者正是 www-data,而 ubuntu 是預設的登入使用者。比較好的辨法是新增另一個帳號,這裡我們用 wp-update 。

sudo adduser wp-update

密碼簡單設一下,其它都直接按 ENTER 即可。

接著修改WordPress安裝目錄的 owner, 目錄預設為 /var/www/html

sudo chown -R wp-update:wp-update /var/www/html

Step 2. 建立 SSH Keys

接著切換身份為 wp-update

sudo su - wp-update

然後建立 SSH key pairs

ssh-keygen -t rsa -b 4096

按 ENTER 同意預設檔案存放為  /home/wp-update/.ssh/id_rsa

然後再按 ENTER 同意不設密語

建立完成之後,確認一下:

cd .ssh
ls -al
total 16
drwx------ 2 wp-update wp-update 4096 Jan 16 18:08 .
drwxr-xr-x 3 wp-update wp-update 4096 Jan 16 18:07 ..
-rw------- 1 wp-update wp-update 3243 Jan 16 18:08 id_rsa
-rw-r--r-- 1 wp-update wp-update  751 Jan 16 18:08 id_rsa.pub

然後需要另外複製一份 key pairs,  為了下面一步:

cp /home/wp-update/.ssh/id* /home/wp-update/

完成後跳離 wp-update 的身份

exit

接著要使剛才複製的 key pairs 讓 www-data (也就是 apache process)可以讀到這個 key pairs 但是不能修改。作法是將 key pairs 的 group owner 設為 www-data,並將權限設為 640,意思是 owner 可以讀寫,而 group owner 可以讀。

sudo chown wp-update:www-data /home/wp-update/id_rsa*
sudo chmod 0640 /home/wp-update/id_rsa*

然後將 public key 列為 authorized keys 之一,不過因為目前只有一個,所以直接複製 public key 即可:

sudo cp /home/wp-update/id_rsa.pub /home/wp-update/.ssh/authorized_keys

同樣的,這個 authorized key 的的權限也要作適當的調整:

sudo chown wp-update:wp-update /home/wp-update/.ssh/authorized_keys
sudo chmod 0644 /home/wp-update/.ssh/authorized_keys

由於這個 key 的登入來源是本機,所以安全的作法是加上限制:(這裡筆者習慣用 vim,不熟的話可以用 nano來編輯)

sudo vim /home/wp-update/.ssh/authorized_keys

在一開頭加上 from=”127.0.0.1″

from="127.0.0.1" ssh-rsa ...

Step 3. 調整 WordPress 設定

首先先更新一下函式庫,後面會用到

sudo apt-get update
 sudo apt-get install php5-dev libssh2-1-dev libssh2-php

接著變更 wp-config.php 內容

sudo vim /var/www/html/wp-config.php

在檔案最後面加上

define('FTP_PUBKEY','/home/wp-update/id_rsa.pub');
define('FTP_PRIKEY','/home/wp-update/id_rsa');
define('FTP_USER','wp-update');
define('FTP_PASS','');
define('FTP_HOST','127.0.0.1:22');

存檔後,重啟 apache2 ,理論上就大功告成了。

sudo service apache2 restart

測試安裝 Theme

點選想要安裝的Theme 之後,可以看到連線資料裡多了一些預設的灰階文字,這時要選擇SSH2

安裝 WordPress Theme 選擇連接方式

接著點 Proceed,就成功安裝了!

成功安裝 WordPress Theme