2017年3月9日木曜日

Memory Analyzer / Out of Memory Error

Memory Analyzerがヒープダンプを読むときにメモリ不足で落ちる減少を解消します。

経緯:
Java(Scala)アプリの開発をしているときに、大きめのヒープダンプを取ってMemory Analyzerに読み込ませようとしたら、アラートが出ました。内容は以下のような感じです。
Parsing heap dump from /User/yako/Desktop/heapdump.hprof 17.57.52 has encountered a problem.
An internal error occurred during: "Parsing heap dump from '/Users/yako/Desktop/heapdump.hprof 17.57.52'".
GC overhead limit exceeded

解決方法:
Memory Analyzer起動時に、もっとメモリを持たせてあげれば良いです。

1) jmapでヒープダンプを取得。
$ jmap -dump:format=b,file=./heapdump.hprof PID
2) Memory Analyzerを起動。
$ ./mat.app/Contents/MacOS/MemoryAnalyzer -vmargs -Xmx4g -XX:-UseGCOverheadLimit


環境: macOS Sierra

参考資料)
MemoryAnalyzer/FAQ - Eclipsepedia
https://wiki.eclipse.org/MemoryAnalyzer/FAQ

2017年2月7日火曜日

iOS Objective-C SSL証明書エラーを回避する方法

NSURLRequestを使っているとき、SSLで自己証明書(オレオレ証明書)をつかっているサーバのURLにアクセスするとエラーになります。
これを回避する方法です。
開発時などに役に立つTIPSだと思います。

エラーの例
2017-02-07 10:49:25.250 App[46178:1264401] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
2017-02-07 10:49:25.253 App[46178:1264332] FADHttp failed -1200: https://mydomain/ An SSL error has occurred and a secure connection to the server cannot be made.

Info.plistにAppTransportSecurityを設定して、NSURLRequestをオーバーライドするコードを追加します。

参考資料
[iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/
Working with Apple’s App Transport Security
http://www.neglectedpotential.com/2015/06/working-with-apples-application-transport-security/
Aplle / Cocoa Keys / Information Property List Key Reference
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40016240

2016年10月3日月曜日

nginx で ngx_http_geoip_module を利用して国別アクセス制御を行う

nginx Module ngx_http_geoip_module
http://nginx.org/en/docs/http/ngx_http_geoip_module.html

nginxのngx_http_geoip_moduleモジュールを利用して、国を指定してアクセス制御をします。
フィルタリング用のデータは、MaxMindのGeoIPオープンソースデータを利用します。
日本だけにコンテンツを配信したい、もしくは、特定の国からのアクセスを拒否したい、といったときに使えるとおもいます。
環境は、CentOS 6です。

以下、セットアップ方法です。

GeoIPデータベースを準備

GeoIPデータベースと更新コマンドをインストール。
# rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install GeoIP geoipupdate
GeoIPデータベースファイルが設置されたことを確認。
# stat /usr/share/GeoIP/GeoIP.dat

nginxを準備

nginxをインストール。
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum install nginx nginx-module-geoip
# nginx -v
nginx version: nginx/1.10.1
nginx設定パラメータにhttp_geoip_moduleが入っているか確認。GeoIPは、動的モジュールとして有効化できるようになっています。
# nginx -V
--with-http_geoip_module=dynamic
nginx動的モジュールの共有オブジェクトファイルが設置されているか確認。
# ls /etc/nginx/modules/
ngx_http_geoip_module-debug.so  ngx_http_geoip_module.so

nginx設定

カントリーコードはこちらのURLを参考にします。
http://dev.maxmind.com/geoip/legacy/codes/iso3166/

load_moduleを追記。modules/ngx_http_geoip_module.soを指定します。
events {} ブロックより上に記述するのがポイントです。
# emacs /etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

load_module modules/ngx_http_geoip_module.so;

events {
    worker_connections  1024;
}

http {} ブロックを編集。
includeより上に記述します。
アメリカ(US)と日本(JP)からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        US no;
        JP no;
    }
日本(JP)と韓国(KR)からのアクセスを許可、他の国からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        JP yes;
        TW yes;
    }

server {} ブロックを編集。
allowed_countryがnoだったらステータスコード403を返します。
# emacs /etc/nginx/conf.d/default.conf
    if ($allowed_country = no) {
        return 403;
    }


nginx再起動

nginxをリスタート、またはリロード。
# /etc/init.d/nginx restart
ブラウザなどでアクセスして確認しましょう。思い通りにアクセスコントロールできたでしょうか?

GeoIPデータベースを更新するには?

GeoIPデータベースをアップデートをするには、以下のコマンドを叩きます。定期実行するようにしましょう。
# geoipupdate -v

ELBの場合は?

AWSを使っている場合、ELBを前段に置く場合がほとんどだとおもいます。
ELBからのヘルスチェックでサーバに来るアクセスは、内部IPアドレスのため、国で判別することができません。そのため、VPC内のIPアドレスからアクセスが来た時には、制限をスルーするようにnginxを設定します。

以下の設定では、ELB経由のアクセスから、アクセス元IPアドレスを取得。ELBのヘルスチェックのアクセスを許可、日本からのアクセスを許可、ほかの国は拒否としています。
ついでに、アクセスログにGeo情報を出力するようにしています。



Top image from いらすとや