著者アーカイブ takahashi

takahashi 著者:takahashi

nginxでSSL設定をするときに気を付けたいこと

高橋です。

以前家で趣味でnginxを使ってサーバーを建てたときの話。
Nginxを後ろに控えているWebサーバー(Apache)のリバースプロキシとして構築していました。

構成としてはサブドメインを割り当てたバーチャルホストが複数稼働している環境だったため、nginx側もバーチャルホストに対応すべく下のような設定にしていました。

 #省略...
 server {
  server_name  .example.com;

  listen          80;
  listen          443 ssl;

  ssl on;
  ssl_certificate      /ssl/to/path/example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
   server {
  server_name  .a.example.com;

  listen          80;
  listen          443 ssl;

  ssl on;
  ssl_certificate      /ssl/to/path/a.example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/a.example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
#省略...<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>

すると..

Bad Requestのエラーが発生。
いろいろ試してもエラーが解消されず頭を抱えていたのですが、調べていたら以下のサイトを発見。

nginx連載6回目: nginxの設定、その4 – TLS/SSLの設定 – インフラエンジニア way
https://heartbeats.jp/hbblog/2012/06/nginx06.html

>sslディレクティブをonに設定すると、SSLが有効になります。ただし、listenディレクティブでsslパラメータを指定したときには不要です。

>ssl on;

>listenディレクティブにsslパラメータを付けると、そのポートでSSLを有効にして待ち受けるようになります。そのポートに関して後述するsslディレクティブをonにしたのと同じ動作になるため、sslディレクティブの記述は不要になります。

>listen 443 ssl;

なるほど、
ssl on;
の記述をしてしまうと
server{}
内で定義されている全ポートにsslが有効になるので、80番ポートでアクセスしてもssl通信と解釈されてしまい、エラーが出ていたようです。
443ポートだけsslにしたい場合は

listen 443 ssl;

とだけ指定しておけば443ポートだけsslを有効にできるようです。
てっきり

“ssl on;”

を入れないとsslが有効にならないものと勘違いしていました(汗

さっきの設定を修正すると以下のようになりました。

 #省略...
 server {
  server_name  .example.com;

  listen          80;
  listen          443 ssl; #これは残しておく

  #ssl on; コメントアウト
  ssl_certificate      /ssl/to/path/example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
   server {
  server_name  .a.example.com;

  listen          80;
  listen          443 ssl; #これは残しておく

  #ssl on; #コメントアウト
  ssl_certificate      /ssl/to/path/a.example.com/fullchain.pem;
  ssl_certificate_key /ssl/to/path/a.example.com/privkey.pem;

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名。クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://xxx.xxx.xxx.xxx;
  }

}
#省略...

これでnginxを再起動したところ、無事80番ポートの平文通信と443ポートのSSL通信両方ともできるようになりました。

Nginxは非常に細かい設定ができるのが人気の理由の一つですが、その分設定の仕方を理解しておかないとハマってしまうことも…

もっと勉強が必要だなぁ、と感じた瞬間でした…

takahashi 著者:takahashi

【使わないと3か月でデータが消える!?】SSDの意外な弱点

高橋です。


引用元:Gigazine

最近安価になりつつあることで普及し始めたSSDですが、以前からHDDと比較して様々な弱点があるといわれていました。
その中でも、一時期特に話題になっていたのが書き換え可能回数の問題。
フラッシュメモリが出てきたときにもよく言われていましたが、NAND型メモリには一定の回数書き換えを行ってしまうと、データが記憶できなくなるという特性があります。
メーカーやものによって耐久度は違ってきますが、同じNAND型メモリを使うSSDもまた、例に漏れずこの制限が存在しています。
ただ最近は、この寿命を伸ばす技術が発達してきていて実用上で心配をしなくても大丈夫になってきたようです。

SSDにデータを書込みまくり再起不能に追い込む耐久試験で分かった信頼性に関する真実とは? – Gigazine
> 余力を十分残しつつもエラー発生の可能性を検知すると、ストップをかけて最も早く脱落したIntel 335でさえ、毎日10GBのデータ書き換えを行っても7万日つまり約190年もつという計算になるため、SSDの書き換え寿命を心配する必要はほとんどないことは確実です。

これでSSDの弱点は目立つところは”HDDと比べて高い”という部分だけになったと考えていたのですが、先日ある事実を知りました。

先にも書いたように、SSDにはNAND型メモリがよく使われているのですが、この前ふと気になってNAND型メモリについてWikipediaで調べていたら、気になる記述を発見しました。

NAND型フラッシュメモリ – Wikipedia
>浮遊ゲート内の電子は、浮遊ゲートを覆う絶縁体により保持されるため、電源を供給することなくデータを数年間程度保持することができる。

お分かりいただけただろうか…

それってつまり、逆に言ってしまうと、”非通電状態では数年間しかデータを保持できない可能性がある。”
ということではないのか…?

気になったのでさらにいろいろ調べてみました。
すると、下記のような説明をしているサイトを発見。

SSDの基礎知識でパソコン購入をガイド – パソ兄さん
> トンネル酸化膜の絶縁によって電子の放出を防いでいますが、長期間書き換え作業が行われないと自然放電が起き、データ化けの原因になります。

と説明されていました。
SSDは電子を放出させないようにすることでデータを保持していますが、長期間通電を行わないとこの電子が放出されてしまい、データが消失してしまうようです。

どれぐらいの期間放置するとデータが消失してしまうのかは議論が分かれるところですが、最小(最も保管条件が悪かった場合など)で”3か月”しかデータが保持できない可能性もあるという話があります。
『中古SSD 無通電時間が長いとデータが消えますか?』 – 価格.com

僕はSSDにこのような特性があったことを恥ずかしながら今回初めて知ったのですが、僕以外にも”SSDは使っていなければ半永久的にデータが保存できる”と、それとなく思っていた方は少なくないのではないかな、と思います。

OSをインストールして使うような使い方であれば、3か月も電源を入れないということは少ないとは思うのですが、データ保存用となるとあり得ない話ではないな…と思いました。
ただ、データ保管用に…と使わないときはSSDを外して保管している方も、中にはいらっしゃるかもしれません。

それ故に、
「大事なデータをバックアップしておいたはずが…なんてこった…」
なんてことになる可能性もゼロではないかもしれませんね。

SSDはあくまで”一時保管用”という意識を頭の片隅に置いておいて、大事なデータは光学ディスクなどのより長持ちするメディアに退避しておくのが一番のようです。
どのメディアにも適材適所があり、用途に合わせて使い分けないといけないんだな、と改めて感じました。

今後SSDを購入予定の方はお気を付けください。

 

※この記事は、以前私が書いたものを一部修正したものです。
takahashi 著者:takahashi

【遂に動き出した5G通信】政府が5Gの新規参入を促進

高橋です。

Twitterモーメントで携帯回線の新通信規格 “5G” が取り上げられていました。


5G(5th Generation=第5世代移動通信システム)とは、4Gに続く現在規格化が進行中の次世代無線通信システムのこと。

第5世代移動通信システム – Wikipedia

4Gのアップグレード版になるので、当然4Gよりも性能が高くなるのですが、その上がり幅が凄い。
なんと理論値10Gbps以上の通信が行えるようになるとのこと。
現在の固定回線のFTTH(光ファイバー)も、大体理論値が1Gbpsぐらいなので、5Gが実稼働すればそれを大きく上回ることになります。
一方で、多接続可能かつ低遅延化と、IoT機器を意識した仕様も取り入れる予定だそうです。

そんな5Gですが、いままでMNO大手3社による寡占状態から脱却するために、政府が5Gに使われる電波帯域の割当制度を見直し、大手3社以外の新規参入を促進しようとしているとのこと。

次世代移動通信「5G」って何? 2020年の暮らしはどう変わる? – 価格.comマガジン

いままでも新しい通信業者を増やして価格競争を生むために、SIMロック解除義務化やMVNOの参入など、いろいろ措置は取られていましたが、携帯回線は飽くまでMNOの通信網をまた貸ししてもらう方法しかなく、根本的な解決になっていませんでした。

一方、今回は基地局が使う電波の割り当てを、現在のMNO以外にも行うかもしれないとのことで、これが実現すればもっと激しい価格競争が生まれて高い通信量が値下げされる可能性も出てきそうです。

5Gは2020年の実用化を目指しているということで、オリンピックが始まる頃には、大容量の通信網でいろいろなことができるようになっているかもしれませんね!

takahashi 著者:takahashi

Internet Explorer でGETが予期しない動作をする

高橋です。

現在開発中のシステムで、サーバー側のプログラム(PHP)へGETで値を渡す処理を書いていたのですが、InternetExplorerで実行すると何故か正常に値が渡せないという現象が発生していました。
他のブラウザでは問題なく動作するので、プログラム側の不具合ではないようなのですが、IEでアクセスする方も少なくないので、解決策を調べてみました。

1.URLが約2083文字を超えるとIEで扱えない

IE11で使用可能なURL文字数が2083文字しかない件 – 文系プログラマによるTIPSブログ
によると、InternetExplorerでは、URLの最長文字列長は2083文字までらしく、それ以上は認識できないとのこと。
GETでパラメーターを複数入れると、URLがどんどん長くなっていってしまうため、あまり渡す値が多い場合は注意が必要かもしれません。

2.Eで2番目以降のGETパラメータが実体参照になり値が取得できない

少し古い記事ですが
IEで2番目以降のGETパラメータが実体参照になり値が取得できないバグ – DevAchieve

によると、GETで渡すパラメーターの1個目と2個目の間にいれる&記号によって、2個目以降の値が実体参照として処理されてしまうことがあるとのこと。

他にもGETで渡したパラメーターの値が文字化けしてしまうケースなど、IEでは予期しない動作をしてしまうことがあるようです。

いろいろ考えた結果、デバッグの際はIE以外のブラウザでURL直打ちで値を渡せるGETを使い、うまく動くことを確認したらPOSTに切り替える方法で運用することにしました。

大抵のフレームワークではメソッドの判定を簡単に行うことができるように関数が用意されています。
例えばfuelでは

if( Input::method() == 'POST' ) {
   //POSTされた場合の処理
}
if( Input::method() == 'GET' ){
  //GETされた場合の処理
}

のように、メソッドに応じて処理を書き分けることもできます。
中の処理を同じものにしておけば、クライアント側の使用するメソッドを切り替えるだけで済むので便利です。

今後はIEを考慮しないWebアプリも増えていきそうですが、現時点ではIEがまだ現役で使われているところも多いかと思います。
他のブラウザとIEの互換性を確保するためには、いろいろ工夫していく必要がありそうです。

takahashi 著者:takahashi

位置情報配信プロトコルのNTRIPをNginxでリバースプロキシする方法

高橋です。

ご存知の方もいらっしゃるかもしれませんが、静岡大学浜松キャンパスに設置された高精度のGNSSアンテナを用いた測位情報を配信するシステム(hamamtsu-gnss.org)が整い、ついに浜松市内でRTK(リアルタイムキネマティック)ができる環境が整いました。

詳しくは
https://hamamatsu-gnss.org/
をご覧いただけましたら幸いです。

ざっくり説明するとRTKを行う際、実際に自分の位置を計測する”移動局(ローバー)”と、厳密な位置情報が既にわかっている場所に置かれた”固定局(ベース)”の2つが必要となってきます。したがって移動局は何らかの方法で固定局の情報を受信し続ける必要があるのですが、その方法として、”インターネット”経由で受信を行う方法があります。
今回開設されたhamamatsu-gnss.org局もインターネット経由で位置情報を配信するタイプの固定局で、配信プロトコルとして”NTRIP”と呼ばれるものを利用しています。

さて、そのhamamatsu-gnss.orgを開設する際に、”大学などでも受信できるように80番ポートで通信できるようにしてほしい。”という話がありました。
大学などの教育機関では、ネットワークに制限を設けているところが多く、80(http)、443(https)あたりの必要最低限のポートしか開けていないところも多くあります。
しかし、hamamatsu-gnss.orgのホームページも同様に80番ポートを使用するので、このままでは両立ができません。

最近はNode.jsやRuby on Railsなどが出回ってきて、同ホストに複数のWebサーバが立つことも少なくはなくなってきているので、今回のように一つのポートを取り合ってしまうような事態も往々にしてあります。こういう場合は”リバースプロキシ”という仕組みを用いることで一つのポートを複数のサーバープログラムで共有することができます。

今回も、まず思いついたのはこの方法だったのですが、今回共有させたいのはNTRIPという得体のしれないプロトコル。
いろいろ調べてみてもNTRIPとHTTPを同時にプロキシできるソフトやプログラムは見つけられませんでした。

どうしよかと困っていたところ、あることが判明。

http://gpspp.sakura.ne.jp/diary200703.htm
こちらのサイトで解説されているようにNTRIPはなんとHTTPベースのプロトコルでした…!(プロジェクトを共同で進めている木谷先生に教えていただきました。)

一応実験としてブラウザからNtip配信のポートに直繋ぎしてみたら、ちゃんとレスポンスが返ってきました。

telnetでも確認しましたが、ちゃんと応答が返ってきます。

しかし、NTRIPがHTTPのデータとして扱うことができるというのであれば話は早い。
上にあげたのと同様にリバースプロキシしてやれば共存させられます。

ということで早速設定。
リバースプロキシには非常に柔軟な設定ができる有能なNginxを使います。
(NginxはWebサーバーでありながらHTTP以外にもimapやpop、さらにはtcp(ドメインベースは不可)のプロキシができたりする、いい意味でかなり変態なソフトです。)

早速設定していきます。
一部省略してますが、以下のような設定にしました。

バーチャルホスト(https)

server {

  listen 443 default_server; #443番にアクセスされた時のデフォルトのバーチャルホストに設定

  ssl on;
  ssl_certificate /path/to/ssl.pem; #SSL証明書のパス
  ssl_certificate_key /path/to/sslkey.pem; #SSL証明書の秘密鍵のパス

  client_max_body_size 1g;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # クライアントの IP アドレス
  proxy_set_header X-Forwarded-Host $host; # オリジナルのホスト名クライアントが Host リクエストヘッダで渡す。
  proxy_set_header X-Forwarded-Server $host; # プロキシサーバのホスト名
  proxy_set_header X-Real-IP $remote_addr;
  location / {
    proxy_pass https://localhost:8081; #プロキシの向き先の設定(https)
  }
}

バーチャルホスト(NTRIP)

server {
    listen 80 default_server; #80番にアクセスされた時のデフォルトのバーチャルホストに設定
    server_name .ntrip.hamamatsu-gnss.org;

        client_max_body_size 1g;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Connection "";

     #伝送を効率化するチューニング
        keepalive_timeout 0; #キープアライブ無効化
        tcp_nodelay on; #パケットを極力まとめて送付するNagleアルゴリズムを無効化
        tcp_nopush off; #関係なさそうだが一応設定
        proxy_buffering off; #バッファリング無効化(重要)
        #効率化設定ここまで
        location / {
                proxy_pass http://localhost:2101; #プロキシの向け先をNTRIPサーバーに設定
        }
}

当環境では今後を考えてhamamatsu-gnss.org:80へのアクセスはhamamatsu-gnss.org:443へリダイレクトさせてますが、80番でWebページを待ち受けることも可能です。

回線の輻輳を防ぐためにある程度データをまとめて送付しようとする機能がNginxにありますが、ストリーミングの場合は遅延につながってしまいます。
チューニングはこの設定の無効化が主となっています。

HTTPに準拠している以上はhostヘッダーにアクセス時のホスト名を含めるルールになっているのですが、一部のNTRIPクライアントでアクセスしたときは何故か判定がうまく行かずにデフォルトのバーチャルホストへつながってしまうことがありました。
Webページの方は最近のブラウザであればデフォルトでなくても問題なくつながるので、80番ポートのデフォルトをNTRIP側に設定してあります。

これで無事NTRIPが一般配信できるようになりました。

今後、RTK-GNSS向けの位置情報の配信サービスを構築予定…という方は是非参考にしていただけましたら幸いです。

hamamatsu-gnss.orgはGPS以外にも複数の測位衛星から受信したデータを配信していて、RTK-GPSよりも高い精度で測位ができます。
全国には他には殆どない設備ですので、是非ご活用いただけましたら嬉しいです。

———————————————————-

位置情報の精度、センチ単位に 静大准教授ら研究 – @S
http://www.at-s.com/news/article/education/college/367429.html

※この記事は、以前私が書いた記事の本文を一部修正したものです
takahashi 著者:takahashi

【コンピューターって何?】 Appleがアピールする”PCのない未来”とは

初めまして。シーポイントラボの高橋です。
これからIT技術やその周辺の話題について、皆さんにご紹介できればと考えています。

よろしくお願いいたします。

さて先日、気になる記事を発見しました。


Photo by カミアプ

「コンピュータって何?」Appleが目指すiPadの未来はPC以上の存在か – カミアプ

iPad Proは文字を書ける。絵も描ける。写真も撮れる。コミックも読める。誰かとコミュニケーションも取れる。
ここまでできて、果たしてこの先の未来にコンピューターは必要なのか?

そんなAppleの主張を感じることができます。

身の回りにある電子機器は、時代が進むごとに形や担う機能が変わってきました。

黒電話からプッシュフォンのような、ただ声のやり取りができるだけだったデバイスから、ガラケー、そしてガラケーからスマートフォン。
そしてつい先日、音声のみで操作ができるデバイス、Google Home と Amazon Echo、Line Clova が発表され、操作に画面すら必要としないデバイスも出てきました。

PCもまた、徐々にデスクトップPCからどこにでも持ち運べるモバイルPCへと、需要がシフトして行っているように思えます。

両社のその行き着く先は、確かに同じところではないでしょうか?

 

僕は開発者なので、正直タブレットより大きな画面としっかりとしたキーボードのあるPCの方が使いやすいですし、個人的にタブレットで長文を書いたり…はあまりしたくないなーというのが正直なところです。
また、iOSよりも現在のデスクトップPC用のOSの方が機能面でも優れているので、まだ取って代われるレベルとまでは言えないのかな、と考えています。

ただ、一方でもしもう少しこれらのデバイスが進化したら…今のPCと同等か、それ以上の使い勝手や機能をそなえたら、もしかすると”PCのない未来”は実際にやってくるのかもしれませんね。

もしかすると動画のように、「コンピューター(パソコン)って何?」と言う子供たちも出てくるかもしれません。

皆さんはどう考えますか?