2017年5月17日 星期三

更新 mysql sets 欄位

Database 有一種 SETS 型態的欄位,在某些時候蠻有用的,不同於 ENUM 型態欄位是多選一,SETS則是可以多選。像是 `categories`="fashion,food,travel" 。何不第三正規化就好了?但因為會多兩個 table。對於 SETS 屬性,要純以 SQL 來操作新增或移除是蠻麻煩的,在此筆記一下。

2017年3月17日 星期五

查詢隱藏在 cloudflare 後面的主機 ip 是否被流出

蠻多 service 都會紀錄曾經使用過的 ip ,除此之外,一些子網域也藏會透漏原始的 ip
http://www.crimeflare.com/cfs.html

2017年3月7日 星期二

使用 JS 讓 iOS 的 safari 跳出複製

其實就是全選功能,iOS 會跳出複製選項。
在此紀錄一下
http://stackoverflow.com/questions/10452391/is-it-possible-to-select-all-input-text-on-iphone-device-when-focus-click

2017年2月24日 星期五

healthcheck 的 checkpoint

我們使用 aws route53 的 dns failover 來決定現在的 ip 要指向哪一個 datacenter。dns failover 後面要綁一個 healtcheck 的 網址。我們的 healthcheck 檢查了下列項目:
  • Mysql 連線:做 select query ,看看能否拿到某個字串。
  • APC Cache:隨機存入一個字串,再取出這個字串來看看正不正確。有遇過只有 apc 掛掉的情況。
  • PHP 可以正確的執行:像是 php fatal error 的 http status 是 200,如果只偵測 non 200 status ,就會落入陷井。

全部都正確執行後,會 echo 'o' . 'k'; 然後再偵測 ok 這個字串。為什麼不是 echo 'ok'; 呢?因為有可能是設定錯誤,造成 server 吐 php code 的情況,若是吐 php code ,就沒辦法檢查出錯誤。正確執行會吐 ok 字串,不正確執行也會吐一些 error code ,error code 我們會這麼做

echo str_replace('ok', '@k', $err_msg);

這是為了避免 error code 會不小心出現 ok 的字串,例如 facebook 就含有 ok

2017年2月21日 星期二

mysql unable to start in restored ubuntu 16.04

Linode provides snapshot backup. But mysql unable to start if the system was restored from snapshot image. The solution is simple, just uninstall and reinstall mysql package.

sudo apt purge mysql-server mysql-server-5.7 mysql-server-core-5.7
then
sudo apt install mysql-server

2016年10月14日 星期五

The difference between maxmind geoip and cloudflare geoip: country code level

Cloudflare provide free CF-IPCountry header, but we found a tweet said cloudflare's accuracy is not good enough at 2014.

We logged ip and cloudflare country code, then made a simple script to check the difference.

Dates of Cloudflare country code: first half of October, 2016
Maxmind geoip 2 country database: Oct 11, 2016

2016年9月26日 星期一

Setup DNSSec on route53 and cloudflare

Step:

  • Cloudflare -> enable DNSSec
    • Click "DNS Record", and copy public key
  • Route53 -> Manage Keys
    • Key type: 257 - KSK
    • Algorithm: 13
    • Public key: (copy from cloudflare and paste here)

Thats it! If setup fail, Google DNS will shows empty result immediately. 

2016年8月29日 星期一

修改/復原 ulimit 的 script

這個年頭 VPS 機器越來越利害,但是系統的預設設定上卻沒什麼改變,導致 cpu loading 還沒一半,系統就死掉了。以 nginx 來說,除了修改 worker_connections 、worker_processes、worker_rlimit_nofile 之外,還必需要增加系統內建的 ulimit ,預設為 1024 ,我最後是決定把 root 提升到 65536, 其它權限則改為 32768 。由於每次安裝新系統都要執行,把它包成 script 是必要的。這個 script 主要是修改 /etc/security/limits.conf 和 /etc/sysctl.conf,環境是 ubuntu 16.04:

修改 / 安裝 / install:  https://gist.github.com/girvan/a341513654ad6b1cbb7f365b9f68fa7b
回覆 / 還原 / remove: https://gist.github.com/girvan/2f70eb52fd259f6c18a062e015785bc2

我自己是用 ab 來測試 ab -n 10000 -c 500 http://....
-c 從 500 ~ 1000 來反覆測試看看極限值有沒有提升。

這個 ulimit 修改適用於靜態檔案,php 的極限值有提升,但沒這麼多,可以再做其它設定去增加 php 的連線數。php 的連線數我沒有做調整,因為還不到極限值 cpu 就滿載了,調了也沒用,我這邊是採用 nginx 的 request limit 來保護 php ,還蠻有效的。

2016年5月4日 星期三

ttl 60 和 ttl 120 的查詢次數

4/12 以前 ttl 是 60 ,以後是 120,找了pageview 差不多的兩天的資料來看,4/10 和 4/17 ,剛好都是星期日,使用者 pattern 和造訪的頁面也差不多。

由於 pageview 不好意思寫出來,只寫個比例
ipv4 的 A query 是 100 : 83
  ttl 60 全天被查詢 100 次,ttl 120 為 83 次
ipv6 的 AAAA query 是 100 : 88
  ttl 60 全天被查詢 100 次,ttl 120 為 88 次

ttl 短,在主機掛掉時可以快速切換 ip ,但…

  • 使用者網路的 DNS 
  • 可靠度有時卻沒有這麼高,尖峰時間有時會發生 query 不到的情形,由其是中華電信之前對上 cloudflare DNS
  • 會刻意拉長快取時間,我這邊的經驗是 DNS 設 60 秒,ip 切換後,往往是半小時候流量才會停止,Bing Bot 也會刻意拉長時間。
所以同一個 data center 使用 node balancer 放多台 server 才是正解嗎?不,網站的可靠度可能更低哦!以 linode 常常是 data center 輪流被 DDoS 攻擊,但通常不會多個 data center 一起被攻擊。所以目前本站還是以多個 data center 為主,以 route53 的 failover 來做切換。


2016年2月26日 星期五

被瀏覽器攻擊的可能原因

還沒升級 https 之前,偶而會有少數 ip 持續的 request 同一個頁面,可能原因很多,可能是