OpenWrt on WZR-HP-AG300H: nginx

デフォルトの uHTTPd に替えて当初は Apache を入れようとしたが、マトモに動かなかった(公式のフォーラムでもそのような話が出ていた)。それで諦めかけていたのだが、どうしても Virtual Host を実現したいので、nginx を入れてみることにした。

公式 wiki に従って(PHP は使う予定がないので、該当部分は飛ばした。)入れてみると、とても軽快で、さらに設定も /etc/nginx/nginx.conf に記載された内容で行うだけという、とてもシンプルなものだった。歴史が長過ぎて半ば妖怪化しつつあるような Apache と違って、一発で気に入った。

Virtual Host は nginx.conf で server {} を追加するのが基本。

ただし、デメリットも 2 点発生した。

  1. デフォルトでは HTTPS に対応していない
  2. CGI に対応していない

OpenWrt 用 nginx の HTTPS 化

nginx 自体は HTTPS に対応しているのだが、OpenWrt 標準の nginx モジュール(.ipk)は HTTPS 非対応でコンパイルされているため、自前で nginx モジュールをコンパイルして用意しなければならない。大変だったが(nginx の HTTPS 化そのものについては、一箇所しか情報が存在しなかったほど、情報が限られていた)、最終的に実現できた。

  1. 【下準備】Linux で git を使える環境を整える:
    apt install git-core build-essential libssl-dev libncurses5-dev unzip gawk zlib1g-dev subversion libncurses5-dev gcc-multilib flex gettext mercurial
  2. git clone して、ソースコードを用意する:
    git clone https://git.openwrt.org/openwrt/openwrt.git
    cd openwrt
  3. このままでは有無を言わさず最新のソースコードが使われてしまい、ライブラリーとのバージョンの不整合が起こるため、自分の使っている stable バージョンに絞って checkout する。
    git checkout v18.06.2
  4. make menuconfig
    Target System、Subtarget、Target Profile のみ、ルーターに合わせて適当に設定し、Build the OpenWrt SDK をチェックして SAVE -> EXIT。
  5. make V=s
    コンパイルが始まるので、時間がかかる。
  6. scripts/feeds update
    scripts/feeds search nginx
    scripts/feeds install nginx
  7. make menuconfig
    再度、menuconfig を立ち上げると、nginx に関するコンパイルオプションを設定できる状態になるので、望みのように設定して SAVE -> EXIT。
    network > Web Servers/Proxies にある。nginx そのものは M(モジュール)で選択し、さらに詳細はその中に入って設定する。Enable SSL module で HTTPS が有効になる(ついでで HTTP2 と LUA も有効にしておいた)。
  8. make -j5
    コンパイルし直す
  9. .ipk を拾い出す。bin の中にあるが、find コマンドを使って場所を特定するなどする:
    find . -type f -name nginx\*ipk
  10. .ipk をルーターに持っていって、opkg コマンドでインストールする。

OpenWrt で Let's Encrypt

👉 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;
}

コメント

このブログの人気の投稿

清水俊史『上座部仏教における聖典論の研究』

シークエンスパパともの先見の明

OpenWrt での Wi-Fi 設定