OpenWrt on WZR-HP-AG300H: nginx
デフォルトの uHTTPd に替えて当初は Apache を入れようとしたが、マトモに動かなかった(公式のフォーラムでもそのような話が出ていた)。それで諦めかけていたのだが、どうしても Virtual Host を実現したいので、nginx を入れてみることにした。
公式 wiki に従って(PHP は使う予定がないので、該当部分は飛ばした。)入れてみると、とても軽快で、さらに設定も /etc/nginx/nginx.conf に記載された内容で行うだけという、とてもシンプルなものだった。歴史が長過ぎて半ば妖怪化しつつあるような Apache と違って、一発で気に入った。
Virtual Host は nginx.conf で server {} を追加するのが基本。
ただし、デメリットも 2 点発生した。
- デフォルトでは HTTPS に対応していない
- CGI に対応していない
OpenWrt 用 nginx の HTTPS 化
nginx 自体は HTTPS に対応しているのだが、OpenWrt 標準の nginx モジュール(.ipk)は HTTPS 非対応でコンパイルされているため、自前で nginx モジュールをコンパイルして用意しなければならない。大変だったが(nginx の HTTPS 化そのものについては、一箇所しか情報が存在しなかったほど、情報が限られていた)、最終的に実現できた。
- 【下準備】Linux で git を使える環境を整える:
apt install git-core build-essential libssl-dev libncurses5-dev unzip gawk zlib1g-dev subversion libncurses5-dev gcc-multilib flex gettext mercurial - git clone して、ソースコードを用意する:
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt - このままでは有無を言わさず最新のソースコードが使われてしまい、ライブラリーとのバージョンの不整合が起こるため、自分の使っている stable バージョンに絞って checkout する。
git checkout v18.06.2 - make menuconfig
Target System、Subtarget、Target Profile のみ、ルーターに合わせて適当に設定し、Build the OpenWrt SDK をチェックして SAVE -> EXIT。 - make V=s
コンパイルが始まるので、時間がかかる。 - scripts/feeds update
scripts/feeds search nginx
scripts/feeds install nginx - make menuconfig
再度、menuconfig を立ち上げると、nginx に関するコンパイルオプションを設定できる状態になるので、望みのように設定して SAVE -> EXIT。
network > Web Servers/Proxies にある。nginx そのものは M(モジュール)で選択し、さらに詳細はその中に入って設定する。Enable SSL module で HTTPS が有効になる(ついでで HTTP2 と LUA も有効にしておいた)。 - make -j5
コンパイルし直す - .ipk を拾い出す。bin の中にあるが、find コマンドを使って場所を特定するなどする:
find . -type f -name nginx\*ipk - .ipk をルーターに持っていって、opkg コマンドでインストールする。
OpenWrt で Let's Encrypt
HTTP (80) を HTTPS (443) にリダクレクト
上で HTTPS 化にも成功したので、あとは、HTTP にアクセスしたら、自動的に HTTPS の方にリダイレクトするための設定で完成する。HTTP (80) の方の nginx.conf の該当する server ブロックの設定を次のように修正しておけばよい。
server {
listen 80;
server_name www.scaredeer.com scaredeer.com;
return 301 https://$host$request_uri;
}
CGI の扱い
色々調べて試した結果、リバースプロキシで uHTTPd のポート(この例では 81)から出力結果を引っ張ってくるという対処方法に落ち着いた。nginx.conf の該当する server ブロック内に次の location ブロックを追加する:
location /cgi-bin {
proxy_pass http://127.0.0.1:81;
}
コメント
コメントを投稿