Raspberry Pi で 最新の Nginx (1.13) を使う

Raspberry Pi の Raspbian (debian系) で apt-get すると、Nginx は結構古いやつが入る。 やっぱり新しいのが使いたいと思って試したことをまとめる。

今回は結構 experimental なネタなので、at your own risk でお願いします。
初心者向けではないです。

あと、タイトルは Raspberry Pi だけど、一般の Debian / Ubuntu でも使えるネタだと思います。 (未検証ですが)

作業時間は、3B で 2時間くらいか。 片手間で十分だけど、時間を確保してください。 3B以外の機種では。。。結構な忍耐が必要そうです。。。クロスビルドを検討しましょう。

HTTP/2 も使いたいので、TLSのための openssl の新しいバージョンを使う。
システムワイドの openssl をアップデートするのはリスクがあるので、
nginxに内包して、ここだけで使用するように、ビルドする。

今回は、debian の deb のソースリポジトリから取得したソースをビルドするけど、一旦古いやつをaptで入れて `nginx -V` で表示されたオプションを、configure に指定するという方法でも割といける。

準備
なんにもビルドしたことがない環境の人は。。。


sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install git

など。。。

後々、必要に応じて、ビルドに必要なライブラリをインストールする必要があるかもしれない。
ビルド中に `error: libなんとか` や `warning: libなんとか` と出たら、
`sudo apt-get install libなんとか`
とか
`sudo apt-get install libなんとか-dev`
とやってみる(いい加減..)。

ソースの取得


pwd
/home/pi

mkdir nginx-latest
cd nginx-latest
git clone https://anonscm.debian.org/cgit/pkg-nginx/nginx.git

ちなみに、このリポジトリのパスは `apt-get source nginx` したら、
こっちから取りな。と出てきたパス。 `apt-get source nginx` だと、
1.10 あたりが落ちてくる。

ビルドにオリジナルのソースが必要で、かつ、別名で参照されているので


wget https://nginx.org/download/nginx-1.13.3.tar.gz
ln -s nginx-1.13.3.tar.gz nginx_1.13.3.orig.tar.gz

(ハイフンがアンダースコアになっているので注意)

openssl のソースを取得、展開


wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
tar xzvf openssl-1.1.0f.tar.gz

ビルドオプションの調整


cd nginx
vi debian/rules

configure の オプションを指定する箇所
`common_configure_flags := \ `(の後の72行目くらい)
があるので、そこに


--with-thread \
--with-openssl=/home/pi/nginx-latest/openssl-1.1.0f \
--with-openssl-opt=-fPIC

を追加。 もともとある `–with-thread` の後にバックスラッシュ付加。
お好みで makeに -j3 オプションを追加。

ビルドコマンド


dpkg-buildpackage -us -uc

エラーが出たら、パスを確認したり、最初のライブラリインストールを試す。
`dpkg-buildpackage`を使うと、また最初の clean, configure からになってしまうので、
参照URLにある、ビルドコマンドを活用すると多少時間短縮できる。
無理そうだったら、スパッと諦めて、また、体力のある時にリトライするのもいい。

ビルドが終わったら、


cd debian/nginx-full/usr/sbin
./nginx -v
./nginx -V

でビルドできたか確認する。


nginx version: nginx/1.13.3
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled

(ドットスラッシュ無しの現行nginxとの比較もしてみよう)

設定ファイルなどのバックアップを取って、


cd ~/nginx-latest

sudo dpkg -i libnginx*.deb
sudo dpkg -i nginx-common_1.13.3-1_all.deb
sudo dpkg -i nginx-doc_1.13.3-1_all.deb
sudo dpkg -i nginx-full_1.13.3-1_all.deb

これで完了。

HTTP/2 を試したいときは、SSL(TLS) が必須なので、HTTPS の設定をしよう。
多分、HTTPS の設定をすれば、勝手になる。
Chromeの機能拡張 HTTP/2 and SPDY indicator というのを使うと、HTTP/2 使用時に青い稲妻が出て面白い。

参考URL
https://www.debian.org/doc/manuals/maint-guide/build.ja.html

Raspberry Pi で Let’s Encrypt

Raspberry Pi で Let’s Encrypt しようと思った話。

Raspberry Pi 上で動作している nginx で HTTPS が使う必要が出てきて、オレオレ証明書を使っているんだけど、最近は警告が激しくて使いにくい。
それで、無料の認証がもらえる Let’s Encrypt を試してみた。

必要となるツールは certbot というやつだけど、Raspbian ではパッケージに入っていないようだ。なので、Certbot のホームページにある「Debian その他 nginx」の方法を試した。
https://certbot.eff.org/#debianother-nginx

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

sudo ./certbot-auto certonly --standalone -d www.sakisan.mydns.jp

基本的に、この方法で問題ない。はず。

だが、ドメインが mydns.jp を使っている都合で、
There were too many requests of a given type
と出てしまい。先に進まない。 どうも、mydns.jp ドメイン全体の制限が掛かってしまっているようで、なかなか厳しいことになっている。

海外だと格安のやつもあるみたいだから、検討するか。。。

nginx の allow と deny

nginx の 設定で、allow, deny を書くときの話。
細かい書き方は、ブログネタの定番(?)とも言えそうなネタなので、細かくは書かないが、ネット上の例を見ると、location の中に書いている例が多く見られる。 実際、location で指定したい場合が多いのだと思うが、マッチングの都合で、一カ所だけでは済まずに、複数箇所に書かなければならないケースも出てくると思う。

しかし、考えてみるに、管理用のディレクトリは location で塞ぐしかないが、バーチャルホストそのものにアクセスして欲しくない場合は、server の方に書いてしまえば、一発で防げる。

すごく当たり前のことを言っているようだが。。。
allow, deny は、http, server, location, limit_except の中にに書くことが出来る。
必要に応じて、書き分けよう。