Page 2 of 7

Java Web 另一個選擇 Resin

兩年前曾經碰過的一套Java Web Server

當初是因為總監的要求才去研究,實際摸過之後發現其實效能很好

正常的Java Web 都是 Apache + Tomcat

然後開始有人用 Nginx + Tomcat

最後我是摸到了 Nginx + Resin

如果沒被修改掉的話,Yiabi應該還是我們當初建置的 Nginx + Resin 架構

 

首先官網是 http://caucho.com/

右上角就可以下載,這個是手動編譯版本

下載tar.gz版本之後 解壓縮 進到目錄之後編譯

#/configure –prefix=/usr/local/resin

#修改設定檔

cd /usr/local/resin/conf

vi resin.properties

#註解拿掉

#web_admin_external : true
#port也在此修改
#修改設定vi resin.xml

修改webapp id與路徑

<web-app id=”/Maltese” root-directory=”/home/webuser/ResinJservRoot/Maltese”/>

修改自動deploy路徑設定
web-app-deploy path=”/home/webuser/ResinJservRoot”

如果有買專業版本的話,有cache機制可以使用

修改cache參數
vi resin.xml

在cluster 內增加
<server-header> </server-header>
<resin:if test=”${resin.professional}”>
<cache memory-size=”64M”>
<rewrite-vary-as-private/>
</cache>
</resin:if>

 

在<web-app-deploy 底下增加
<web-app-default>
<prologue>
<allow-servlet-el/>
</prologue>

<session-config>
<use-persistent-store/>
<enable-url-rewriting>false</enable-url-rewriting>
</session-config>

<resin:if test=”${resin.professional}”>
<cache-mapping url-pattern=”/” max-age=”5s”/>
<cache-mapping url-pattern=”*.gif” max-age=”60m”/>
<cache-mapping url-pattern=”*.jpg” max-age=”60m”/>
<cache-mapping url-pattern=”*.png” max-age=”60m”/>
<cache-mapping url-pattern=”*.css” max-age=”60s”/>
<cache-mapping url-pattern=”*.js” max-age=”60s”/>
</resin:if>
</web-app-default>

接著是啟動與停止指令
啟動
/usr/local/resin/bin/resin.sh start
停止
/usr/local/resin/bin/resin.sh stop

效能上來說比tomcat快上約40%

不過免費版本最好的就是搭配Nginx使用

比較彈性也方便

AWS-CLI簡易切換ELB Health check

在工作上因為盡可能要做到自動化

所以很多指令操作都寫成了一堆的shell script (誰叫我linux系的XD)

在公司的系統維護上因為有需要切換維護頁面的顯示,但是在產品設計上有跟nginx連動

所以在原本的ELB health check在tomcat關閉的時候需要切換到80 port的nginx維護頁面上

所以為了方便,寫了這個小工具

主要是用aws cli 與iam的身分去執行

#!/bin/bash

case $1 in
java)
aws elb configure-health-check –load-balancer-name jack-sim –health-check Target=HTTP:80/java/,Interval=15,UnhealthyThreshold=2,HealthyThreshold
=2,Timeout=3
;;
web)
aws elb configure-health-check –load-balancer-name jack-sim –health-check Target=HTTP:80/,Interval=15,UnhealthyThreshold=2,HealthyThreshold=2,Timeou
t=3
;;
*)
echo “Usage: $0 {java|web}”
esac
exit 0

主要就切換 80:/ 與 80:/java/ 兩個health check的監控存活頁面

畢竟在java更新重啟的時候會失效導致ELB將server抽掉,user無法正常瀏覽到維護畫面

所以切換給80由nginx判斷並顯示維護畫面,也可以透過nginx的判斷讓公司內部進入測試

 

AWS CloudTrail Log問題

最近公司的AWS帳號開啟了 CloudTrauil的功能

但是最近在查詢操作紀錄的時候發現到有怪怪的LOG

%e6%93%b7%e5%8f%96

我使用IAM user進行操作,但是出現了root的操作紀錄

詢問了一下主管,並未使用root同時進行操作

然後細查了LOG的內容是針對同一個service的操作

詢問了新加坡的TC之後,得到了一個連結

https://aws.amazon.com/tw/premiumsupport/knowledge-center/cloudtrail-root-action-logs/

說明這個狀況是正常的XD

提供給需要的人參考…

AWS-MFA and Authy 設定

最近因為有遇到一些狀況,為了資安的考量

建議公司全部帳號一律使用MFA做多一道防護

其實很多遊戲都有使用了這樣子機制,包括一些銀行也有,但是銀行端是使用OTP

設定的話,在AWS的IAM當中,每個USER內都可以設定自己的MFA裝置

擷取

由於我的IAM帳號有設定了,我先移除重新設定一下

擷取

點選 Manage MFA Device,之後會看到兩個裝置的設定,正常都是選APP,手機太方便XD

擷取

會出現一些關於MFA的注意事項與說明

擷取

然後會出現QR CODE,安裝APP 掃瞄一下

填上出現的兩組code就可以通過驗證了

之後登入就需要多填一組驗證的隨機碼了

 

再來是要說明的Authy

註冊Authy之後,掃上一個步驟的QR CODE

會出現下圖

S__4972616

確定之後

S__4972617

之後就用這個驗證做登入了

當然為什麼要推薦使用Authy的原因不是這麼簡單

原因在於Authy有Chrome套件

安裝完之後 Chrome會出現一個工具鈕

擷取

點開之後,第一次會要求你註冊手機號碼

擷取

填入後會請你確認需要哪一種方式驗證,可以使用電話、SMS,以及另一個有註冊過的裝置,我習慣使用SMS

擷取

註冊完之後,會出現這畫面,如果與你手機有同步的話,就會出現你有的裝置MFA資訊

擷取

有驚嘆號是因為尚未解除鎖定,會先要求設定開啟Authy的密碼

擷取

設定完密碼之後,你會發現右下角的Backyo&Sync無法打勾

這時候請去手機APP裡面設定backup password

之後關閉設定視窗,回到下圖,點一下鎖頭

輸入backup password即可解除

擷取

之後沒有手機,也可以用chrome解除MFA了

AWS RDS MySQL 連線數量限制

前天看到一篇文章有提到關於RDS MySQL的最大連線數量限制

剛好之後也許會需要這個數據作為系統架構設計的參考

順便分享出來

規格與連線數量限制如下方表格

t2.micro 66
t2.small 150
m3.medium 296
t2.medium 312
M3.large 609
t2.large 648
M4.large 648
M3.xlarge 1237
R3.large 1258
M4.xlarge 1320
M2.xlarge 1412
M3.2xlarge 2492
R3.xlarge 2540

有些規格可能沒有資料,但實際上按照比例去參考應該相差不遠

參考資料來源

AWS ELB新服務 ALB

AWS真是一個強大的功能

今天更新了一個新的Service 由ELB延伸出的新服務 ALB

我大概看了一下文章的內容

傳統的ELB走網路層的協定去做負載平衡

ALB走第七層 應用層的協定做負載平衡

以下圖為例

右邊是傳統的ELB模式,左邊是ALB模式

主要定義為 假設第一組的監控路徑為 /index.php  那麼第二組可以設定 /mobile.php

這樣子是不是一組ELB分為兩個應用了呢?

其實滿有趣的,應用的程度應該會多樣化許多,之後有需求就可以玩看看啦~

8/19 補充更新,ALB可以使用port作為一個單位做指定,配合container的形態使用

因為我本身沒有實際設置過,所以這資訊是一位強者提供的,實際上的功能請親自使用XD

參考文章來源 AWS Blog

AWS CLI 取得EC2 IP

目前的公司有與日本合作

在做關於AWS 上的 Auto scaling的時候,因為有佈署更新相關的需求

所以需要得知Auto scaling所啟動的EC2 IP

有看到日本方面提供了一個Ruby寫的腳本

但是好像不夠泛用

 

所以我自己寫了一個Shell版本的

主要是用Tag Key去做判斷取出對應EC2 IP

#!/bin/bash
key=Name
value=”$1″
declare -a hostbox
declare -a ipbox
hosts=`aws ec2 describe-tags –filters “Name=key,Values=Name” “Name=value,Values=$value” –output text|wc -l`
for (( i=1 ; i<=$hosts ; i++ ))
        do
        hostbox[i]=`aws ec2 describe-tags –filters “Name=key,Values=Name” “Name=value,Values=$value” –output text|head -n $i|tail -n 1|awk ‘{print $3}’`
        ipbox[i]=`aws ec2 describe-instances –instance-ids ${hostbox[i]} |grep PrivateIpAddress|tail -n1|awk ‘{print $2}’|cut -d ‘”‘ -f2`
        echo ${ipbox[i]}
        done

HTTP2-設定相關

昨天前同事給了我一篇資訊

關於HTTP2的資訊

https://blog.alphacamp.co/2016/07/12/http2/

我自己將自己的部落格設定了一下

簡單的流程有三個步驟

1.SSL憑證,有免費的,當然最好是花錢

2.WEB SERVER的設定(apache、nginx相關)

3.驗證(確認http2成功)

 

SSL憑證的話,申請流程網路上都有,這邊就帶過

我這邊主要是調整NGINX的設定

NGINX如果要支援http2的話,需要在1.9x以上,我是直接安裝1.10

設定大致上是如下圖,我設定得比較簡單,當然也可以很嚴謹

擷取

主要是 http轉https

與SSL的 http2設定

還有SSL KEY等等的資訊

另外就是 HSTS的Header等

詳細參數如下列

ssl_certificate /etc/nginx/ssl/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ‘ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS’;
ssl_prefer_server_ciphers on;

add_header Strict-Transport-Security max-age=15768000;

 

然後就是驗證,使用下面這個網址

https://tools.keycdn.com/http2-test

然後填上你的網址 例如 www.kilait.com

擷取

HTTP2通過

AWS-NATGATEWAY & ELB 並存設計

昨天颱風天為了進度還是進公司一趟趕了建置環境的案子

一切都很順利的時候,突然發現設計上又卡了

原本出問題的架構是這樣子

unnamed

EC2在不對外的網段內,然後透過NATGATEWAY出去

但是在這情況之下,ELB會無法運作

在短時間內無解的情況下,我調整了一下自己的設計規劃

將EC2全部改走IGW出去並設置Publuc IP,因為EC2需要對外呼叫API

Route Table也都修改掉,拿掉NATGATEWAY

然後回到家的路上有詢問AWS的技術團隊

討論到晚上十一點多總算找出設計上的解法

擷取

上圖是AWS新加坡團隊 Solution Architect TC 做的架構圖

原本是給我這個連結 http://stackoverflow.com/questions/9257514/amazon-elb-in-vpc

然後我實作了一下,的確可以解決了NATGATEWAY與ELB共存的問題

與我IGW修改的架構接近,但是我少了AZ內的subnet流量概念

所以我用Public IP處理

接下來只要修改掉這個部分,這個問題就解決了

這份資料就提供給日後有需要的人參考囉

 

AWS-NAT GATEWAY

今天實作預計的新架構圖時卡到的一個問題

當全部的EC2都要走NAT GATEWAY時要怎麼做?

我同事原本的架構是手動加route去做,比較傳統的解法

可是在AWS上就會有一些機制受到影響

研究Route Table半天,也沒有甚麼解法

最後我在看官網文件時發現這張圖

擷取

我覺得有點類似之間EC2做NAT的架構

後來試著理解之後改一下,就解決了

 

解決方式是

subnet A (不對外網段) (上圖private Subnet)

subnet B (對外網段)  (上圖public Subnet)

igw的route table A (上圖Custom Route Table)

ngw的route table B (上圖 Main Route Table)

一個掛在subnet B的NAT GATEWAY (上圖NAT Gateway)

將subnet B掛在 route table A

將subnet A掛在 route table B

在subnet A開一台EC2 不給public IP

完成後,這台EC2就可以對外了~

 

結果依照我公司的作法

變成要開三個網段才能解這個問題了…

© 2017 Kila's IT Home

Theme by Anders NorénUp ↑