Androidでjava.lang.NoClassDefFoundError: Failed resolution of: Landroid/icu/text/Transliterator;

半角全角の文字の切り替えをAndroidでしたいと思って

https://qiita.com/makimaki913/items/df745b85b802099a6e32

を見ながらICU4Jを使おうとした。

Transliterator fullToHalf = Transliterator.getInstance(“Fullwidth-Halfwidth”);
Transliterator halftoFull = Transliterator.getInstance(“Halfwidth-Fullwidth”);

でもどうもAndroidで公式にICU4JをサポートしているのはAndorid7からのようでAndroid5.0で動かしたい場合はGradleに

implementation 'com.ibm.icu:icu4j:53.1'

※参考

https://developer.android.com/guide/topics/resources/internationalization

のように記述する必要がある。

これでAndroid5.0で動くぞーと思ったら、なぜか動かない

 

FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/icu/text/Transliterator;

とでる。

原因は公式のサジェストでライブラリをインポートしたことでした。


import android.icu.text.Transliterator;

から

import com.ibm.icu.text.Transliterator;

にしましょう

PHPでGS1からJANを作成

なかったので作りました。

 自己責任でお使いください

class gs1 {
    function gs1tojan($gs1) {
        //すべて半角数字または()であるかをチェック
        if (preg_match("/^[0-9()]+$/", $gs1))
            //最初の桁のインジケーターを判断
            if(mb_strlen($gs1)==18){
                if (strpos($gs1, '(010)') === 0|strpos($gs1, '(01)0') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 5, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==17){
                if (strpos($gs1, '(01)') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 4, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==16){
                if (strpos($gs1, '010') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 3, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==15){
                if (strpos($gs1, '01') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 2, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }else if(mb_strlen($gs1)==14){
                if (strpos($gs1, '1') === 0) {
                    $janNoCheckDigit=mb_substr($gs1, 1, 12);
                    return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
                }
            }
        }
        return false;
    }
    function calcJanCodeDigit($num) {
        $arr = str_split($num);
        $odd = 0;
        $mod = 0;
        for($i=0;$i<count($arr);$i++){
            if(($i+1) % 2 == 0) {
                //偶数の総和
                $mod += intval($arr[$i]);
            } else {
                //奇数の総和
                $odd += intval($arr[$i]);
            }
        }
        //偶数の和を3倍+奇数の総和を加算して、下1桁の数字を10から引く
        $cd = 10 - intval(substr((string)($mod * 3) + $odd,-1));
        //10なら1の位は0なので、0を返す。
        return $cd === 10 ? 0 : $cd;
    }   
}

26歳でITベンチャーを立ち上げて

早いものでもうすぐ起業して6年がたつ。

小学生だと卒業しちゃう年だ。こわいね。

 

恥ずかしながらお話を聞きたいとのご要望があったので、ちょっと自分語りをしようと思います!

 

 

ベンチャーを立ち上げた経緯について

 

これは結構、理由はシンプルです。

・自分が薬局で働いてた時に本当に調剤過誤が多くて、それを解決したかったこと

・当時からプログラミングがとても得意(もともと携帯アプリなんか色々と作っていた)で、自分でも調剤過誤が防げるソフトが作れるはずと思ったこと

・当時でも薬局向けの調剤過誤防止機器はあったけど、値段が高すぎてとても気軽に導入できないから、もっと気軽に導入できる値段で、使いやすいのが作りたいって思ったこと

これが監査システムを作り始めたのがきっかけです。

 

でも当時、なにも起業のこととか分からなかった。でもネット検索していろいろ調べて自分で株式会社作りました。(会社設立ひとりでできるもんっていうサービスを使った)

 

※いきなり株式会社にしたのは、NSIPSという薬局のレセコン(処方箋入力用のパソコン)から、処方データと連携するためには、法人じゃないとだめって事で、いきなり法人になりました。ふつうは個人事業主→法人の流れがいいと思います。(消費税の特例とか、会社の維持費とかから)

 

でも立ち上げてからまぁ大変でした。

忘れないうちに起業の軌跡を残したいと思います!

 

立ち上げて1年目ぐらい

普通に薬剤師として週2~3でバイトしてました。(正社員→バイトに)

バイトしてアプリ作って、バイトしてアプリ作ってを繰り返してた。でもいっぱいシフトはいって欲しいといわれて、ちょっと忙しいんで~って言っても、忙しくないでしょみたいな風に思われてる(ホント)から、なんか「ミスばっかするし、なんかあんまり働いてくれなし」みたいな感じで現場の評価は低かった。

ただ、社長に近い役員の方々とは割と仲良くて、やめるとき割と悲しそうな感じだった。よく現場と管理は考え方違うっていうけど、本当にそう思う。

 

他に、依頼を受けてソフト作成するとかは結構してた。技術があるなら割と時間かからずに作成できて、結構おいしい仕事もあったりした。

ただ、知り合いの社長から、業務ソフトウェア作ってほしいって言われて作って納品したのに、結局お金払ってくれなかった事があった。(正確に言うと、作ったソフトを発注元の社長が販売して、ソフトが売れたらその売り上げの一部を支払うみたいな感じだけど、完成してから俺は売らないとか言われた。別に不具合とかバグはなく。仕様以上のクオリティで作ったつもり)3か月無駄になってかなり辛かった。

 

結局、請負契約はリスクあるからやらない方がいいと思います。

基本的に監査システムの開発が中心でした。

 

立ち上げて2年目ぐらい

監査システムのオフライン版(薬局内にサーバー設置型)がとりあえず、動くようになったので販売開始。

でも当時はこれ不具合があるし品質的に良くないって思ってたから積極的に販売はしなかった。(一応WEBページから購入できるようにはしてた)

いろんな人に意見聞きたくてベンチャー起業家向けのセミナーとかいってみた。

なんか怪しい人に俺が売ってやるから専売させろみたいなことを言われたけど(なんか人脈自慢すごくて今思えばマルチとかの関係者だと思う)あんまり信用できないなーって思ったから断ったらブチ切れられて怖かった。(この俺が売るって言ったのに断るなど、お前は間違えなく失敗するとかいわれた)

商品自体は完成していたので割と変な人が寄ってきて、起業セミナーってなんか自己評価高い人おおくて、意識低い系のわたくしにとっては、居心地よくなかった。

まぁでも自信をもっておススメできるぐらいに品質を改善しようとしていた。

品質改善って労力の割に地味でモチベーションを保つのに結構大変で、てか俺ってニートじゃね?みたいに思ってた。

 

立ち上げて3年目ぐらい

実は監査システムの開発と販売を積極的にやってなかったです。

というのも、あるきっかけから今の社員と一緒に投資ソフトを開発して、それが大当たりした。1日チャートに張り付いたり、いろいろストラテジー考えたり結構楽しかった。

その儲かった資金を使って不動産投資したり、薬局経営したりしたいと考えたりもした。(結局やらなかったけど)

フロー収入じゃなくてストック収入が大事だなとかお金について結構勉強したり、節税について必死で調べた。とんでもなく税金かかったから。

投資だけで暮らせるなぁ~と悠長な事を考えていた(フラグ)。

正直、もっと監査システムの開発やっとけばよかった。

 

立ち上げて4年目ぐらい

投資ソフトの成績が超微妙になって、なんかあんまりうまいこと行かなくなったので、オフライン版の監査システムの問題点を考えて、売れるようにしようと真剣に考えた。

当時の問題点

・導入に薬局でのサーバー設置・初期機器が必要

→導入コストが上がって、工事などが大変で管理も必要

・UIが分かり辛い

→ヘルプやマニュアルが充実しておらず、口頭での説明がないと使いにくい

・誰も知らない

→広告宣伝していないから当然誰も知らない。知らないと導入の比較にすら上がらない。

 

と問題が山積みだったので、とりあえず最優先して導入コスト削減に取り組んだ。

多分一番気にするところだから。

結果的にアプリだけで完結する、(サーバー設置が必要ない)クラウドでやることに決めた。

 

投資ソフトの改良は続けてたけど、結局成績が微妙すぎて最終的にはやめた。多分みんな考える複利の計算は計算通りいかないです。

 

立ち上げて5年目ぐらい

クラウド版がとりあえず動くようになったのでクラウド版の販売開始。

色々な販売方法はあるけど、やっぱり今の時代ネットかなと思ってそれに合うように色々と調べた。

販売用のランディングページを作りなおしたりしたけど、最初は全然アクセスもないし、本当にWEBから売れるのかなって感じだった。

(今まで売れてたオフライン版は全部知人とかの紹介だった)

色々と調べてるうちに、SEOについて知った。

SEO対策は本当に大事です! (ホームページの検索順位を上げる対策)

これで調剤過誤の対策を行いたい人が 検索して調べることで弊社のページを見つけることが出来るようになった。※さらにうれしいのが弊社のシステムを選んでくれた薬局さんは比較検討したうえで選んで頂けることが多く、しっかりされた薬局さんばっかりだった。

 

この対策を行うことで徐々にランディングページに訪問してくれるユーザーが増えてきてくれて、アプリもインストールしてくれて、そして初めて契約してくれた時はかなりうれしかった。あと、いける!って思った。

導入の流れができたので、あとは実際に使ってるユーザーさんに意見を聞いて、問題点を直していくっていう事を続けていった。これは今も心掛けていることです。

 

立ち上げて6年目ぐらい(今)

アプリの改善をずっと続けています。初期のころよりかなり改善されたと思う。

お陰様で、導入店舗もかなり増えて、とりあえず会社としてちゃんと経営できるぐらいにはなりました。

あとフロー収入とストック収入だとストック収入が大半になったので精神的安定が全然違う。正直、下請け的な感じで請負の仕事だけだと安定しないし、発注元がダメになったら当然発注先もダメになるのでお勧めしないです。

 

これから起業するかたへ

 

最初はみんな分からないので、調べながらで全然大丈夫です。

あと若いうちにやったほうがいいと思います。失敗いっぱいするけど割と若いからで許してくれたりします。

ただ、だまされないように気を付けましょう。特に起業したては悪い人かの区別もわからないです。セミナーもマルチとか自称大物起業家みたいな変な人が多かったです。いかなくていいです。

 

また、とにかく出ていくコストは最小限にしたほうがいいです。(最初の2~3年は基本赤字です。ある程度は収入がなくても暮らしていける資金は用意すべき)

固定費も最小限のままで、人員も今は最低限の人員だけど、今後も最小限の人員でやっていくつもりです。

 

最後に

起業してとてもよかったです。

自由です。あと自分で作った製品が認めてもらえたら嬉しいです。(小並感)

起業したい方はリスクを取りすぎず起業するのをお勧めします!

 

 

メモリとCPUに余裕があるのにnginxで503エラーが出て、php-fpmが止まった

特に前兆はなく(実はあったんだけど)サーバーが死んだ。

最近はアクティブユーザーが増えてくれて、POSTで1日200万リクエスト(転送量20GB)をこえたりしてたんだけど、突然503エラーで完全に応答しなくなった。(アプリでは通信エラーと出る)

構成としてConohaの メモリ 4GB/CPU 4Core×2台

これをロードバランサーでつないでいる。

 

まぁhtopでロードアベレージも両サーバー0.6とかで、これだったら余裕だろ~って眺めてたら死んだ。

てか実際に落ちたときにhtopで確認したけどロードアベレージが1を超えてなかった。

なんで??という思いが強かったけど、TCPコネクション使い切ったとおもって、とりあえずサーバーリブートで問題なく治った。

これはメモリリークの可能性があるなと思って(サーバー自体は半年以上再起動とかしてない)

とりあえず、様子見したら一日問題なく動いた。

 

実は設定悪い可能性があります!

 

nginx_error.log

connect() to unix:/var/run/php-fpm/php-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client:

 

php-fpm-error.log

[21-Jan-2021 10:50:43] WARNING: [pool www] server reached pm.max_children setting (100), consider raising it
[21-Jan-2021 11:01:23] NOTICE: Terminating …
[21-Jan-2021 11:01:23] NOTICE: exiting, bye-bye!
[21-Jan-2021 11:01:43] NOTICE: fpm is running, pid 1009
[21-Jan-2021 11:01:43] NOTICE: ready to handle connections
[21-Jan-2021 11:01:43] NOTICE: systemd monitor interval set to 10000ms
[21-Jan-2021 11:01:52] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 17 total children
[21-Jan-2021 11:01:53] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 25 total children
[21-Jan-2021 11:01:54] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 35 total children
[21-Jan-2021 11:01:55] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 45 total children
[21-Jan-2021 11:01:56] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 55 total children
[21-Jan-2021 11:01:57] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 65 total children
[21-Jan-2021 11:01:58] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 9 idle, and 75 total children
[21-Jan-2021 11:01:59] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 9 idle, and 76 total children
[21-Jan-2021 11:02:21] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 8 idle, and 84 total children
[21-Jan-2021 11:02:22] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 9 idle, and 86 total children
[21-Jan-2021 11:02:45] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 8 idle, and 98 total children
[21-Jan-2021 11:02:49] WARNING: [pool www] server reached pm.max_children setting (100), consider raising it

 

まずworker_processes を確認!

worker_processes auto;←これが良い

これがworker_processes  1(!?)になってた

CPUコア4なのに、これじゃあ1個しか使わない

あとコネクションの上限も念の為あげとく
worker_rlimit_nofile 16384;

events {
worker_connections 4096;
}

※worker_rlimit_nofileは設定しないと1024とかに制限されちゃうから必要

 

前提としてdynamicで

あと、php-fpmが平均してどれぐらいメモリ使うかによってpm.max_children

の設定も変えましょう

pm.max_children = 200

にした

ps -ylC php-fpm –sort:rss

で調べれる

RSSがメモリ使用率でKBで表示されます(24116だったら24116KB)

だいたい雰囲気の平均をとって、20MBぐらいだな~とおもって

メモリ4GBだったら

4000MB/20MBの200

この200をpm.max_childrenにした(本当はもっと安全をとって低いほうがいいかも)

参考→https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/

 

あとpm.max_requestsが自分的にはちょっと大事!

今まではpm.max_requestsはデフォルトの0にしていた

でも多分メモリリークの可能性があって、メモリ使い切って不安定になった可能性がある。このpm.max_requestsっていうのはmax_requestsの回数に達したらプロセスを再起動する設定になるからメモリリークがあっても解消できる。

つまりこれが実は大事だったかも。

ただ現在、1日200万PVなので1日ぐらいで再起動させたい場合、

1日のリクエスト(PV)数 ÷ pm.max_spare_serversになるので

だいたい50000ぐらい?

なんか凄く大きな値になった。

まぁ0よりはいいでしょう

 

とりあえずこれで様子をみる。

 

追記:念のためメモリも8GBにした。

でもこれ多分2台でやる、 8GB×8GBより4GB×4GB×4GBとかのほうが良い気もする。

 

PHPのバージョンを7.Xに上げたら、Notice: Array to string conversion in…’とエラーが出て、Arrayの配列結合演算子(+=)がきちんと動作しない

PHP5.6で問題なかったのにPHP7にバージョンアップしたら、Notice: Array to string conversion in…’とでて、Arrayが空っぽになった。

Arrayの($new_array +=$old_array)の部分でエラーが出ているから、配列結合演算子(+=)が悪いかと思ってたけど、実はそれは悪くなかった。

 

原因:

$old_arrayの作成で

$old_array=””;

$old_array[$num]=array(XXX => YYY);

$new_array +=$old_array

としてた。これが悪い!

 

解決:

$old_array=array(XXX => YYY);

$new_array[$num] +=$old_array

↑こうしましょう

$old_arrayに[$num]をつけるのはだめ

 

Ubuntuでpython3でpyqt5を実行したいのにエラーがでる

以下のエラーが出る。

qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “” even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted (core dumped)

 

pip3 install pyqt5とか他色々ぐぐったら出てくるものを試したけどなんか見つからない。

これ、本当に単純で

pip3 install –user pyqt5
sudo apt-get install python3-pyqt5
sudo apt-get install pyqt5-dev-tools
sudo apt-get install qttools5-dev-tools

でいけました。

単純にapt-get install python3-pyqt5 が大事

Javaでメソッドを引数みたいな感じで別クラスに渡して別クラスでメソッドを実行させる方法

何を書いているか良くわからない。というか表現があっているかもよくわかってない。

Pythonでいう関数渡し的なのをJavaでやりたい

 

やりたいこと

private void AAA(){

class InnerClass{
InnerClass(){

//InnerClassの中身

}

}

new InnerClass();//InnerClass実行

BBB();//こいつに new InnerClass()を渡して実行させたい

}

 

class void BBB(){

//BBBの中身

//InnerClassを実行させたい場所

}

 

これ、実はThreadで解決できる。

じつは常識なのかな?私は知らなかった。

解決法:

private void AAA(){

class NewInnerThread extends Thread {
public void run() {
//InnerClassの中身

}
}

new NewInnerThread ().run();

BBB(new NewInnerThread ());//こいつに new NewInnerThread ()渡す

}

 

class void BBB(Thread thread1){

//BBBの中身

thread1.run();

}

 

これでとりあえず解決できた。

 

 

CentOSにSquid(Proxy)をインストールしてProxy経由で日本国内専用サービスにアクセスする方法

日本国内だけのHPやサービスにアクセスする時は普通はVPNを使ったほうがいいんだけど、それが使えないケースもある(私の場合はappetize.io)

 

できるだけ安全に運用するための手順です

イメージ

世界→Myサーバー(squid)→国内専用HP

Basic認証でなおかつホワイトリスト方式(許可したドメインだけのアクセス許可)にします

 

インストール:

yum -y install squid

firewall-cmd –zone=public –add-port=3128/tcp –permanent
systemctl start squid.service
systemctl enable squid.service

yum install httpd-tools

htpasswd -c /etc/squid/passwords user

password#これはBasic認証のために


vi /etc/squid/squid.conf

 

 

/etc/squid/squid.confの中身
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
auth_param basic children 10

acl authenticated proxy_auth REQUIRED
http_access deny !authenticated #このDeny!にしないと、DNSのホワイトリスト方式が取れない

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

acl mysite dstdomain www.yahoo.co.jp
acl mysite dstdomain www.google.co.jp
acl mysite dstdomain .google.com
acl mysite dstdomain fonts.googleapis.com
acl mysite dstdomain ajax.googleapis.com
acl mysite dstdomain cdn.jsdelivr.net
#acl mysite dstdomain .googleapis.com
#acl mysite dstdomain .jsdelivr.net
acl mysite dstdomain youtu.be
acl mysite dstdomain .youtube.com
acl mysite dstdomain appetize.io
acl mysite dstdomain .medicalfields.jp
acl mysite dstdomain 157.7.94.189
acl mysite dstdomain www.ugtop.com #To Check Ip
acl SSL_ports port 443
acl Safe_ports port 80 # http
#acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
#acl Safe_ports port 70 # gopher
#acl Safe_ports port 210 # wais
#acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280 # http-mgmt
#acl Safe_ports port 488 # gss-http
#acl Safe_ports port 591 # filemaker
#acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on “localhost” is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
#http_access allow localhost
http_access allow mysite
http_access deny !mysite

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

dns_v4_first on #こうしないとGoogleに入れなかった

dns_nameservers 8.8.8.8 208.67.222.222

 

 

ApacheのPHP7にバージョンアップしたら実行時に500 Internal Server Errorが出て、php-fpmのエラーログに何も情報が表示されていない場合

.htaccessが悪い可能性が高いです。

私の場合は

.htaccessに

php_value post_max_size 100M
php_value upload_max_filesize 100M
php_flag display_errors On

が記載されていたことが原因でした。

php_valueとphp_flagを削除すると、ちゃんと動きました

どうもphp_valueやphp_flagはPHPのモジュール版でのみ有効で、php7ではセキュリティの観点からデフォルトで無効になっているようです。

素直にphp.iniで設定しましょう

 

ConohaのロードバランサーでHTTPのヘルスモニターがうまく動作しない

当社はNginxでConohaのロードバランサーを使用している。

今まではPINGでヘルスチェックを行っていたのだが、Nginxに障害が出た際に、Pingだと予備サーバーのNginxデーモンが落ちた際に、うまいことバランシング出来なくて、障害が発生したので、HTTPのヘルスチェックに切り替えることにした。

でもうまいこと行かない

原因はHTTPSでした。

今までNginxは

server {
listen 80;
server_name xxx.medicalfields.jp;

if ($http_x_forwarded_proto != https) {
return 301 https://$host$request_uri;
}
}

てな感じで設定したんだけど、どうもConohaだとHTTPでアクセスするとステータスコードが301(URL転送)になってヘルスチェック失敗になるっぽい

そのため親ディレクトリだけはHTTPでアクセスした際にリダイレクトしないように設定した

解決↓

server {
listen 80;
server_name xxx.medicalfields.jp;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
location ^~ /php/ {
if ($http_x_forwarded_proto != https) {
return 301 https://$host$request_uri;
}
}
}

ロードバランサーでHTTPのヘルスチェックに失敗する場合は、参考にしてください