MAC內的ruby目前還停留在2.0.0版,以下是使用homebrew的方法來更新 ruby & gem:
brew install ruby
vi ~/.profile
加入
export PATH=/usr/local/bin:$PATH
source ~/.bash_profile
brew link --overwrite ruby
gem install bundler
JAVA也是差不多,不過由於目前正是要過渡到JDK 9,系統又想保留JDK 8,且預設JRE要指定為8,可以這麼做:
brew cask reinstall java8 //jdk8
brew cask install java //jdk9
#查看一下目前裝了哪些JVM版本
/usr/libexec/java_home -V
#指定JRE 1.8
vi ~/.profile
加入
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
source ~/.bash_profile
#檢查一下
java -version
但如果是.app的程式,可能就比較麻煩點了,如NetBeans.app,需要去修改netbeans.conf,直接指定jdk 8的路徑:
netbeans_jdkhome="/Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home/"
若有修改~/.profile加入JAVA_HOME的話,可直接改為
netbeans_jdkhome="${JAVA_HOME}"
如果使用NetBeans的話,千萬不要傻傻移除Java 8啊,畢竟NetBeans 8.1以後的版本還是基於JDK 8使用的,安裝JDK 9之後再從NetBeans新增Platform選項就可以了。
ref:
https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html#A1096903
https://www.java.com/en/download/help/mac_uninstall_java.xml
http://wiki.netbeans.org/JDK9Support#jdk9_runtime
https://stackoverflow.com/questions/21964709/how-to-set-or-change-the-default-java-jdk-version-on-os-x
https://stackoverflow.com/questions/38194032/how-to-update-ruby-version-2-0-0-to-the-latest-version-in-mac-osx-yosemite/42286604#42286604
2017-10-24
2017-10-23
讓TOMCAT 8.5, TOMCAT 9 支援 SSL over HTTP/2
TOMCAT 8.5以上可支援HTTP/2,而HTTP/2+ALPN為目前瀏覽器支援的主流,
需要openssl的支援,而舊版本openssl只支援NPN,
若要支援ALPN,那麼openssl版本需 >= 1.0.2,
若未滿足上述條件,瀏覽器會自動降級為使用HTTP/1.1協定,
或瀏覽器本來就不支援HTTP/2,伺服器會改使用HTTP/1.1協定。
TOMCAT 8.5要支援HTTP/2需要使用APR(Tomcat Native library)
TOMCAT9.X要支援HTTP/2,可以使用APR,或使用Java >=9版本(建議)。
(UPDATE: TOMCAT 8.5 +JDK8使用APR有不太穩定的現象,建議升級為TOMCAT 9)
(UPDATE: TOMCAT 9 +JDK8使用APR運行了幾天後突然噴掉,查了 /tmp/hs_err_pid22617.log
,stack trace顯示錯誤為:
Stack: [0x00007f2eb16f8000,0x00007f2eb17f9000], sp=0x00007f2eb17f74a0, free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libc.so.6+0x7c418] _int_free+0x2f8
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 7361 org.apache.tomcat.jni.Socket.destroy(J)V (0 bytes) @ 0x00007f2ec140ba81 [0x00007f2ec140ba40+0x41]
看起來是底層系統做記憶體回收時噴掉,網路上一查似乎很多人都有不定時噴掉的情形,
看來APR似乎是不太可靠…或者是libc.so要去更新才行,因此為了暫時解決此問題,
在tomcat.service加了crash後自動restart的機制:
[Service]
...
Restart=on-failure
RestartSec=5
TimeoutStartSec=60
TimeoutStopSec=60
1.先確定OPENSSL >= 1.0.2,若不是請先升級
openssl version
==> OpenSSL 1.0.2k-fips 26 Jan 2017
2.安裝gcc、OpenSSL libraries及APR library,等下編譯 tc-native需用到
apt-get install gcc libapr1.0-dev libssl-dev
或
yum install apr-devel openssl-devel
/usr/bin/apr-1-config --version
==> 1.4.8
注意最後訊息所顯示的apr安裝位置,譬如CentOS用yum是安裝在/usr/bin/apr-1-config
3.下載Apache Tomcat Native Library,解壓縮,./configure,make,make install
(可直接使用tomcat/bin/tomcat-native.tar.gz)
(新版下載位置:http://tomcat.apache.org/download-native.cgi)
cd path/to/tomcat/bin/
tar zxvf ttomcat-native.tar.gz
cd tomcat-native-1.2.16-src/native
自動安裝到tomcat/lib:
./configure --prefix=$CATALINA_HOME
make
make install
或不make install,手動搬移library(建議):
./configure && make
mkdir -p path/to/tomcat/lib_tc
cp .libs/* path/to/tomcat/lib_tc
chown -R tomcat.tomcat path/to/tomcat/lib_tc
cd path/to/tomcat/lib_tc
ln -f -s libtcnative-1.so libtcnative-1.so.0.2.16
ln -f -s libtcnative-1.so.0 libtcnative-1.so.0.2.16
4.make install後,會在tomcat/lib多了
libtcnative-1.a
libtcnative-1.la
libtcnative-1.lai
libtcnative-1.so (link)
libtcnative-1.so.0 (link)
libtcnative-1.so.0.2.16
這些函式庫檔案跟目錄,記得檢查並chmod及chown一下。
5.之後我們需要把這些lib路徑加到環境變數LD_LIBRARY_PATH,
可以用編輯tomcat/bin/setenv.sh的方法(無此檔案請自行新增),加入:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib_tc
export LD_LIBRARY_PATH
記得chmod +x setenv.sh
6.修改tomcat/conf/server.xml
檢查一下AprLifecycleListener是否有加入此行啟動監聽:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
修改Connector,注意憑證需轉換為PEM格式
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/private_key.pkcs8"
certificateChainFile="conf/ca_chain.cer"
certificateFile="conf/ca.cer"/>
</SSLHostConfig>
</Connector>
若無申請正式憑證,可先自行生成自簽憑證使用:
openssl genrsa -out private_key.pkcs8 2048
openssl rsa -in private_key.pkcs8 -out private_key.pkcs8
openssl req -new -x509 -key private_key.pkcs8 -out ca.crt -days 3650
7.重啟TOMCAT,
檢查catalina logs是否成功載入APR
INFO: Loaded APR based Apache Tomcat Native library [1.x.y]
["https-openssl-apr-8443"]
如有以上訊息代表成功。
上述做法我在tomcat 9是成功的,但tomcat 8.5.4似乎有掉資料的現象,所以建議升級至TOMCAT 9。
TOMCAT9的HTTP/2若不使用APR,需使用JDK >= 9,這樣Connector就直接使用NIO2就好而不需要用到APR。
ref:
http://tomcat.apache.org/whichversion.html
https://tomcat.apache.org/tomcat-9.0-doc/config/http2.html
https://linux.cn/article-7934-1.html
https://dzone.com/articles/configure-tomcat-9-forhttp2
https://stackoverflow.com/questions/30855281/tomcat-support-for-http-2-0/37889873#37889873
https://readlearncode.com/configure-tomcat-9-for-http2/
http://tomcat.apache.org/native-doc/
https://tomcat.apache.org/tomcat-8.5-doc/apr.html
http://jmchung.github.io/blog/2013/09/06/centos-installing-apache-portable-runtime-apr-for-tomcat/
需要openssl的支援,而舊版本openssl只支援NPN,
若要支援ALPN,那麼openssl版本需 >= 1.0.2,
若未滿足上述條件,瀏覽器會自動降級為使用HTTP/1.1協定,
或瀏覽器本來就不支援HTTP/2,伺服器會改使用HTTP/1.1協定。
TOMCAT 8.5要支援HTTP/2需要使用APR(Tomcat Native library)
TOMCAT9.X要支援HTTP/2,可以使用APR,或使用Java >=9版本(建議)。
(UPDATE: TOMCAT 8.5 +JDK8使用APR有不太穩定的現象,建議升級為TOMCAT 9)
(UPDATE: TOMCAT 9 +JDK8使用APR運行了幾天後突然噴掉,查了 /tmp/hs_err_pid22617.log
,stack trace顯示錯誤為:
Stack: [0x00007f2eb16f8000,0x00007f2eb17f9000], sp=0x00007f2eb17f74a0, free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libc.so.6+0x7c418] _int_free+0x2f8
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 7361 org.apache.tomcat.jni.Socket.destroy(J)V (0 bytes) @ 0x00007f2ec140ba81 [0x00007f2ec140ba40+0x41]
看起來是底層系統做記憶體回收時噴掉,網路上一查似乎很多人都有不定時噴掉的情形,
看來APR似乎是不太可靠…或者是libc.so要去更新才行,因此為了暫時解決此問題,
在tomcat.service加了crash後自動restart的機制:
[Service]
...
Restart=on-failure
RestartSec=5
TimeoutStartSec=60
TimeoutStopSec=60
1.先確定OPENSSL >= 1.0.2,若不是請先升級
openssl version
==> OpenSSL 1.0.2k-fips 26 Jan 2017
2.安裝gcc、OpenSSL libraries及APR library,等下編譯 tc-native需用到
apt-get install gcc libapr1.0-dev libssl-dev
或
yum install apr-devel openssl-devel
/usr/bin/apr-1-config --version
==> 1.4.8
注意最後訊息所顯示的apr安裝位置,譬如CentOS用yum是安裝在/usr/bin/apr-1-config
3.下載Apache Tomcat Native Library,解壓縮,./configure,make,make install
(可直接使用tomcat/bin/tomcat-native.tar.gz)
(新版下載位置:http://tomcat.apache.org/download-native.cgi)
cd path/to/tomcat/bin/
tar zxvf ttomcat-native.tar.gz
cd tomcat-native-1.2.16-src/native
自動安裝到tomcat/lib:
./configure --prefix=$CATALINA_HOME
make
make install
或不make install,手動搬移library(建議):
./configure && make
mkdir -p path/to/tomcat/lib_tc
cp .libs/* path/to/tomcat/lib_tc
chown -R tomcat.tomcat path/to/tomcat/lib_tc
cd path/to/tomcat/lib_tc
ln -f -s libtcnative-1.so libtcnative-1.so.0.2.16
ln -f -s libtcnative-1.so.0 libtcnative-1.so.0.2.16
4.make install後,會在tomcat/lib多了
libtcnative-1.a
libtcnative-1.la
libtcnative-1.lai
libtcnative-1.so (link)
libtcnative-1.so.0 (link)
libtcnative-1.so.0.2.16
這些函式庫檔案跟目錄,記得檢查並chmod及chown一下。
5.之後我們需要把這些lib路徑加到環境變數LD_LIBRARY_PATH,
可以用編輯tomcat/bin/setenv.sh的方法(無此檔案請自行新增),加入:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib_tc
export LD_LIBRARY_PATH
記得chmod +x setenv.sh
6.修改tomcat/conf/server.xml
檢查一下AprLifecycleListener是否有加入此行啟動監聽:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
修改Connector,注意憑證需轉換為PEM格式
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/private_key.pkcs8"
certificateChainFile="conf/ca_chain.cer"
certificateFile="conf/ca.cer"/>
</SSLHostConfig>
</Connector>
若無申請正式憑證,可先自行生成自簽憑證使用:
openssl genrsa -out private_key.pkcs8 2048
openssl rsa -in private_key.pkcs8 -out private_key.pkcs8
openssl req -new -x509 -key private_key.pkcs8 -out ca.crt -days 3650
7.重啟TOMCAT,
檢查catalina logs是否成功載入APR
INFO: Loaded APR based Apache Tomcat Native library [1.x.y]
["https-openssl-apr-8443"]
如有以上訊息代表成功。
上述做法我在tomcat 9是成功的,但tomcat 8.5.4似乎有掉資料的現象,所以建議升級至TOMCAT 9。
TOMCAT9的HTTP/2若不使用APR,需使用JDK >= 9,這樣Connector就直接使用NIO2就好而不需要用到APR。
ref:
http://tomcat.apache.org/whichversion.html
https://tomcat.apache.org/tomcat-9.0-doc/config/http2.html
https://linux.cn/article-7934-1.html
https://dzone.com/articles/configure-tomcat-9-forhttp2
https://stackoverflow.com/questions/30855281/tomcat-support-for-http-2-0/37889873#37889873
https://readlearncode.com/configure-tomcat-9-for-http2/
http://tomcat.apache.org/native-doc/
https://tomcat.apache.org/tomcat-8.5-doc/apr.html
http://jmchung.github.io/blog/2013/09/06/centos-installing-apache-portable-runtime-apr-for-tomcat/
2017-06-04
tomcat server的CPU突然飆高,連線遺失
今天發現在VM上面RUN的TOMCAT會隨機掉連線(400, 500都出現了),
密集REQUEST的時候就會發生問題,而且CPU TIME都超過100%了!
後來發現是 server.xml 中 connector 的問題,預設是用 org.apache.coyote.http11.Http11NioProtocol (NIO),
後來改為 org.apache.coyote.http11.Http11Nio2Protocol (NIO2),
然後就,好了,也不知道是不是舊 NIO 跟 VM 犯沖,改成效能比較好的NIO2似乎就沒事兒了。
密集REQUEST的時候就會發生問題,而且CPU TIME都超過100%了!
後來發現是 server.xml 中 connector 的問題,預設是用 org.apache.coyote.http11.Http11NioProtocol (NIO),
後來改為 org.apache.coyote.http11.Http11Nio2Protocol (NIO2),
然後就,好了,也不知道是不是舊 NIO 跟 VM 犯沖,改成效能比較好的NIO2似乎就沒事兒了。
2017-04-17
Java中HttpServer (HttpsServer) ,解決response會延遲或卡住的問題
第一次使用 com.sun.net.httpserver.HttpServer 跟 com.sun.net.httpserver.HttpsServer 做為http server時,
發現連續的request會使得response卡住:
解決之道,就是確保connection能close, 並使用multi-thread:
ref:
http://stackoverflow.com/questions/15235075/1s-delay-in-httpserver-since-java-7
發現連續的request會使得response卡住:
OutputStream os = httpExchange.getResponseBody(); os.write(response.getBytes()); //卡住造成阻塞,過很久才會回應, os.close();
解決之道,就是確保connection能close, 並使用multi-thread:
final Executor multi = Executors.newFixedThreadPool(10); final HttpServer server = HttpServer.create(new InetSocketAddress(s_HTTP_PORT), 5); //... do your REST bindings here server.setExecutor(multi); server.start(); //bindings中送出Connection = close 的 header httpExchange.getResponseHeaders().add("Connection", "close");
ref:
http://stackoverflow.com/questions/15235075/1s-delay-in-httpserver-since-java-7
2017-03-31
TOMCAT的安全性header設定
TOMCAT有內建一些關於CORS及SECURITY的HEADER, 可以的話建議打開,以利用瀏覽器所提供的安全性功能,以下是個人常用的預設設定:
修改 tomcat-home/conf/web.xml (對所有apps生效):
ref:
https://tomcat.apache.org/tomcat-8.5-doc/config/filter.html#CORS_Filter
https://tomcat.apache.org/tomcat-8.5-doc/config/filter.html#HTTP_Header_Security_Filter
https://wiki.mozilla.org/Security/Guidelines/Web_Security#Content_Security_Policy
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
HTTP Headers 的資安議題 (1)
HTTP Headers 的資安議題 (2)
HTTP Headers 的資安議題 (3)
修改 tomcat-home/conf/web.xml (對所有apps生效):
HeaderSecurityFilter org.apache.catalina.filters.HttpHeaderSecurityFilter hstsEnabled true hstsMaxAgeSeconds 15768000 hstsIncludeSubDomains true antiClickJackingEnabled true antiClickJackingOption SAMEORIGIN antiClickJackingUri blockContentTypeSniffingEnabled true xssProtectionEnabled true CorsFilter org.apache.catalina.filters.CorsFilter cors.allowed.origins https://your.domain.com HeaderSecurityFilter /* REQUEST FORWARD INCLUDE ERROR ASYNC CorsFilter /* REQUEST FORWARD INCLUDE ERROR ASYNC
ref:
https://tomcat.apache.org/tomcat-8.5-doc/config/filter.html#CORS_Filter
https://tomcat.apache.org/tomcat-8.5-doc/config/filter.html#HTTP_Header_Security_Filter
https://wiki.mozilla.org/Security/Guidelines/Web_Security#Content_Security_Policy
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
HTTP Headers 的資安議題 (1)
HTTP Headers 的資安議題 (2)
HTTP Headers 的資安議題 (3)
TOMCAT自訂共用library目錄
常常TOMCAT裡的apps都會共用一些library,而通常的做法是直接丟到${catalina.base}/lib裡面去,不過有時在搬移網站時,常常就會忘了哪些是自已新增的lib.jar了 XDD
因此可以另外建一個目錄來放自已的共用jar library。譬如先建一個common-lib專放自已共用的jar:
修改/conf/catalina.properties的shared.loader or common.loader屬性,新增路徑:
因此可以另外建一個目錄來放自已的共用jar library。譬如先建一個common-lib專放自已共用的jar:
修改/conf/catalina.properties的shared.loader or common.loader屬性,新增路徑:
shared.loader="${catalina.base}/common-lib","${catalina.base}/common-lib/*.jar","${catalina.home}/common-lib","${catalina.home}/common-lib/*.jar" ...或 common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
2017-03-28
找出由大到小第N個項目
找出由大到小第N個項目,蠻有創意的SQL寫法
SELECT * FROM Employee Emp1 WHERE (N-1) = ( SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > Emp1.Salary )
訂閱:
文章 (Atom)