カテゴリー
Mojolicious perl

mojoliciousをNginxの後ろで動かす時にHTTPSを検知するには

MojoliciousでHTTP(S)の振り分けをリバースプロキシのバックエンドでも出来るようにしてみる
が、さいきんのバーションでは変更があったらしくmojoliciousをばーじょんあっぷしたらうごかない。

こちらのGistが参考になる。
「MojoliciousでHTTP(S)の振り分けをリバースプロキシのバックエンドでも出来るようにしてみる」の例(Apache + mod_proxy)

抜粋すると、

proxy_set_header X-Forwarded-HTTPS
ではなく、

proxy_set_header X-Forwarded-Proto $scheme;
がひつよう(になったらしい)

追記リンク:
MojoliciousのリバースプロキシのSSLの検知方法が変わります - サンプルコードによるPerl入門

カテゴリー
perl 勉強会

YAPC::Asia 2014に行ってきたよ!2日目

2日目も参加しました!

聞いた、参加したトーク&イベント

  • オープンソースの開発現場 - Perl 5.20 のSubroutine Signaturesが来るまでの奮闘の軌跡
  • 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
  • 地域.pmミートアップ 2014
  • Perlあるある
  • Mobile Application Development for Perl Mongers
  • そんなにビッグでもないデータ処理手法の話
  • Lightning Talks Day 2
  • キーノート

メインホール中心に意外とたくさん聞きました。多目的教室開催のトークも聞きたかったけど、あまり広くない(と言ってもキャパ100人程あるらしい)ので人で溢れかえっていて入れないので諦めました。

メインホール電源完備&簡易テーブルあって居心地が良くて...。

ベストトーク賞

今年のYAPC::AsiaではPerlのイベントなのにベストトーク賞はなんとPHPの話!

@uzullaさんの「半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情」でした!最近のモダンなPHP話に加え、PHPの闇話を勢いのあるトークで面白く聞かせて頂きました。

はい

I♡PHP の@uzullaさんおめでとうございました!

貸し切りHub&フリードリンク1000杯!

会場の慶應義塾日吉キャンパス内には一般の方も利用できる「Hub」という英国風パブがあるのですが、YAPC開催の2日間、夕方〜closeまで貸し切りで懇親の場となっていました。

三島.pmの@dokechin氏とご一緒させて頂きました。印象的だったのはDBIx::Classのメインメンテナ @ribasushi氏を囲んでの英会話&筆談。ボク自身は英語全くダメなのでふいんき味わうだけでしたが、英語でコミュニケーションとれるって素晴らしいと思いつつ羨ましく思いました!

祝2日連続飲みきり!

Hub

感想

無限コーヒーとか無限かき氷とか有限Redbullとかもう至れり尽くせりで会場のネットワークは最高に良くて、何一つ不自由する事なかったですね。スタッフの皆様&スポンサーに感謝!個人的に刺さってるのはRelocatable-Perlかな。近いうちに何か試してみよう。

ここ最近停滞していた作る気持ちを昂らせてくれたYAPC::Asiaに感謝です!

YAPC::Asia

カテゴリー
perl 勉強会

YAPC::Asia 2014に行ってきたよ!1日目

トーク

ライブコーディング 2014 (60 分)

@songmuさんによるライブコーディング。Amon2で作るwebアプリ「Ya」

はて?どこかで聞いたことがあるようなないようなw

限られた時間の中で喋りながらコーディングするのは想像以上のプレッシャーなんだろうなー。
Twitterで同じ文言をmentionするとrejectされるとの事で、対策として半角スペースを使っていました。

Ya http://ya.songmu.jp

Mojoliciousを使ったwebアプリケーション開発 実践編
  • YAPC::Asiaの公式サイトはmojolicious製
    • YAPC::Asiaの公式サイトのソースがgithubにある。
  • daemonttolsでプロセスの死活監視
    • 自分の場合は管理しているサーバがCentos6になったのでUpStartを使っている

真夏の夜空にLT10連発

Lightning Talks Day 1 - YAPC::Asia Tokyo 2014

YAPC名物という事で会場はぎゅうぎゅう詰め。中でも気になったLTがRelocatable-Perlの話。

Perlを-Duserelocatableincオプションを付けてコンパイルすると、出来上がったバイナリをどこに移動させても実行可能になるというものらしい。

Perl製アプリをバイナリ込みで配布したり、組み込み系でPerl使ったり、色々用途がありそうです。

ランチセッション

スポンサーのDeNA様提供のお弁当を頂きました!QuizNowの話を聞きながらのセッションでした。

お弁当

無限コーヒー・無限かき氷

飲食可能なイベントホールではコーヒー等の飲み物が無限で用意してあったり、DMMさん提供の無限かき氷が用意されていました。真夏の開催ということでかき氷は最高!となりそうなのですが、あいにくの気候でしたね...。

DMMかき氷

Perlのエロ本も購入!弾さんもいい本って言ってました。そうそう、テーブルが弾さんと一緒でした。

雅なPerl入門

カテゴリー
Mojolicious

[Perl] MojoliciousでHTTP(S)の振り分けをリバースプロキシのバックエンドでも出来るようにしてみる

追記(解決編)

という事で、検証して頂きまして、うまくいかない原因が判明しました。以下のgistが最高に参考になります。@hayajo++

素晴らしいgist

以下原文


SSL専用のページとどちらでもいいページとSSLでアクセスして欲しくないページをrouterのところで出来れば楽だと考えて、試行錯誤してみたけどなかなかうまく行きません。

以前の記事

結論から言うとHTTP -> HTTPSの場合はなんとかうまくいきます。が、HTTPS -> HTTPの場合はどうしてもうまくいかない。

redirect_toメソッドでリダイレクトする場合、同ホスト・同じpathに限りLocationヘッダに設定されるURLがなぜかhttpsとなってしまう = リダイレクトが無限ループする。...なぜだ??

なので、mataタグを使ったリダイレクトでその場しのぎをしてみます。

Nginxの設定

proxy_set_header X-Forwarded-HTTPS を使えばいいのではとコメント頂いて助かりました。ただ、proxy_set_header X-Forwarded-HTTPS 1(on);とかだと常にHTTPSの通信と伝えられてしまうみたいなので、

  location / {
          if ($scheme = "https"){
              set $mode "on";
          }
          proxy_set_header X-Forwarded-HTTPS $mode;
  }

のように条件式を入れて使っています。

リダイレクト用 テンプレートを用意する

HTTPS -> HTTP にリダイレクトする場合にどうしてもうまくいかないのでリダイレクト用のテンプレートを使います。

<head>
  <meta http-equiv="refresh" content="0;url=<%= $self->req->url->to_abs->scheme('http') %>">
</head>

mojolicious

sub startup {
  $self = shift;
....

  # Routes
  my $routes = $self->routes;

  # SSL onry
  my $ssl_rotes = $routes->under(
    sub{
      my $self = shift;
      return 1 if $self->req->is_secure;
      $self->redirect_to($self->req->url->to_abs->scheme('https'));
    }
  );

  # http onry
  my $not_ssl_routes = $routes->under(
    sub{
      my $self = shift;
      return 1 if !$self->req->is_secure;
      # $self->redirect_to($self->req->url->to_abs->scheme('http')); # これだとリダイレクトが無限ループする
      $self->render(template =>'redirect');
    }
  );

  # SSL onry route
  $ssl_rotes->route('/login')->to('login#index');
  $ssl_rotes->route('/join')->to('join#index');

  # not SSL routes
  $not_ssl_routes->route('/')->to('top#index');
  $not_ssl_routes->route('/entry/:id', id => qr/\d+/)->to('entry#index', id => 1 );

  # Any Routes
  $routes->route('/:controller')->to(action => 'index');
  $routes->route('/:controller/:action')->to();
  $routes->route('/:controller/:action/:id')->to();
}

なんかイマイチ納得行かないけれど妥協。

おまけ

確認方法

opensslを使ってコマンドラインで確認してみるとLocationヘッダがhttpsになっているのが確認できる。

$ openssl s_client -connect localhost:443
...
    Start Time: 1383817749
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
GET / HTTP/1.1
Host:local

HTTP/1.1 302 Found
Server: nginx/1.4.3
Date: Thu, 07 Nov 2013 09:49:29 GMT
Content-Length: 0
Location: https://local/
Connection: keep-alive
カテゴリー
perl

perlでirbしたいと思ったら出来るみたい

前にRubyの勉強会に参加した時に irb を教えてもらって、便利だったのでPerlでも同じようなことが出来ないかググったら出来るみたい。

Perl5 で REPL(Read-Eval-Print-Loop)をつかいたければ、perl -de 1 をつかえばいい。

  DB<1> $x = 1;
  DB<2> print $x;
1

ただしレキシカルスコープが保存されないとの事。

my $x = 1;
print $x;

が正しく動作しない。

で、解決法として Eval::WithLexicals が紹介されている。付属の tinyrepl コマンドを使えばレキシカルスコープが使える。その代わりにグローバル変数を使うと怒られる。

$ tinyrepl
re.pl$ $x = 1;
"Error!"
"Global symbol \"\$x\" requires explicit package name at (eval) line 1, <FIN> line 1.\nBEGIN not safe after errors--compilation aborted at (eval) line 3, <FIN> line 1.\n"

コマンドラインでちょっとコードを試したい時とかに使うくらいなので、レキシカルスコープとか要らないかな。で、面倒なので ipl コマンドで perl -de 1 が使えるようにしておく。Pathが通っている場所に

$ vi ipl

#!/bin/sh
perl -de 1

$ chmod +x ipl

ってコマンド作っておく。

すぐに追記: postしたらすぐに教えて頂いた。最近ではreplyっていうのがおすすめらしい。

perlのREPL近状 - やわらかコード

なるほどググると情報ありますね。あとで試してみよう。