2014年9月14日 星期日

[AWS] 到底該選擇那種VM? Paravirtual (PV) 或是 Hardware Virtual Machine (HVM)




如果有仔細看過AMI (Amazon Machine Image)的種類,應該會發現有兩種類似的Image,但是虛擬機器的型態不同,一種是HVM,另一種是PV。到底該挑哪個?


這兩種都是Server Virtualization的技術,可以看這個技術簡介。不過影片內的技術名詞和Amazon用的沒有完全一樣。
或是可以參考從這篇推論HVM是Type 1 hypervisor,而PV是Type 2 hypervisor。

Intel早就砸錢收購Type 1的公司,從AWS文件可以知道原本是PV比HVM好,後來不相上下。

Historically, PV guests had better performance than HVM guests in many cases, but because of enhancements in HVM virtualization and the availability of PV drivers for HVM AMIs, this is no longer true.
現在免費而且高效能的Instance只支援HVM,所以選HVM才行。


但是Spot Instance (竞价型实例)還是有只支援PV的T1 Instance,所以睜大眼睛去看吧。


一鍵在AWS上快速安裝Nginx + MySQL + PHP (透過AWS Marketplace)




如果厭煩了一直要安裝軟體,或是只是想要測試效能。AWS上面提供類似Apple Store或是Google Play的商店,讓你可以直接使用灌好的image。不過可能要收錢,不然就是硬體變差了,所以還是考量自己的需求再決定。
安裝的方式很簡單,進入EC2 Console => Instance => Launch Instance


點選AWS Marketplace,然後在搜尋欄打入"LEMP",接著搜尋。
選擇"LEMP Stack with Sense on Amazon Linux powered by IAANSYS, INC"


注意這個Image不提供t2.micro


接下來就只要一直按下一步就建完了。然後登入Server

ssh ec2-user@ip_地址 -i ~/EC2Key.pem


接著修改Nginx設定檔
mv /etc/nginx/conf.d/phpMyAdmin.conf /etc/nginx/conf.d/nginx.conf
vim /etc/nginx/conf.d/nginx.conf


把 “root /var/www/apps/phpMyAdmin; ”  改為 “root /var/www/html”

並把html檔案放到/var/www/html就大功告成了


2014年9月13日 星期六

將Server移植到Amazon AWS上



AWS服務已經推出很久了,已經有很多教學文,連官網都有詳細的說明。
不過大都散佈在各處,我把自己移植經驗寫下來。

我移植的是APP的backend server,Server除了Query Data外,還兼負責壓縮儲存圖片。
所以需要做下面幾件事:

  1. 啟動一台Server (使用AWS EC2服務)
  2. 透過終端機登陸Server, 並安裝Apache + MySQL + PHP
  3. 啟動SQL伺服器 (使用AWS RDS)
  4. 將MySQL檔案上傳到AWS RDS
    • mysql --host  "AWS RDS的DNS"  -u  "使用者名稱" -p < ~/backup.sql
    • DNS長得像 “xxxx.ccwhkkoksnnz.ap-northeast-1.rds.amazonaws.com”
  5. 上傳PHP code到Server
  6. 將備份圖片上傳到雲端空間 (使用AWS S3服務)
  7. 將圖片透過PHP上傳到雲端空間
流程相當長,大家還是耐心的做下去吧~


2014年9月4日 星期四

[PHP] 將圖片上傳到Google Cloud Storage



透過terminal用gsutil上傳圖片並不是難事,只要透過網頁取得OAuth2 Key後,就可以上傳了。
不過當我想在Apache+PHP 的環境下使用 gsutil ,就會遇到權限問題。

譬如在PHP下想要上傳檔案
<?php
    exec("gsutil cp /tmp/test.txt    gs://bucket/");
?>

會得到底下的錯誤
 **OSError: [Errno 13] Permission denied: '/var/www/.config'**

如果用暴力法修改權限(chmod 777 /var/www/),還是會遇到gsutil報錯
 **AccessDeniedException: 403 Insufficient Permission
 **CommandException: 1 files/objects could not be transferred.

比較好的方式還是用google提供的Google API Client Library for PHP
可惜目前還是beta版,範例很少,
這邊附上我試出的結果
1. 先申請Server Account


接著按"Generate new P12 key"

2. 把這個檔案放到Server

3. 接著修改下面的sample code
   這個範例在上傳同時,順便會把檔案權限設為Public Read

Sample Code:
https://github.com/Brandon-Lin/google-cloud-storage/blob/master/upload_file_using_service_account.php




將Sever移植到Google Compute Engine


貼上如何將LAMP (Linux Apache MySQL PHP) Server 移植到Google Compute Engine (GCE).
這個server是用來壓縮上傳圖片還有處理SQL Query.


在這之前還是先準備信用卡,大部分的服務都需要信用卡。

1. 設定Google Cloud Compute Engine(GCE),可以參考底下這兩篇
    不過Google只支援PHP 5.4,所以OS選Debian比較保險
    (Google的教學影片也是用Debian)

初探 Google Cloud Platform - 1. Create instance

初探 Google Cloud Platform - 2. How to login and manage instance


2. 在VM Instance上面安裝Apache2, MySQL, 和PHP
     記得不需要安裝PHPMyAdmin,因為SQL DB並是安裝在另一台SQL Server上

3. 取消Apache Directory Listing功能 (網頁看不到目錄)
sudo /usr/sbin/a2dismod autoindex
sudo service apache2 restart

4. 把PHP code搬到GCE的VM Instance
    4-a: 建立網路硬碟,從左方選單點選"Storage browser"
         

    4-b: 點選"Add bucket"

    4-c: 填入Bucket名稱 (類似資料夾名稱)

    4-c: code搬到Google Cloud Storage (GCS)
gsutil -m cp <你的PHP Code> gs://你的資料夾

    4-d: code從GCS搬到VM Instance
(在VM console上打底下的指令)
gsutil -m cp gs://<你的PHP Code> /var/www

    5. 將MySQL上傳
         5-1: 匯出SQL file
  mysqldump --databases "你的DB名稱" -u "用戶名稱" -p"<密碼>" --hex-blob --default-character-set=utf8 | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/g' >  備份名稱.sql



         5-2: 把SQL檔案搬到Bucket

         5-3: 建立DB


                   按"New Instance"


                    填入DB名稱


         5-3: 匯入SQL,選擇"Import"



        5-4:  將SQL IP 記下

        5-5: 加入可以存取DB的IP

       5-6: 修改MySQL DB連線位置
$dsn = "mysql:host=173.194.2xx.xxx;dbname=$db_name";
        $dbh = new PDO($dsn$db_user$db_password

                        array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));


6. 使用舊Server上的PHPMyAdmin
vim /etc/phpmyadmin/config.inc.php

/* Server parameters */
$cfg['Servers'][$i]['host'] = '173.194.2xx.xxx';
//$cfg['Servers'][$i]['connect_type'] = 'tcp';
//$cfg['Servers'][$i]['compress'] = false;

接著用舊Server上的PHPMyAdmin查看是否能連線到Google Cloud SQL




這樣就完成設定了~