astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

Play Framework 2.5で入力チェックしてみる

https://www.playframework.com/assets/images/logos/play_full_color.png

アスタミューゼ 開発部のYanagitaです。

Play Frameworkの記事も3回目になります。
連載的な形で続けているので過去分のリンクを貼っておきます。
Play Frameworkが初めての人や前回の見直しはそちらへ

lab.astamuse.co.jp

lab.astamuse.co.jp

今回は前回予告していた入力チェックについて書きます。

事前準備

今回も前回の延長で説明を行います。
事前準備がまだの方はこちらを参照にして下さい。

それから少しそれますが、Play Frameworkはリリースの周期が早く最新版はv2.5.10(2016/12/08時点)となっています。
なるべく最新のバージョンに合わせて記載したいので、v2.5.10から始める方向けにテンプレートプロジェクトの作成と本記事のための修正を記載しておきます。

※ 今回はGiter8を使用してテンプレートプロジェクトを作成します。

1. 作業環境にsbt(v0.13.13以降)をインストールします。

2. ターミナルで以下のコマンドを実行します。

sbt new playframework/play-scala-seed.g8

この後、プロジェクトの名前(本記事では「sample-app」)、組織名などを聞かれますが、デフォルトのままでも問題ありません。
ここからは本記事のための修正です。

3. Filtersライブラリのコメントアウト
sample-app/sample-app.sbt

libraryDependencies += filters ← 10行目あたり
↓
// libraryDependencies += filters

4. Filtersクラス(sample-app/app/Filters.scala)の削除

削除したのはCSRF(クロスサイトリクエストフォージェリ)対策のフィルターになります。
過去の記事で使用していないため今回無効化しました。

でわでわ、本題の入力チェックに入っていきます。

入力チェック

これまでの記事を試された方は既にお気づきかもしれませんが、 前回説明したマッピングクラスには既に入力チェック機能が含まれています。
今回はこのマッピングクラスの入力チェックをコントロールして、目的に合った入力チェックの実装方法を説明します。
まずは前回作成したフォームに下記の入力チェックをかけてみます。

  • 名前(name) ・・・ 入力必須、かつ、入力文字数を2文字以上
  • 性別(sex) ・・・入力必須のみ
  • 誕生日(birthday) ・・・ 未入力を許容する
  • 身長(height) ・・・ 入力必須、かつ、100以上
  • 血液型(bloodType) ・・・ 入力必須のみ

ソースコードだと以下の通り修正
/sample-app/app/controllers/SampleController.scala

// 入力チェック適用前
val form = Form(
   mapping(
      "name" -> text,
      "sex" -> text,
      "birthday" -> date,
      "height" -> number,
      "bloodType" -> text
   )(RequestForm.apply)(RequestForm.unapply)
  )

// 入力チェック適用後
val form = Form(
   mapping(
      "name" -> nonEmptyText(minLength = 2), // 入力必須、かつ、入力文字数を2文字以上
      "sex" -> nonEmptyText,                               // 入力必須のみ
      "birthday" -> optional(date),                        // 未入力を許容する
      "height" -> number(min = 100),                   // 入力必須、かつ、100以上
      "bloodType" -> nonEmptyText                    //  入力必須のみ
    )(RequestForm.apply)(RequestForm.unapply)

textクラス以外のマッピングはデフォルト入力必須のチェックが入ります。
textクラスは未入力/空文字を許容してしまうため、入力必須にする場合はnonEmptyTextクラスを使用します。(name, sex, bloodTypeの設定を参照)
逆に未入力を許容する場合は、optionalクラスを使って未入力を許容します。(birthdayを参照)
ここでoptionalを使用した場合、マッピング先の変数をOption型に変更が必要となります。

/sample-app/app/forms/RequestForm.scala

// 変更前
case class RequestForm(
                        name: String, // 名前
                        sex: String, // 性別
                        birthday: Date, // 誕生日
                        height: Int, // 身長
                        bloodType: String // 血液型
                      )

// 変更後
case class RequestForm(
                        name: String, // 名前
                        sex: String, // 性別
                        birthday: Option[Date], // 誕生日 ← Date型からOption[Date]型に変更
                        height: Int, // 身長
                        bloodType: String // 血液型
                      )

入力文字数や入力値の条件については各マッピングの引数に宣言します。 例えば、入力文字数を2文字以上とする場合は、引数に「minLength=2」を設定します。(nameを参照)
逆に文字数の上限を設定する場合は、引数に「maxLength = 上限値」を設定します。
入力値の制限についても変数名が変わるだけで設定方法は同じです。

上記の入力チェックであればマッピングの入力チェック機能で実現できます。

ここまで実装できたらエラーメッセージの表示実装に移るケースが多いと思いますが、
今回フォームの表示に使用しているForm template helpersは、エラーメッセージの表示機能も含まれているためテンプレートの修正は不要となります。
が、そのままではエラーメッセージの見分けがつかないので(黒文字表示となるため)input.htmlテンプレートにStyleを追加して、 エラーメッセージを赤色にして目立たせます。

/sample-app/app/views/sample/input.scala.html

    <!-- titleタグの下に追加 -->
    <style>
        dd.error { color: red; }
    </style>

では、早速動作を確認してみましょう。

初期表示
f:id:astamuse:20161209114417p:plain

入力エラー後
f:id:astamuse:20161209114416p:plain

エラーメッセージが確認できましたね。
基本的なチェックであればマッピングクラスの機能で十分ですが、実際開発をしてみるとそれだけでは足りないケースがあります。
例えば、メールアドレスや郵便番号など入力フォーマットが決まっている場合の入力チェックです。 この場合は、マッピングクラスのverifyingメソッドを使用します。 今回は名前の入力チェックに英字のみを許容するよう変更します。

/sample-app/app/controllers/SampleController.scala

// 名前(name)に英字のみチェックの適用前
val form = Form(
   mapping(
      "name" -> nonEmptyText(minLength = 2),
      "sex" -> nonEmptyText,
      "birthday" -> optional(date),
      "height" -> number(min = 100),
      "bloodType" -> nonEmptyText
    )(RequestForm.apply)(RequestForm.unapply)

// 名前(name)に英字のみチェックの適用後
val form = Form(
   mapping(
      "name" -> nonEmptyText(minLength = 2).verifying("Alphabet only", name => "^[a-zA-Z]+$".matches(name)), // ← 入力条件に一致する場合のみTRUEを返す
      "sex" -> nonEmptyText,
      "birthday" -> optional(date),
      "height" -> number(min = 100),
      "bloodType" -> nonEmptyText
    )(RequestForm.apply)(RequestForm.unapply)

では、もう一度動作確認
入力内容
f:id:astamuse:20161209121204p:plain

入力エラー後
f:id:astamuse:20161209121202p:plain

名前に数字が含まれているので入力エラーになりましたね。

という風に、基本的なところはマッピングクラスの入力チェック機能を使用し、特殊なチェックはverifyingメソッドを使用することで多少複雑なチェックもカバーできます。

が、しかし
たまに2つの項目を同時にチェックする相関チェックとよばれる入力チェックも存在します。
これについては次回説明します。 今日はここまで

エンジニア&デザイナーの皆様へ

アスタミューゼではまだまだエンジニア&デザイナーを募集中しています。
すこしでも気になった方は下のバナーから採用情報をご確認下さい!

でわでわ

何がベスト?最新のデザインフローとツール比較

f:id:astamuse:20161206153715p:plain

アスタミューゼデザイン部のMatsumotoです。
今回の投稿は、デザイン部の勉強会で話した内容を、ブログ用にアップデート+加筆した内容になります。 ちなみに弊社開発部とデザイン部では、持ち回りで勉強会を開催しています。(開発部毎週、デザイン部隔週開催。どちらの勉強会にも自由に参加できます。)

テーマは「デザインツール」。
ちょうど9月にAdobe MAX JAPANが開催されたこともあって、XDについて取り上げました。

 目次

Adobe MAX JAPANで学ぶ

Adobe MAX JAPANとは、Adobeのクリエーター向けのカンファレンスで、毎年アメリカで開催されている「MAX」の日本版です。 今年は、本場アメリカでの開催(11月)に先立って、日本では9月に開催されました。アメリカに比べて規模は縮小されますが、7年ぶりの日本開催ということで、かなり盛り上がっていたようです。

ただ、7年前のMAXというのは、デベロッパーのためのカンファレンスという位置付けで、開発関連ツールの発表が主でしたので、そこまでデザイナーやクリエーターのみなさんの注目は浴びていなかった気がします。 7年前のMAX JAPANを知っている方からすると、今回のMAX JAPANはまったく別物に感じたのでは!?

f:id:astamuse:20161129124931p:plain

すごく行きたかったのですが、会社の創立記念祭と同日だったため、残念ながら行けませんでした。 ちなみに弊社の創立日は、2005年9月2日。毎年創立祝いのイベントが行われます!

来年は、日にち被らないといいな・・そして、いつか(来年?)は、アメリカで開催のMAXに行きたい。意外と良心的なツアー価格?30万位(往復航空券+宿泊費+3日間のカンファレンスパス10万位+アドビ本社訪問含む)

では、MAX JAPANの講演内容から、デザイナーの日々の仕事に役立ちそうな内容を、ピックアップして紹介していきます。

Adobe MAX JAPAN講演ビデオアーカイブ 

当日の講演を視聴することができます。(XDに関する講演は下記)

  • 「Creative Cloudワークフロー 手戻りの激減+制作効率の向上」
  • 「アドビ初のUI/UXデザインツール、Adobe XDの使い方とロードマップ」
  • 「プロトタイプで舵を取れ!Adobe XDを使った最強のUI/UXデザイン手法」

f:id:astamuse:20161129150145p:plain

XD猛プッシュな内容です。
そんなわけで、私もこちらの講演に触発されて、XDを使い始めました。

直近の制作環境&ツール導入経緯
* ~7月 - Windowsのみ / Adobeツールのみ
* 8月 - Windows + Mac導入 / Sketch導入 / プロトタイピングツール導入
* 9月 - Windows + Mac / XD試験的導入

半年ほど前から、astamuseのスマホ対応が始まったのに合わせて、会社で使われていなかったMacを使い始めました。(自分の入社時は、MacかWinの選択はできませんでしたが、現在は入社前に自由に選べます!)プロトタイピングツールについては、前回ブログに書きましたので興味がある方はどうぞ。

lab.astamuse.co.jp

Adobeが勧める最新のワークフローとXD

Adobe MAX JAPANの講演の中では、繰り返し「Creative Cloudワークフロー」という言葉がキーワードで使われていました。 制作のすべてを、クラウド上のアドビ製品を使ってシームレスに行うことで、手戻りの激減+制作効率が向上するとという話をされていました。

ポイントとしては、 最新のCreative Cloud、特にCCライブラリーやAdobe Stock(写真ストックサービス)を使っている人は、それ以外のデザイナーより10倍効率向上とのこと。

f:id:astamuse:20161129125408p:plain

Creative Cloud ラーニングとサポート

CCライブラリーというのは、各プロジェクトでデザインの一貫性を保つために共有のカラースキームやフォント、画像、UIパーツを格納しておけるクラウド上のフォルダのようなものです。

CCライブラリー内の写真からカンプを作って、クライアントに見せ、その後必要であれば、その写真やイラストをアプリ内でそのまま購入できる。とっても便利そう。

Adobe Stock(写真ストックサービス)とは、去年アドビが「Fotolia」を買収して始めたサービスです。ある時気づいたら、ふと始まっていてアドビだから高いんだろうなと思って調べてもいませんでしたが・・・月額利用は、Creative Cloud 4,980円/月 とは別に、年間契約でさらに月額写真10点3,480円からという値段設定になっています。

ちなみに弊社でよく使っている写真ストックサービスの値段と比べてみると、そこまで高くない価格設定なので導入してもいいかも。(ちなみに弊社では、Adobe Stockをすでに導入しているプロジェクトチームもあります。)

次に、実際の講演の中で、カンプ作成から印刷・WEB制作までのワークフローを実演披露していましたので、その流れを下記で簡単に紹介していきます。

1:Adobe Comp使ってカンプをつくる

f:id:astamuse:20161130173848p:plain

Adobe Compとは、タブレット上でデザインカンプが作れる、タブレット用のアプリ。
なんか使いづらそうと思ったのですが、はじめからタブレット向けとして本格的に開発されたということで、かなり感覚的に操作がおこなえそう。

PCに向かう必要がないので、MTGや電車の中でのちょっとした場面でパッと作業ができるところもポイントです。

ダミー画像などは、Adobe stockから選んでラフカンプをサクサクと作っていました。 この時点で、写真を使って具体的に作成して共有できるので、クライアントも含め、理解度が高く、手戻りが少ないという話をされていました。

2:Adobe Illustrator にて印刷データを作成

カンプ作成後は、チラシの作成にうつります。 見た目を整えるために、CCライブラリーに事前においてある共有デザインスタイルを使って、カラーやロゴデータなどをカンプに反映。共有のデザインスタイルを使用しているので、すでにこの時点で最終のイメージに近いカンプができていました。

3:Adobe Photoshopで写真データを購入&加工

Adobe stockの写真は、IllustratorやPhotoshopのアプリ内で写真が購入できて、購入前に加工したフィルタ等も同時に反映されます。このフローも制作効率が向上するポイント。

4:Adobe Photoshopでフォントを検索

今まで知らなかった新機能がこちらでは紹介されていました。 今年6月のアップデートで追加されたPhotoshopの画像からフォントを検索できるという新機能「マッチフォント」。

f:id:astamuse:20161130174906p:plain

”ふと目にしたポスターや雑誌、パッケージなどのタイポグラフィからインスピレーションを受けて、こんな感じのフォントを使ってみたい、と思うことはありませんか。そんな時は「マッチフォント」が便利です。Photoshopが画像内の文字から似た欧文フォントを探してくれます。お使いのPCにフォントがあまり入っていなかったとしても大丈夫。数多くのフォントを提供するTypekitからも似ているフォントを検索して、すぐに利用することができるのです。- Adobe 公式サイトより”

このシチュエーションよくある!これは便利!

5:Illustratorで書き出し

Webデザインでは、ほとんどIllustratorは使っていなかったのですが、知らぬまに便利な機能がたくさん増えていました。 オブジェクトをドラッグ&ドロップで簡単に書き出せます。Web・アプリデザイン用アセットの書き出し機能(今年6月にアップデートされた機能) Webデザイン対応への期待が高まるIllustratorは、今後のアップデートも要チェックかなと思いました。

6:XDにてプロトタイプ作成

ここでようやくXDの登場。画面遷移+動きを作っていきます。 ワイヤーフレーム作成もできちゃいます。パワポより断然見やすいのでいいかも。(※他のプロトタイピングツールでもカンプ作成できるものもあります。)

8:XDにて写真・テキストも簡単に自動配置

テキストファイルをデザインに直接ドラッグ&ドロップする読み込み機能自動でマスク処理される画像の配置機能、繰り返しアイテムを簡単デザインできるRepeat Gridなど他のアプリにはないとっても便利な機能満載。面倒な作業が自動化されて、今まで以上に作業時間が短縮されそうです。 やっぱりAdobeは最強かも。 この後は、DreamWeaverにて実装の説明でしたが、ここでは割愛します。

XDを他ツールと比較

使う前は、Sketch のようなUIをデザインするソフトかと思っていましたが、XDは、UIデザイン機能とプロトタイピングツールが合体したソフト。タブ切り替えで、デザインとプロトタイプが一瞬で切り替わり、作業できます。UIデザインとプロトタイピングが一つのアプリ内でできるのが最大の特長かと。

とういう事で、UIデザイン機能単体で比べるなら・・・ XD vs sketch?
プロトタイピング機能単体で比べるなら・・・ XD vs プロトタイピングツール? (※現在はかなりたくさんのプロトタイピングツールがありますが、ここでの比較は私が実際使ったことのあるツールで比較しておりますので、ご了承ください)

XD vs Sketch

f:id:astamuse:20161206113909p:plain

XD利点

前項でも触れましたが、Sketchにはない面倒くさい作業を自動化してくれる機能が満載。

  • テキストファイルをデザインに直接ドラッグ&ドロップする読み込み機能
  • 自動でマスク処理される画像の配置機能
  • リピートグリッド機能(同じパーツを繰り返し自動的に生成してくれる機能)

XD難点

  • XDに一番期待していたのは、Photoshop/Illustratorの連携。同じAdobe製品なのに互換性がないのは残念すぎる。Sketchを使ってても一番欲しいと思った機能
  • psdやaiファイルで保存できない (psd/aiで書き出してブラッシュアップしたい。この連携機能は早々に追加してほしい)
  • 単独でデザインを完成させるのは難しい(Photoshop/Illustratorありきでデザインする設計)
  • パス・シェイプの編集が困難(Illustratorまかせ?)

9月の勉強会の時点では、まだまだSketch>XDでしたが、11月のアップデートで同等レベルまでXDが追い付いてきました。弊社でも実作業で、XDを導入する可能性は近いかもしれません。(あとはWindowsバージョンを待つのみ?)

XD vs プロトタイピングツール

f:id:astamuse:20161206113925p:plain

XD利点

  • プレビュー時に画面操作を録画できる

XD難点

  • シェアされたプロトタイプにコメントを書き込むには、AdobeIDへログインが必要(フィードバック機能)
  • プロトタイプを修正する度に、共有リンクを作り直す必要がある
  • ヘッダー&フッターの固定設定ができない
  • 画面の操作性がいまいち

プロトタイピングについては、いま使っているツール(Prott/Marvel/Invision)の方に軍配が上がるかなという印象です。

今後のXDアップデート予定

今年3月にプレビュー版がリリースされてから、毎月アップデートされてきたXDですが、先月ついに、ベータ版がリリースされました。 ユーザーのリクエストを元に機能追加を検討しているため、ユーザーのフィードバックが反映されやすく、色々あったらいいのにと思っていた機能が11月のアップデートですべて実装されていました。

さすがAdobe。今後のアップデートにも期待できます。ただ、色々機能つけすぎて重くならないでほしいなと・・。

そして、来たる12月のアップデートで注目すべきは、Windows版の対応でしょうか!
Adobeとのお付き合いは、なんとなんと今年で、18年目ですが、こんなにもAdobeのアップデートを心待ちにしているのはいつ振りだろう・・。楽しみ!

世の中のデザイナーたちの状況

今後の動きで気になっているのは、実際にどのくらいの企業でXDを導入していくのか?ということです。まだベータ版なので導入している企業は少数だと思いますが、みなさん、今使っているSketch、プロトタイピングツールをXDに切り替えていくのか気になるところです。

ちなみに、現在Wantedly内で掲載しているデザイナーの求人募集要項をチェックしてみました。「XD」で検索をかけてみると、12月現在時点:3件。一方、「Sketch」は、151件も!

XDが正式リリースした後は、どうなっていくんだろう・・・。 今後は、XDがデザイナーの必須ツールとなりえるのか、しばらくウォッチしつづけないとと思っています。

まとめ

で、何が最適なツールなのか?
先月のXDマンスリーアップデートによって、最終的には、Sketch+プロトタイピングツールから、XDに乗り換えていく可能性がだいぶ高まってきました。 他Adobe製品との互換性次第ではありますが、やっぱりまたAdobeに戻っていくのかな。

ただ、Sketchや他のプロトタイピングツールも素晴らしく便利なツールで、ようやく使い慣れて快適になってきたのでしばらくは使い続けたい。こちらのさらなるバージョンアップにも、期待したいなと思います。しばらくウォッチしながら、自分のベストな方法を模索していこうと思います。

参考サイト

nginx + ngx_mruby でSSL証明書の動的読み込みを実現して、作業がとても楽になった話

こんにちは。並河(@namikawa)です。

随分と寒くなってきたんで、そろそろ銀座界隈のオススメのラーメン屋の紹介でもしようと思・・・うわなにをするやめくぁwせdrftgyふじこlp;

・・・はい。今日は、ちょっと前にやった nginx + ngx_mrubySSL証明書の動的読み込みを実現して、作業がとっても楽になったワンって話をしようと思います。

前提の話

弊社では、転職ナビという400近く存在する多くのドメインを持つサイトがあり、そのSSL処理をフロントの nginx で行なっています。

過去、そのバーチャルホストの設定がドメインごとにベタ書きされていた経緯があり、その辺の共通化・書き直しを少しずつやっていて、正規表現や環境変数を駆使することで、随分と設定は共通化できたりするのですが、どうにもならなかったのがSSL証明書の設定である、

  • ssl_certificate
  • ssl_certificate_key

の2項目です。色々とドキュメントを読んだのですが、これらの設定値には変数が使えないんですよね。 さて、どうしたものか。と色々と調べていたら、

どうやら、この2つのいずれかのモジュールを組み込むことで、動的に設定値を生成できるらしいということを知りました。

個人的には、Ruby の方が近しい存在ではあるので、ちょっと ngx_mruby を使って、動きを試してみました。

ngx_mruby モジュールを組み込んだ nginx パッケージを作る

弊社では、サーバのOS・ディストリビューションに Ubuntu を使っているので、 それ用の nginx パッケージを作成します。パッケージの作成については、以下の手順で行いました。

(尚、8月初旬にやった作業なので、バージョン関連の記載が古いと思うので、お試しの際は現行のバージョンにあわせてくださいませ。)

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

# cat /proc/version
Linux version 4.4.0-31-generic (buildd@lgw01-16) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) ) #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016

ちなみに、動作を確認した環境は上記な感じのサーバとなります。

# apt-get update
# apt-get install git build-essential devscripts ruby rake bison libssl-dev libxslt-dev libgd-dev libgeoip-dev libperl-dev

まずは、パッケージDBをアップデートして、必要なパッケージをインストールします。

# wget -qO - http://nginx.org/keys/nginx_signing.key | apt-key add -
# echo 'deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx' >> /etc/apt/sources.list
# echo 'deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx' >> /etc/apt/sources.list

nginx 公式のリポジトリを追加。

# apt-get update

# cd /usr/local/src
# apt-get build-dep -y nginx="1.11.3"
# apt-get source nginx="1.11.3"

パッケージビルドを行うための準備と、source パッケージを持ってきます。

# git clone --branch v1.18.2 --depth 1 https://github.com/matsumoto-r/ngx_mruby.git

# cd /usr/local/src/ngx_mruby
# ./configure --with-ngx-src-root=/usr/local/src/nginx-1.11.3
# make build_mruby
# make generate_gems_config

ngx_mruby を git リポジトリから持ってきて、ビルドします。

# cd /usr/local/src/nginx-1.11.3
# vim debian/rules

nginx のディレクトリに移り、vim 等で rules ファイルを編集します。

--add-module=/usr/local/src/ngx_mruby \
--add-module=/usr/local/src/ngx_mruby/dependence/ngx_devel_kit \

ファイルを開いて、 COMMON_CONFIGURE_ARGS の部分に上記の2行を追記します。

# dpkg-buildpackage -r -uc -b

ここまでで準備は完了。で、パッケージビルドします。

# ll /usr/local/src/*.deb
-rw-r--r-- 1 root root  1222032 Aug  2 09:22 /usr/local/src/nginx_1.11.3-1~xenial_amd64.deb
-rw-r--r-- 1 root root 11912660 Aug  2 09:22 /usr/local/src/nginx-dbg_1.11.3-1~xenial_amd64.deb
-rw-r--r-- 1 root root    11620 Aug  2 09:22 /usr/local/src/nginx-module-geoip_1.11.3-1~xenial_amd64.deb
-rw-r--r-- 1 root root    14988 Aug  2 09:22 /usr/local/src/nginx-module-image-filter_1.11.3-1~xenial_amd64.deb
-rw-r--r-- 1 root root    91038 Aug  2 09:22 /usr/local/src/nginx-module-njs_1.11.3.0.1.0-1~xenial_amd64.deb
-rw-r--r-- 1 root root    24314 Aug  2 09:22 /usr/local/src/nginx-module-perl_1.11.3-1~xenial_amd64.deb
-rw-r--r-- 1 root root    13162 Aug  2 09:22 /usr/local/src/nginx-module-xslt_1.11.3-1~xenial_amd64.deb

はい、 nginx のパッケージ(.debファイル)が完成しました。

余談ですが、この ngx_mruby では openssl 1.0.2 以上が必要になるので、Ubuntu 16.04 以前では、別途 openssl 1.0.2 以上のインストールが必要になります。

パッケージインストール&設定

# deb -i /usr/local/src/nginx_1.11.3-1~xenial_amd64.deb

サクッとインストールしてしまった後は、 "/etc/nginx.conf" や "/etc/nginx/sites-*" あたりの設定ファイルの server ディレクティブに、

ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;

mruby_ssl_handshake_handler_code '
    ssl = Nginx::SSL.new
    ssl.certificate     = "/etc/nginx/ssl/#{ssl.servername}/#{ssl.servername}.crt"
    ssl.certificate_key = "/etc/nginx/ssl/#{ssl.servername}/#{ssl.servername}.key"
';

こんな感じで記載します。 SSL証明書を読み込む際に、mrubyがフックされるような仕組みなので、 ssl_certificatessl_certificate_key のファイルについては何でもOKです。 上記設定を記載後に、 nginx を起動(or 再起動)するだけで、動作確認できるかと思います。

もし何か問題があれば、 nginx のログを確認しましょう。よくあるというか私もひっかかったのは、SSL証明書のパーミッションの問題です。SSL証明書ファイルは、 nginx プロセスからでも読めるパーミッションにする必要があります。

実際に運用してみて

めちゃくちゃ作業が楽になりました。

実際にサイト(ドメイン)追加の際、他の設定は共通化しているので、SSL証明書を配置するだけです。CMS的な似たような(設定が同様な)ドメイン・サイトの運用をするユースケースでは、すごく有用だと思います。

今年の9月くらいから、3ヶ月ほど本番環境で運用していますが、特に大きな問題は出ておらず、安定して動いています。

作者の matsumotory さんの資料によると、「性能はngx_mrubyのhello worldベンチで10%減程度」とのことなので、ここが許容できる場合は、かなり良いモジュールですね。

今日はここまで。それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́

Copyright © astamuse company, ltd. all rights reserved.