CentOS7にNginx + Lua のインストール

CentOS7に Nginx + Lua をインストールする機会があったのでメモを備忘録として残しておきます。OpenRestyをインストールしても良かったのですが、ここでは自分でコントロールするということで各ソフトウェアを手動でインストールします。

環境と各ソフトウェアのバージョン

  • インストールする環境と各ソフトウェアのバージョンは以下になります。
    • OS: Cent7.1.1503
    • Nginx: 1.9.5
    • LuaJIT: 2.0.4
    • NDK (Nginx Development Kit): 0.2.19
    • lua-nginx-module: 0.9.16

LuaJIT のインストール

lua-nginx-module を使うためには Lua の実行環境が必要になりますが、ここでは LuaJITをインストールします。インストールパス(PREFIX)として以下では /usr/local/luajit を指定していますが、環境や好みに応じて適宜読み替えてください。また、特に明記しませんが以下でダウンロードしているソフトウェアはすべて tmp ディレクトリに配置しています。

$ mkdir tmp
$ cd tmp
$ curl -O http://luajit.org/download/LuaJIT-2.0.4.tar.gz
$ tar zxvf LuaJIT-2.0.4.tar.gz
$ cd LuaJIT-2.0.4
$ make PREFIX=/usr/local/luajit
$ sudo make install PREFIX=/usr/local/luajit

インストールする環境の状態によっては Clock skew detected という warning が出るかもしれませんが、私の環境では ntp をインストールしてから再度 configure すると直りました。

sudo yum install ntp

NDK のダウンロード

GitHub から tar をダウンロードして解凍します。

$ curl -L https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz -o ngx_devel_kit-v0.2.19.tar.gz
$ tar xzvf ngx_devel_kit-v0.2.19.tar.gz

lua-nginx-module のダウンロード

こちらも GitHub から tar をダウンロードして解凍します。

$ curl -L https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz -o ngx_lua-v0.9.16.tar.gz
$ tar zxvf ngx_lua-v0.9.16.tar.gz

Nginx のインストール

ここから Nginx 本体のインストールが始まります。基本的に lua-nginx-moduleに記載されているインストール手順 と同様です。

必要となるライブラリのインストール

Nginx をインストールする際に私の環境では pcre-develzlib-devel が必要となりましたのでインストールします。

$ sudo yum install pcre-devel
$ sudo yum install zlib-devel

Nginx のダウンロード

Nginxの公式ダウンロードページ から Nginx をダウンロードして解凍しておきます。

$ curl -L -O http://nginx.org/download/nginx-1.9.5.tar.gz
$ tar zxvf nginx-1.9.5.tar.gz
$ cd nginx-1.9.5

環境変数の設定

先にインストールした LuaJIT の場所を示す環境変数を設定します。

$ export LUAJIT_LIB=/usr/local/luajit/lib
$ export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0

Nginx のコンパイルとインストール

configure、make、make install でインストールします。パスは適宜読み替えてください。

$ ./configure --prefix=/opt/nginx \
  --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \
  --add-module=../ngx_devel_kit-0.2.19/ \
  --add-module=../lua-nginx-module-0.9.16/
$ make -j2
$ sudo make install

インストールされたNginxのバージョンを確認します。

$ /opt/nginx/sbin/nginx -V

Nginx のバージョンが表示されればインストールされています。

systemd への登録

systemd に登録しておきます。Nginx のサービスファイルは以下のものを参考に作成しました。

以下のファイルを、/lib/systemd/system/nginx.service に作成します。

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Nginx を enable にし、更に起動します。

$ sudo systemctl enable nginx
$ sudo systemctl start nginx
$ sudo systemctl status nginx

curl でアクセスし動作確認します。200 OK が返ってくれば成功です。

$ curl http://127.0.0.1 -I

Lua の動作確認

このままだとただの Nginx のインストール記事になってしまうので、一応 Lua の部分の動作確認もしておきます。ここでは Hello,world!Lua で HTTP のレスポンスとして返してみます。 設定ファイル (デフォルトだは nginx.conf) の server context 内に以下を追記します。

location /hello {
    content_by_lua "ngx.say('Hello,world!')";
}

Nginx を reload して、curl で動作確認します。

$ sudo sytemctl reload nginx
$ curl http://127.0.0.1/hello
Hello,world!
  • Hello,world! と表示されたので、Lua が動作しているようです。

終わりに

本格的に使う場合には Firewalld の設定をしたり、SSLの終端として使う場合にはコンパイル時に ssl モジュールも追加してあげる必要があります。必要な方は設定&追加してみてください。

YAPC::Asia Tokyo 2015 に参加してきました

「ブログを書くまでがYAPC」ということで、簡単にでもちゃんとブログを書くことで僕の YAPC::Asiaを締めたいと思います。

参加記録

都合により今回は2日目のみの参加となってしまいましたが、それでもとてもおもしろく勉強になるセッションばかりで、気がついたらクロージングというぐらいあっという間の一日でした。個人的には @cubicdaiya さんの Nginx の話は自分の関心にマッチしておりとても参考になりました。

でも一番心に残ったのは、LT の中であった MySQL 5.7 ではユーザパスワードの有効期限がデフォルトでは 360 日で切れるということでした...

YAPC には著名な方が多数参加されていて、「おお、○○さんだ!」と思うことが多いのですが、憧れるばかりでなくちゃんとコードを書いて少しでも力を付けたいと思います^^; YAPC::Asia は今回が最後ということで寂しい気持ちもありますが、ひとつの区切りということで仕方ないのかなと思いました。

@lestrrat さんをはじめとするスタッフの皆様も本当にありがとうございました。そしてお疲れ様でした!!

Arrays.asList と List#removeIf の組み合わせ

Java 8 で Arrays.asList と List#removeIf で少しハマったのでメモを残しておきます。

現象

  • Java8 で以下のようなコードを書くと java.lang.UnsupportedOperationException が投げられます。
  String[] languages = {"Java", "Ruby", "JavaScript", "Haskell", "Perl", "C", "C++", "Perl", "Go"};
  List<String> list = Arrays.asList(languages);
  list.removeIf(lang -> lang.length() <= 5);

調査

結果

  • ということで以下のように書くことにしました
  String[] languages = {"Java", "Ruby", "JavaScript", "Haskell", "Perl", "C", "C++", "Perl", "Go"};
  List<String> list = new ArrayList<>( Arrays.asList(languages) );
  list.removeIf(lang -> lang.length() <= 5);

*1:正確には抽象クラス AbstractList を実装したもので、これの remove が UnsupportedOperationException を投げています

CentOS7 での LANG の設定

背景

CentOS7 をインストールして色々と弄っていると言語が日本語になっていることに気が付き、LANG を en_US.UTF-8に修正したく思いました。しかし、CentOS6 にはあった /etc/sysconfig/i18n のファイルが無く戸惑いました。

方法

CentOS7のlocaleの設定を忘れないようにメモしておきます

  • 設定
 $ localectl set-locale LANG=en_US.utf8
  • 確認
  $ localectl status
  System Locale: LANG=en_US.utf8
      VC Keymap: jp106
     X11 Layout: jp
  • 設定ファイルは /etc/locale.conf で上記の設定コマンドを実行するとこのファイルの中身が書き換わるようです

VirtualBox 上の仮想マシンに CentOS 7 をインストール

CentOS 7 が出て半年近くたち「いつまでも 6 系を使っていたらまずい」と思い、家のPCにインストールした際の過程を記しておきます。

今回は初めての 7 インストール作業ということで、あえて Vagrant などのツールは使わずに素のイメージから VirtualBox 上に仮想マシンを手動でインストールしてみたいと思います。

環境

インストール作業

  1. ISO ファイルのダウンロード
  2. 仮想マシンの作成
    • VirtualBox 上で仮想マシンを作成します。「新規」をクリックし、名前をCentOS7、タイプをLinux、バージョンを Ret Hat として続けるを押します。

      f:id:tatsuyafw:20150119234018p:plain

    • メモリーサイズはひとまず 1024MB とします。

      f:id:tatsuyafw:20150119234337p:plain

    • ハードドライブはデフォルトのまま 仮想ハードドライブを作成する にします

      f:id:tatsuyafw:20150119234446p:plain

    • ファイルタイプもデフォルトのまま VDI (VirtualBox Disk Image) としておきます

      f:id:tatsuyafw:20150119234525p:plain

    • ストレージもデフォルトの可変サイズを選択

      f:id:tatsuyafw:20150119234728p:plain

    • ファイルサイズは少し大きくして 30GB としました 。

      f:id:tatsuyafw:20150119234813p:plain

    • こうすると以下のように仮想マシン一覧のところに作成した CentOS7 が追加されます。

      f:id:tatsuyafw:20150119235012p:plain

  3. 仮想マシンの起動
    • 先ほどダウンロードしたISOファイルをドライブにセットして、仮想マシンを起動します
    • 作成した仮想マシン CentOS7 を右クリックして 設定 を選択します

      f:id:tatsuyafw:20150119235214p:plain

    • ストレージのタブに移動し、コントローラ: IDE の下の をクリックすると以下のような画面になります。そして、右側のメニューの CD アイコンをクリックします

      f:id:tatsuyafw:20150119235637p:plain

    • 「仮想CD/DVDディスクファイルの選択」をクリックして先ほどダウンロードした ISO ファイルを指定して、OKを押します。
    • 最後に仮想マシン一覧から仮想マシンを選択して、 起動を押します

      f:id:tatsuyafw:20150119235952p:plain

CentOSのインストール

  • ここからは CentOS 上でインストール作業を進めます。最初に出てくる画面で Install CentOS 7 を選択した状態で Enter キーを押して先に進みます。
  • あとは、画面の説明にそってインストールを進めると完了します。

ネットワークの設定

終わりに

  • 最近は vagrant から新しいインスタンスを立てることが多かったので、久々にイメージからインストールすると色々と面倒に感じました^^;
    • 特にネットワーク周りやユーザの鍵の設定などが、、、
  • CentOS6 から 7 になり色々とコマンドが変わっていとに戸惑いまだまだなれない状態ですが、これからどんどんいじって早く慣れたいと思います
  • 次は MariaDB でも入れて遊んでみたいと思います

参考

vagrant package で "A directory was not specified to package..." となったときの対応

vagrant package を実行した際に以下のようなエラーメッセージが出たときの対応を書いておきます。version は 1.4.2 でした。

$ vagrant package
[default] Clearing any previously set forwarded ports...
A directory was not specified to package. This should never happen
and is a result of an internal inconsistency.
$ vagrant -v
Vagrant 1.4.2

結論から書くと bug(?) だったようで、vagrant 1.4.3 で修正されていました。

vagrant 自体の upgrade はとても簡単で、初期インストール時と同様でパッケージをダウンロードしてインストールするだけでした。

$ vagrant -v
Vagrant 1.4.3

これでvagrant package も成功しました :-)

$ vagrant package
[default] Clearing any previously set forwarded ports...
[default] Exporting VM...
[default] Compressing package to: ...

"インフラエンジニアの教科書"を読んで

"インフラエンジニアの教科書" を読み終えての感想です。

インフラエンジニアの教科書

インフラエンジニアの教科書

一言で言うとインフラエンジニアに求められるスキル全体を俯瞰的に網羅した本で、「インフラエンジニアはこういうものか」と思わせてくれる本でした。

サーバからOS、ネットワーク機器やストレージなどのわりと技術的な話から、ライセンスや機器の購入、データセンターの選定などの業務的(?)な話までひと通り網羅されています。普段私はサーバやOS、ネットワークの設定などのソフトウェアを中心とする業務を行っており、購買などの技術に直接的には関わらない、でもインフラエンジニアとして必要(?)な知識やスキルを持っていないので、そういう話が面白かったです。

最近は chef や docker、vagrant、openstack などのインフラを構築するため技術に自身の関心が集まっていたので、そこから改めて自分の視点を一歩引いてみる良いきっかけになったと思います。

Linux」や「ネットワーク」「ストレージ」などのそれぞれの技術にフォーカスした本はたくさんあると思いますが、それらを"インフラエンジニアの教科書"として俯瞰的に見ていて、かつ余り深くまで技術的な話はしないというところがとても稀有でかつ面白い本でした。内容もとてもわかり易かったので、まさに"インフラエンジニアの教科書"でした。