參考步驟:http://proanalyst.net/migrate-files-gcs-into-amazon-s3/
1. 建立一個VM並啟用SSH
2. 透過SSH連限制這個VM Instace
3. 寫入.boto
echo [Credentials] >> ~/.boto
echo aws_access_key_id = XXX >> ~/.boto
echo aws_secret_access_key = OOOOO >> ~/.boto
4. gsutil 指令
資料夾搬移
gsutil cp -r gs://BucketName/FolderName/ s3://BucketName/FolderName/
特定檔案類型搬移
gsutil cp *.jpg gs://BucketName/FolderName/ s3://BucketName/FolderName/
2019年9月11日 星期三
2019年8月23日 星期五
PHP import reCAPTCHA v3
早上得到反映Google reCAPTCHA循環出現輸入錯誤無法通過的消息,檢查中發現已經更新到 v3,他跟前代最大的差別就是不用再要求使用者與頁面互動,貌似會依照行為來計算分數判斷是否為機器人所為!!
套用步驟如下。
1. 申請KEY,進入此網站點選右上角進入Admin Console,依照步驟取得網站金鑰跟密鑰
2. 登入頁(HTML)
HEAD:
<script src="https://www.google.com/recaptcha/api.js?render=網站金錀"> </script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('網站金錀', {action: 'homepage'}).then(function(token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
});
});
</script>
FORM:
<input type="hidden" value="" name="recaptcha_response" id="recaptchaResponse">
3. 驗證頁(PHP)
if ( !$_POST ) exit;
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = '密鑰';
$recaptcha_response = $_POST['recaptcha_response'];
//Make and decode POST request:
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if($recaptcha->success==true){
if($recaptcha->score >= 0.5) {
//PASS
} else {
//BOT
}
} else {
//FAIL
}
4. 檢查~套用v3的頁面右下角會出現Google reCAPTCHA圖示,若無則表示有缺漏得檢查。
套用步驟如下。
1. 申請KEY,進入此網站點選右上角進入Admin Console,依照步驟取得網站金鑰跟密鑰
2. 登入頁(HTML)
HEAD:
<script src="https://www.google.com/recaptcha/api.js?render=網站金錀"> </script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('網站金錀', {action: 'homepage'}).then(function(token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
});
});
</script>
FORM:
<input type="hidden" value="" name="recaptcha_response" id="recaptchaResponse">
3. 驗證頁(PHP)
if ( !$_POST ) exit;
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = '密鑰';
$recaptcha_response = $_POST['recaptcha_response'];
//Make and decode POST request:
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if($recaptcha->success==true){
if($recaptcha->score >= 0.5) {
//PASS
} else {
//BOT
}
} else {
//FAIL
}
4. 檢查~套用v3的頁面右下角會出現Google reCAPTCHA圖示,若無則表示有缺漏得檢查。
2019年8月2日 星期五
大量Time_wait的改善紀錄
因為AP架構設計的緣故,做了個Agent處理在Listen伺服器上檢查是否有需要處理的作業,頻繁的連線>檢查>關閉的作業,在客戶端Agent多的狀況下在伺服器端就會發現有許多Time_wait紀錄,這樣會造成WEB服務上的效能變差。
編輯 vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然後執行 /sbin/sysctl -p 套用
編輯 vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然後執行 /sbin/sysctl -p 套用
- net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
- net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
- net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
- net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間
若是卡點在對資料庫的連線,那麼寫個shell script來kill process才能改善,單純結束連線解決不了問題。
define('MAX_SLEEP_TIME', 120);
$hostname = "xxx";
$username = "xxx";
$password = "xxx";
$err_level = error_reporting(0);
$connect = mysql_connect($hostname,$username,$password);
error_reporting($err_level);
$result = mysql_query("SHOW PROCESSLIST", $connect);
while ($proc = mysql_fetch_assoc($result)) {
if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {
@mysql_query("KILL " . $proc["Id"], $connect);
}
}
mysql_close($connect);
2019年8月1日 星期四
aliyun push to android 8 up 備忘
相關資源:
https://github.com/aliyun/alicloud-ams-demo/tree/master/OpenApi2.0/push-openapi-php-demo
這陣子在處理阿里推送上在Android 8裝置會收不到的狀態卡了許久,使用PushNoticeToAndroidRequest.php來進行推送都很迅速地在Android 8以下裝置收到,若是透過阿里後台的推送則全裝置都能順利收到,這就不會是APP設計的問題。
這部分問題要爬文建議透過百度搜尋來查找,比Google來的更豐富且針對些,應該是阿里雲屬於內地的產品吧! 即便在那斯達克上市也不能免俗。
總之關鍵點在於...以下參考~
//XXX必須與APP設定的一致
$request_android->setAndroidNotificationChannel("XXX");
ExtParameters設定:
//這是透過 PushNoticeToAndroidRequest.php 使用的設定
$request->setAndroidExtParameters("{\"key1\":\"value1\",\"api_name\":\"PushNoticeToAndroidRequest\"}");
//這是透過 PushRequest.php 使用的設定
$request->setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
//若設定成ALL則IOS相關設定需帶入
$request->setDeviceType("ANDROID");
//這設定貌似也要加~不過數字上沒甚麼感覺
$request->setAndroidNotificationBarType(1); //通知栏自定义样式0-100
$request->setAndroidNotificationBarPriority(1); //通知栏自定义样式0-100
小結: 許多阿里後台端的問題都需有內地帳號才能發問(這個在台灣手機認證上就掛了),所以即便是呼叫OPENAPI順利得到MessageID對於"沒收到"這檔是也是無濟於事,打轉許久只能透過Try & Error排除。
另外曾考慮透過Dot NET來呼叫OPENAPI,不過在帶入appkey那行總是編譯失敗,nullable long<n> 未定義,改用建議的DLL會造成更多的變數定義錯誤,這是就神奇了~~目前無解。
補充:使用PushNoticeToAndroidRequest設定NotificationChannel沒意義,追蹤相關的code看來沒支援/強制寫入固定值在回傳的陣列裡也是靜悄悄,所以用PushRequest.php來推送即可。
https://github.com/aliyun/alicloud-ams-demo/tree/master/OpenApi2.0/push-openapi-php-demo
這陣子在處理阿里推送上在Android 8裝置會收不到的狀態卡了許久,使用PushNoticeToAndroidRequest.php來進行推送都很迅速地在Android 8以下裝置收到,若是透過阿里後台的推送則全裝置都能順利收到,這就不會是APP設計的問題。
這部分問題要爬文建議透過百度搜尋來查找,比Google來的更豐富且針對些,應該是阿里雲屬於內地的產品吧! 即便在那斯達克上市也不能免俗。
總之關鍵點在於...以下參考~
//XXX必須與APP設定的一致
$request_android->setAndroidNotificationChannel("XXX");
ExtParameters設定:
//這是透過 PushNoticeToAndroidRequest.php 使用的設定
$request->setAndroidExtParameters("{\"key1\":\"value1\",\"api_name\":\"PushNoticeToAndroidRequest\"}");
//這是透過 PushRequest.php 使用的設定
$request->setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
//若設定成ALL則IOS相關設定需帶入
$request->setDeviceType("ANDROID");
//這設定貌似也要加~不過數字上沒甚麼感覺
$request->setAndroidNotificationBarType(1); //通知栏自定义样式0-100
$request->setAndroidNotificationBarPriority(1); //通知栏自定义样式0-100
小結: 許多阿里後台端的問題都需有內地帳號才能發問(這個在台灣手機認證上就掛了),所以即便是呼叫OPENAPI順利得到MessageID對於"沒收到"這檔是也是無濟於事,打轉許久只能透過Try & Error排除。
另外曾考慮透過Dot NET來呼叫OPENAPI,不過在帶入appkey那行總是編譯失敗,nullable long<n> 未定義,改用建議的DLL會造成更多的變數定義錯誤,這是就神奇了~~目前無解。
補充:使用PushNoticeToAndroidRequest設定NotificationChannel沒意義,追蹤相關的code看來沒支援/強制寫入固定值在回傳的陣列裡也是靜悄悄,所以用PushRequest.php來推送即可。
2019年5月24日 星期五
aws s3 + CloudFront備忘
看中文頁面對照AWS官方英文說明剛開始會有些對不上,就寫個備忘文...留存
IAM USER設定:
新增一個使用者,取得程式使用的ID及KEY。
S3設定:
1. 建立S3服務,並設定儲存貯體名稱
2. 於屬性啟用靜態網站託管,取得靜態網站託管的終端節點
3. 設定儲存貯體政策{
"Version": "YYXX-MM-DD",
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::儲存貯體名稱/*"
}
]
}
CloudFront設定:
源網域名稱:選擇剛建立s3的 靜態網站託管的終端節點源ID : 輸入儲存貯體名稱
可開啟SSL服務與HTTP導向HTTPS
PHP
下載資源
composer require aws/aws-sdk-php
引用
require '/path/to/vendor/autoload.php';
補充:
1. 如果要使用自訂的網域名,可透過DNS的CNAME設定來轉,並加入CloudFront的網域清單。
2. 如果持續顯示存取拒絕,可開放S3權限的"everyone"的讀取設定。
IAM USER設定:
新增一個使用者,取得程式使用的ID及KEY。
S3設定:
1. 建立S3服務,並設定儲存貯體名稱
2. 於屬性啟用靜態網站託管,取得靜態網站託管的終端節點
3. 設定儲存貯體政策{
"Version": "YYXX-MM-DD",
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::儲存貯體名稱/*"
}
]
}
CloudFront設定:
源網域名稱:選擇剛建立s3的 靜態網站託管的終端節點源ID : 輸入儲存貯體名稱
可開啟SSL服務與HTTP導向HTTPS
PHP
下載資源
composer require aws/aws-sdk-php
引用
require '/path/to/vendor/autoload.php';
補充:
1. 如果要使用自訂的網域名,可透過DNS的CNAME設定來轉,並加入CloudFront的網域清單。
2. 如果持續顯示存取拒絕,可開放S3權限的"everyone"的讀取設定。
訂閱:
文章 (Atom)
