ubuntu15.10にnginx + Perl環境を構築(plenv+cpanm+carton)

VirtualBoxへのインストール前に、[設定]→[ネットワーク]の項目で

  • アダプタ1:NAT
  • アダプタ2:ホストオンリーアダプター

に設定しています。

インストール時、OpenSSHだけインストールにチェックを入れています。

インストール後、systemd-networkdで

  • アダプタ1(enp0s3)
  • アダプタ2(enp0s8)

DHCPでアドレスを割り当てます。

$ sudo systemctl enable systemd-resolved.service
$ sudo mv /etc/resolv.conf{,.orig}
$ sudo mkdir /run/systemd/resolve
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
$ sudo touch /etc/systemd/network/dhcp.network
$ sudo vi /etc/systemd/network/dhcp.network
[Match]
Name=enp*

[Network]
DHCP=yes

(再起動したらsudo systemctl restart systemd-networkdをしないといけない、要調査)

/* 追記

再起動後にもenp0s8にDHCPでIPを割り当てるためには、

dhclientを止めて、systemd-resolvedとsystemd-networkdを有効にします。

$ sudo systemctl status | grep -2 dhc

ifup@enp0s3.serviceというサービスが見つかるので無効にします。

$ sudo systemctl disable ifup@enp0s3.service
$ sudo systemctl enable systemd-resolved.service
$ sudo systemctl enable systemd-networkd.service
$ sudo reboot

以上で再起動後、2つのネットワークアダプタにIPが割り振られます。

追記ここまで*/

Windowsからsshクライアントを使ってログイン(Cygwin)

(enp0s8に192.168.56.101が割り当てられているものとします)

$ ssh username@192.168.56.101
  • gitのセットアップ

ubuntu 15.10 serverではgitが最初から入っていたので、

git configでユーザー名などを登録します。

(もし無ければapt-get install gitをしてください)

$ git config --global user.name "YOURNAME"
$ git config --global user.email youraddress@example.com
//以下必要に応じて
$ git config --global url."https://".insteadOf "git://"
$ git config --global http.proxy "http://proxy.example.com:8080/"
$ git config --global https.proxy "http://proxy.example.com:8080/"
  • plenvのインストール

https://github.com/tokuhirom/plenv#installation

plenvのGithubページに書いてあるインストール方法に従います。

plenv installするときに、makeやらgccやらが必要になるので、build-essentialで一気に入れてしまいます。

$ sudo apt-get install -y build-essential

注意書きにもありますが、ubuntuは~/.profileに記述するという点に注意しましょう。

$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv
$ echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(plenv init -)"' >> ~/.profile
$ exec $SHELL -l
$ git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/

ここでは5.20.2をインストールします。

$ plenv install 5.20.2
$ plenv global 5.20.2
$ plenv versions
$ plenv rehash
  • cpanmをインストール
$ curl -L https://cpanmin.us | perl - App::cpanminus
$ plenv rehash
  • cartonをインストールします。

CartonはRubyでいうBundlerに相当します。

$ cpanm --local-lib=~/perl5 local::lib
$ cpanm Carton
$ plenv rehash
$ mkdir psgi && cd psgi
$ echo "requires 'Task::Plack';" >> cpanfile
$ carton install

ここで試しにhello.psgiを作成します。

$ vi hello.psgi
#!/usr/bin/env perl

use strict;
use warnings;

my $app = sub {
  my $env = shift;
  # アプリケーションの処理
  return [200,
    ['Content-Type'=>'text/plain'],
    ["Hello World\n"]
  ];
};
$ carton exec plackup hello.psgi

ホスト側(Windows)のブラウザでhttp://192.168.56.101:5000にアクセスして、Hello worldが返ってくることを確認します。Ctrl-Cで終了します。

  • nginxをリバースプロキシにする

普通にaptで入れます

$ sudo apt-get install -y nginx-full
$ sudo cp -p /etc/nginx/nginx.conf{,.orig}
$ sudo pkill nginx

nginx.confは

http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Nginx

などを参考に記述します。

$ sudo vi /etc/nginx/nginx.conf

http {
...

  upstream myapp {
    server 127.0.0.1:5000;
  }
  server {
    listen 8080;
    server_name localhost;
    location / {
      proxy_pass http://localhost:5000;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
  }

...
}

nginxを再度起動し、PSGIサーバ(ここではPlack)を起動します

$ sudo nginx
$ carton exec plackup hello.psgi

再びホスト側ブラウザから、http://192.168.56.101:8080/ にアクセスし、Hello worldが表示されたら完了です。

  • 補足

一通りの流れを忘れないうちに書きましたが、記事を書きながら動作確認を行っていたので、不正確な点があるかもしれません。

(というか全体的に理解が足りてないので不正確な点が多々ある気がします...)

  • 参考

ゆきろぐ: systemd-networkdでのネットワーク設定

第24回 PSGI/Plack実践入門―Starman,Starlet,Twiggy,Plack::Middleware,Server::Starter(1):Perl Hackers Hub|gihyo.jp … 技術評論社

PSGI/Plack - Perl Superglue for Web Frameworks and Web Servers