2016年1月29日 星期五

Amazon EC2使用心得

前陣子為了嘗試 Amazon SES 寄送email的功能,申請了Amazon免費是用一年的帳號,申請時需驗證email、手機、信用卡(但沒要你輸入檢查碼)、信用卡帳單地址


申請一台EC2

登陸後台後,如圖:

功能太多,要從哪裡先下手?
Rellik:你要開機器不就是 ec2 和  vpc( Isolated Cloud Resources ) 先吧,先把 vpc 搞懂再來才是 ec2。
什麼是VPC?
Rellik:vpc 算是網路規劃。你要想好如果是正式服務的話要怎麼規劃網段 scale 起來比較容易。就是當你的量大起來的時候你要怎麼樣比較容易加機器或是量減少時縮減機器,因為ec2 on demand 開機器很貴,所以透過上面的一些監控機制可以做到自動增加和縮減
好複雜喔...
Rellik:小小的複雜,但是對一般養不起 sa 的小公司( rd 自己學 )來說很有用,因為所有事情都可以透過 api 來達成,然後你就可以想辦法把這些東西自動化

選擇ComputeEC2,近入EC2 Dashboard。如圖:
1. 修改地區為東京
2. 點擊 Launch Instance去產生新機器

選主機地點?
Rellik:看你用途,因為有些 aws 的點會有特定服務還沒開通,你有需要用到那些服務的話就得選特定 region,不然就是選離自己最近的,因為 latency 越低越好
東京、首爾、新加坡、美西? 
Rellik:以東京的 scale 來說比起新加坡要大。新加坡之前有人踩到總體頻寬不足的問題。首爾的話是最近新增的 region,沒興趣踩地雷,不然韓國的網路速度應該還算蠻快的。東京的話台灣過去大概在 30~50ms
北京和香港有Amazon嗎?
Rellik:香港沒有,北京不要用,上面連個可用的 image 都沒有。http://www.amazonaws.cn/ 連domain都不一樣了,是個與世隔絕的山寨 aws
amazon有直接搬家服務?
Rellik:不清楚。但有可能是透過 s3,s3 是跨 region 的 service。他把機器打 snapshot 以後儲存到 s3,然後在東京開起來


1. Choose AMI

a. 選擇AWS Marketplace
b. 搜尋debian
c. 選擇非pvm的hvm image

如何選擇image?
Rellik:用官方的,不要用一些有人放出來的 images,一些 user 也會把自己的東西包成 ami,但是有可能被污染過,不要亂用(選 AWS Marketplace頁籤,不要選Community AMIs)
在Choose AMI中第一個Quick Start頁籤的Amazon Linux ( Amazon Linux AMI 2015.09.1 (HVM), SSD Volume Type ) 鏡像,這個好用?
Rellik:不好。amazon linux 是 亞馬遜自己開出的 linux,很近似 redhat 但很多東西都用非常的新版。不建議。可以的話 debian 或是 redhat( 要錢 )
註:雖然在 AWS Marketplace 中搜尋 red hat,會出現 Free tier eligible 標籤的red hat 鏡像,但以Red Hat Enterprise Linux (RHEL) 6 為例 ,每小時的收費是 $0.08 to $5.70/hr incl EC2 charges + other AWS usage fees。或參考下面兩張表
https://aws.amazon.com/marketplace/pp/B00WUNJIEE/ref=srh_res_product_title?ie=UTF8&sr=0-3&qid=1453969222685  Debian GNU/Linux 8 (Jessie)
https://aws.amazon.com/marketplace/pp/B007ORSS8I?ref=cns_srchrow  Red Hat Enterprise Linux (RHEL) 6
同樣micro的機器,Red Hat $0.086/hrDebian $0.02/hr (但我不知道t1和t2的差別在哪)
Rellik:t2 micro 是最小規格機器
debian和centos哪個好?
Rellik:我會建議你用 debian,centos 找 package 找不到很煩,你如果沒有安裝 epel-relesae 的 yum repo site,你能用的東西幾近於無,我都希望只要透過 yum 能找得到的東西就直接安裝進來就好了,你就不需要管安裝 + 編譯,我有算過 centos 官方 repository .. 才收了 5000 個左右的 package,debian 官方則是有 30000 套以上。光是我弄個 smokeping  centos 就要自己編譯到死,你不會想要自己搞編譯 + dependency
在Community AMIs搜尋debian後出現多個images,如debian-jessie-amd64-hvm-2015-06-07-12-27-ebs和debian-jessie-amd64-pvm-2015-06-07-12-35-ebs。hvm  和pvm差在哪?
Rellik:用 hvm。pvm 是舊型態的 vm type。hvm 在 aws 官方文件上有推薦要你們多用這個。pvm 的話在升級 kernel 的時候會出問題
關於DB要裝哪個版本?
Rellik:建議用 percona,強烈不建議你 mariadb,踩了很多次 mariadb 地雷,官方 mysql 更是不要用,被 oracle 污染的有點嚴重。建議你安裝 mysql5.6 ( percona ),效能非常好

選擇( Select )了image後會出現每小時的收費,如圖
然後按藍色Continue按鈕進入下一步

2. Choose Instance Type

因為是免費試用一年的會員,所以只能選t2.micro。如圖
可以直接點 Review and Launch跳過 3-6的步驟

3. Configure Instance

Rellik:我建議你選 az(availability zones,Subnet那欄) 的時候選在 1b,那邊的 latency 大概在 30ms。另外要有個基本觀念:everything will fail。所以在設計的時候就要把東西盡量以 ha 架構來部署,他之所以有這麼多 region 是因為有過整個 region  fail 的情形。1 region 底下有 multilpe az,1az =  multiple IDC (機房)。所以才要你先搞懂 vpc,vpc 是關係到你的 service整個網路架構 => 他的專有名詞很多,很煩

實際跑一遍時發現沒有1b可以選,就隨便選了,點Create new subnet 後會跳到VPC那邊去

4. Add Storage

Rellik:storage type 有好幾種,你東西要關機之後可以保存著的話,要選 ebs,ebs 又分幾個 type。magnetic volume 代表是本機硬碟,但是這種 type 資料存不住不能關機,關了會消失,原因是你關機之後再開機 , 他因為是 virtual host,所以不一定會開到同樣一台。general purpose 不用算 iops ( input/output per second ) 費用provision iops 這種會算 iops 費用。一般來說 mysql都蠻需要 iops。iops 和 硬碟 through put 有關
如圖:


好複雜...
Rellik:沒辦法,他每個都是錢,但是所有東西都可以弄成 code,包括我們整個 server 架構都可以用 json  code 來表示

5. Tag Instance

沒重點,直接下一步。如圖

6. Configure Security Group

沒重點,直接下一步。如圖

7. Review

把你前面客製化的設定列出來,可以看到我們即將建置Debian 8 t2.micro ebs hvm 每小時0收費的instance。如圖


1. 看完Review後點擊Launch,會出現lightbox(aws網頁做的怪怪的,lightbox跳出來後chrome不能複製(ctrl+c)和搜尋(ctrl+f))
2. 選擇Create a new key pair,生成後下載到電腦上(ex. key.pem
3. Launch Instances

開始創建instance,等待...
最後出現成功的畫面

點擊View Usage Instructions查看你的instance列表
如何刪除instance?
http://serverfault.com/questions/117123/how-to-delete-instances-in-amazon-ec2-change-pair-key
give it some time. deletion of terminated instances is not a high priority task within the EC2 stack (seems reasonable to me). eventually the terminated instance will drop out of the interface.
terminate(終止)後過一段時間他會自己不見

使用PuTTY連線 Amazon EC2
Rellik:建議你機器不要開密碼登入,開 key登入比較保險(實務上不是掛vpn就是用key登陸,不讓外面的ip直接ssh來try帳號密碼),外面 ssh 通常很容易掃得到,都會有無聊人士,所以不建議用密碼登入。
http://unix.stackexchange.com/questions/116303/convert-amazon-pem-key-to-putty-ppk-key-linux
因為AWS下載的.pem檔,不能直接相容於PuTTY
1. 在AWS上下載你的.pem檔(上面步驟的key.pem)
2. 到 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 下載PuTTYgen,並打開他,選擇Type of key to generate為SSH-2 RSA
3. 點擊Load按鈕
4. 設定檔案類型為 *.*
5. 打開你的.pem
6. 點擊 Save private key ,把它存為 ppk
7. 打開PuTTY。Connection -> SSH -> Auth -> Private key file for authentication選擇你產生的ppk檔
8. PuTTY  Session的連線地址設。AWS Instances列表,你的機器的Public DNS
9. 連線後使用者名稱輸入admin(不能輸入root)
10. 連進去後直接 sudo su - 切換成root

申請VPC
因為免費方案不能使用VPC,他的NAT gateway是要收費的( 收費表:http://aws.amazon.com/tw/vpc/pricing/  )因次作罷

安裝nginx後訪問不到
ps aux | grep nginxnetstat -ant | grep 80 看起來都正常,但是外面telent x.x.x.x 80 卻連不上( telnet: Unable to connect to remote host: Connection timed out )
先在 EC2後台查詢你的instances是用哪個 Security groups ,再去左側菜單的 NETWORK & SECURITY => Security groups ,更改你的 Security groups的 inbound
Security groups 就是 AWS的防火牆


參考資料:
Rellik Hsu



2016年1月18日 星期一

個性化chrome開發者工具

安裝了chrome開發者工具的主題: DevTools Theme: Zero Dark Matrix
加入chrome後要怎麼讓他起作用呢?

首先要先打開 Enable Developer Tools experiments
1. 開一個新chrome分頁,網址輸入 chrome://flags
2. ctrl+f搜尋"啟用開發人員工具實驗性功能。 Mac, Windows, Linux, Chrome OS" ( 英文版:Enable Developer Tools experiments. Mac, Windows, Linux, Chrome OS )
3. 點擊enable連結
4. 重啟chrome

允許客製化UI主題
熱鍵 F12 -> F1-> Experiments 分頁 -> 勾選 Allow custom UI themes
或如圖
1.

2.

最後重啟chrome即可轉換主題

參考資料:
Betty Liang
http://stackoverflow.com/questions/24858520/chrome-dev-tools-settings-where-is-the-experiments-tab-to-allow-custom-ui-theme  Chrome dev tools settings: where is the Experiments tab to Allow custom UI themes?


2016年1月11日 星期一

snagit 使用心得


上馬賽克
http://download.techsmith.com/snagit/docs/onlinehelp/enu/9/default.htm?turl=filters.htm
截圖開啟 Snagit Editor後,
選擇 Image tab
Crop 選取你要上馬賽克的地方
Modify group > Filters tool > Pixelate > Title Size選8(你要馬賽克的解析度)


如何透過PHP送信

遇到一個需求,是需要透過php送驗證碼到使用者email

使用免費郵箱的SMTP

phpmail
原始出處: http://www.daixiaorui.com/read/16.html
https://github.com/kalecgos0616/tools/tree/master/phpmail
原理:用php的fputs()設定SMTP傳送email
phpmailer
https://github.com/PHPMailer/PHPMailer
composer安裝
$ composer require phpmailer/phpmailer
然後更改 ~/composer/vendor/phpmailer/phpmailer/examples/smtp.php 把smtp的設定寫進去,
優點:可以傳送附加檔案

測試結果
使用sina的SMTP對qq 郵箱連送20次,結果phpmail的網頁中段顯示空白頁,qq郵箱收到0,1,2,3,4,6,8的信,其餘連垃圾郵件都沒收到。跑完迴圈後再去發一次email到qq,就收不到了。

So You'd Like to Send Some Email (Through Code)
所以你想發送一些email(透過code)
I have what I would charitably describe as a hate-hate relationship with email. I desperately try to avoid sending email, not just for myself, but also in the code I write.
作者非常討厭用code發送email,並儘量避免。
Despite my misgivings, email is the cockroach of communication mediums: you just can't kill it. Email is the one method of online contact that almost everyone -- at least for that subset of "everyone" which includes people who can bear to touch a computer at all -- is guaranteed to have, and use. Yes, you can make a fairly compelling case that email is for old stupid people, but let's table that discussion for now.
email是溝通媒介的蟑螂:你殺不死他。email是幾乎每個人都在網上聯繫的一種方法。
So, reluctantly, we come to the issue of sending email through code. It's easy! Let's send some email through oh, I don't know, let's say ... Ruby, courtesy of some sample code I found while browsing the Ruby tag on Stack Overflow.
透過code來發送email是很簡單的。上stackoverflow查一查範例就好
Just because you send an email doesn't mean it will arrive. Not by a long shot. Bear in mind this is email we're talking about. It was never designed to survive a bitter onslaught of criminals and spam, not to mention the explosive, exponential growth it has seen over the last twenty years. Email is a well that has been truly and thoroughly poisoned -- the digital equivalent of a superfund cleanup site. The ecosystem around email is a dank miasma of half-implemented, incompletely supported anti-spam hacks and workarounds.
因為你發送一封email,不意味他會送達。根本不可能(不可能百分百送達)。請記住,我們在說的這是email。這是從不被設計為犯罪和垃圾郵件的痛苦猛攻。更不用說過去20年來的爆炸、指數增長。email已經是真正且徹底被毒害的- 超級清理網站的數量。圍繞電子郵件生態系統是半現實的,不完全支持反垃圾郵件黑客和解決方法的瘴氣。
Which means the odds of that random email your code just sent getting to its specific destination is .. spotty. At best.
這意味你用code送的email發送到目的地的機率是... 參差不齊的。
If you want email your code sends to actually arrive in someone's AOL mailbox, to the dulcet tones of "You've Got Mail!", there are a few things you must do first. And most of them are only peripherally related to writing code.
你想透過code確實的把email送達別人的郵箱。有幾件事你必須先做到的。而且大部分與code無關。
1. Make sure the computer sending the email has a Reverse PTR record
確保發信的電腦有反向PTR記錄
2. Configure DomainKeys Identified Mail in your DNS and code
設定DomainKeys Identified Mail(DKIM)在你的DNS和code
3. Set up a SPF / SenderID record in your DNS
設定 SPF / SenderID(VERIFY_KEY?)記錄在你的DNS
That sucked. How do I know all this junk is working?
你要怎麼知道這一切努力是有用的?
(略)

使用服務商送信

http://submail.cn/  (中國)
優點:
1. 連發都收得到
2. 163、sina、gmail、yahoo都收得到
缺點:
1. QQ郵箱收不到 => 客服回復:QQ邮箱域名生效会稍慢,一般新域名开始发信后3-7天后才会逐渐恢复正常,预热期内会偶尔出现丢新现象
2. 到信速度慢
配置:
登陸後台後
"郵件" => "配置发送域名" ( http://submail.cn/chs/account/settings#/mail/domainConfigs )
把你的domain加進去,然後去domain DNS代管的"解析设置"(我的domain是阿里雲代管)配置"域名验证"(VERIFY_KEY)、SPF、DKIM
然後她會測試你的domain的VERIFY_KEY、SPF、DKIM是否驗證過了
ps. 阿里雲代管每次更改DNS解析記錄都會發信通知你
"開發者"=> "邮件应用"( http://submail.cn/chs/developer/apps#/mail )
新建一個郵件應用,然後他會跟你說"應用ID"和"密鑰"

實測:
發送API
http://submail.cn/chs/documents/developer/yR0Ov
$ curl --data "appid=XXX&to=tom <tom@qq.com>&subject=testing_Subject&text=testing_text_body&from=no-reply@your.domain&signature=secret_key" -k "https://api.submail.cn/mail/send.json"
{"status":"success","return":[{"send_id":"XXXX","to":"tom@qq.com"}]}

域名剛開始發信速度會比較慢,參照
http://submail.cn/chs/blog/view/14  SUBMAIL AUTO WARM UP(Beta) 域名和 IP 自动预热机制
節錄:
通常,當一個 ESP(郵箱服務提供商)收到新的功能變數名稱或者 IP 進行郵件發信時,他們將開始對該 IP 或者功能變數名稱進行監控信譽度的計算,並且根據功能變數名稱和 IP 的信譽度來決定給與該對象流量的大小。初始階段,ESP 會限制入信的流量來達到風險管控的目的(例如當日最大入信額度 10000 封),超過這個流量的郵件可能會直接拒收,甚至有被列入黑名單的風險。
因此,一個新的功能變數名稱或 IP 在啟用或開始進行大量外發郵件之前需要對該功能變數名稱或 IP 進行前期預熱

什麼是前期預熱?
前期預熱指的是一個新 IP 或功能變數名稱在大量發送郵件之前,先通過逐漸遞增發信量來讓  ISP 標識並認可新 IP 或功能變數名稱

SUBMAIL AUTO WARM UP 並不能100%的保證你不被 ESP 拒絕,要更好的預熱你的功能變數名稱或 IP 你還需要儘量做到以下幾點:

1: 優秀的郵件內容和規範編碼
ESP 不僅對你的入信量進行評估,你的郵件內容也是決定你的郵件到達率的重要因素之一。優秀的郵件內容和規範的 HTML 編碼,將會加速 ESP 對你發件域和 IP 信任。請在發送你的郵件之前,檢查你的郵件代碼或將你的郵件 發送至http://www.mail-tester.com 查看你的郵件得分。

2: 配置獨立的觸發類(或事務類)郵件域和推廣類(EDM、訂閱類)郵件域
SUBMAIL 觸發郵件服務和推廣類郵件服務將都受到 SAWU 機制干預。所以,當你同時使用2個服務時,請將觸發郵件域推廣郵件域分開,即需要配置2個發送功能變數名稱,如你的功能變數名稱是 yourdomain.com,請為觸發郵件域配置一個二級域,如 service.yourdomain.com,再為推廣類郵件配置 newsletter.yourdomain.com 域,這樣2個服務獨立預熱、互不影響。

3:良好收件人列表
預熱的收件人要儘量避免無效地址,因為 ESP 對發送較多無效地址的發送者是很不友好的,因為他們覺得你可能在發垃圾郵件,不利於額度增長和功能變數名稱信譽度的提升的,甚至會降低。


https://sendcloud.sohu.com/ (中國)
優點:
1. 連發連發都收得到
2. QQ、163、sina、gmail、yahoo都收得到
3. 到信速度較 submail 快

註冊需經過手機驗證,註冊成功後會發API_KEY註冊信箱
配置:
後台登陸後
"邮件设置" => "增加域名"
點擊域名進去後會提示你 VERIFY_KEY、SPF、DKIM、CNAME、MX 怎麼配置

然後去你DNS代管的地方配置解析

注意:
第一張圖DKIM 複製後要把斷行改成一行,然後在第二張圖主機記錄設@
CNAME的主機記錄設*
MX的記錄值設mx.sendcloud.org.

實測:
sendcloud.php
function send_mail($count) {
    $url = 'http://sendcloud.sohu.com/webapi/mail.send.json';
    $API_USER = 'API_USER'; // 登陸後台後會告訴你
    $API_KEY = 'API_KEY'; // 去註冊email找
    //不同于登录SendCloud站点的帐号,您需要登录后台创建发信子帐号,使用子帐号和密码才可以进行邮件的发送。
    $param = array(
        'api_user' => $API_USER,
        'api_key' => $API_KEY,
        'from' => 'service@sendcloud.im',
        'fromname' => 'SendCloud测试邮件',
        'to' => 'tom@qq.com',
        'subject' => "来自SendCloud的第{$count}封邮件!",
        'html' => "你太棒了!你已成功的从SendCloud发送了{$count}封测试邮件,接下来快登录前台去完善账户信息吧!",
        'resp_email_id' => 'true');

    $data = http_build_query($param);
    $options = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Content-Type: application/x-www-form-urlencoded',
            'content' => $data,
        ));
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    return $result;
}

// for ($i=1; $i < 11; $i++) { 
//     echo send_mail($i);
// }

echo send_mail(1);
$  php sendcloud.php
{"message":"success","email_id_list":["14522414xxxx_47971_1165_4583.sc-10_10_127_57-inbound0$tom@qq.com"]}

https://sendgrid.com/
測試結果
郵箱收到非垃圾郵件測試次數時間
QQVV110幾秒
易網VV110幾秒
新浪VV1幾10秒
gmailVV110幾秒
yahooVX110幾秒

連發10次到QQ
=>10封都收得到,6封進收件夾,4封進垃圾郵件
註冊流程較麻煩,註冊完後台出現黃字
Your account is currently being provisioned. You will not be able to send out any email.
回報客服後,他會問你一些簡單問題(如你公司做什麼的、流量多大之類的),之後才能正式開始用(因為他們人在美國(?)只會半夜回你)

配置:
sendgrid後台登陸後
SETTINGS => Whitelabels => Domains => Add Whitelable
新增發信功能變數名稱後,照後台提示。如圖
然後去你DNS代管的地方配置解析

注意:
使用阿里雲的代管比較靠譜,原本用 WIS 匯智 ,結果竟然只能設6組代管,而且主機名稱填
s1._domainkey.your.domain 會自動幫你改成 s1.domainkey.your.domain


其他發信服務商(未測試)
https://postmarkapp.com/
http://www.socketlabs.com/
https://aws.amazon.com/tw/ses/ (亞馬遜)
http://www.emailcar.net/ (中國)
https://www.phplist.com/
http://mailchimp.com/
http://www.aweber.com/
http://www.benchmarkemail.com/tw/

工具
http://www.mail-tester.com/  email垃圾郵件測評

參考資料:
http://blog.codinghorror.com/so-youd-like-to-send-some-email-through-code/  So You'd Like to Send Some Email (Through Code)