Python
apache2
mod_wsgi
letsencrypt

Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作(その2:httpsサーバ(apache + mod_wsgi) の構築)

はじめに

出先からおうちの家電を動かしたい!ということで、
LINE の Messaging API (webhook) を利用し、
Raspberry pi 3 経由で、赤外線を使って、
おうちの家電製品を操作するような仕組み作りました。
備忘録として、思い出しながら記載します。

今回の構成は以下の通りです。
LINE -> raspberry pi(httpsサーバ) -> 赤外線リモコン -> エアコン

以下のとおり、3回に分けて説明します
- 赤外線リモコン から エアコン を操作(前回)
- httpsサーバ(apache + mod_wsgi) の構築(今回)
- LINE から 赤外線リモコンを操作

今回は、httpsサーバーの構築するために、
httpsサーバーのデーモンである apache
pythonでhttpsサーバーとwebアプリケーションを繋げるためのモジュール mod_wsgi
httpsサーバで必要なSSLの証明書を無料で取得できるサービス Let's encrypt
を利用します。

※ 4ヶ月以上前に設定したことなので、参照サイト、および、記載が古いことがありますのでご了承ください

環境

OS: Raspbian 9.1
バージョンによって、設定方法など変わることに注意

手順

apache によるwebサーバーの構築

apache のインストール

apache のインストール前に、最新のソフトの情報を取得し、システムを最新の状態にする。

terminal
$ sudo apt-get update
$ sudo apt-get upgrade

apache2 をインストールする。

terminal
$ sudo apt-get install apache2

mod_wsgi のインストール

apache2 でmod_wsgi を使うためにlibraryをインストールする。

terminal
$ sudo apt-get install libapache2-mod-wsgi

pythonで mod_wsgi を使うためのライブラリをインストールする。

terminal
$ sudo pip install mod_wsgi

apache の設定ファイルの更新

webからアクセスするためのディレクトリを homeディレクトリ(私の設定は pi と言うディレクトリ名)配下にある public_htmlフォルダ に変更する。

terminal
$ sudo ln -s /etc/apache2/mods-available/userdir.conf /etc/apache2/mods-enabled/userdir.conf
$ sudo ln -s /etc/apache2/mods-available/userdir.load /etc/apache2/mods-enabled/userdir.load

webからのアクセスでスクリプトを起動するための仕組み(cgi) を動作するディレクトリを決める。
ここでは、homeディレクトリ(私の設定は pi と言うディレクトリ名)配下に /public_html/cgi-bin/ とし、以下のファイルを編集する。

/etc/apache2/conf-available/serve-cgi-bin.conf
・・・
<IfDefine ENABLE_USR_LIB_CGI_BIN>
    ScriptAlias /cgi-bin/ /home/pi/public_html/cgi-bin
    <Directory "/home/pi/public_html/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Require all granted
    </Directory>
</IfDefine>
・・・

cgi を apache2 で利用するために、以下の2つを行なう。
特定フォルダに cgiファイル のリンクを置く。

terminal
$ sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load

apache2 で serve-cgi-bin.conf を参照するために、以下のファイルを編集する

/etc/apache2/sites-available/000-default.conf
(変更前)
 # Include conf-avaliable/serve-cgi-bin.conf
(変更後:コメントを外す)
 Include conf-avaliable/serve-cgi-bin.conf

cgi を利用できる拡張子(.py, .wsgi)を追加するために、以下のファイルを編集する。

/etc/apache2/mods-available/mime.conf
(変更前)
 AddHandler cgi-script .cgi
(変更後)
 AddHandler cgi-script .cgi .py
 AddHandler wsgi-script .wsgi

apache2で https(http + ssl) を使えるようにするために、特定フォルダに sslファイル のリンクを置く。

terminal
$ sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
$ sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load
$ sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf

apache2で mod_wsgi を使えるようにするために、特定フォルダにファイルのリンクを置く。

terminal
$ sudo ln -s /etc/apache2/mods-available/wsgi.conf /etc/apache2/mods-enabled/wsgi.conf
$ sudo ln -s /etc/apache2/mods-available/wsgi.load /etc/apache2/mods-enabled/wsgi.load

apache2 を再起動し、変更内容を有効化する。

terminal
$ sudo /etc/init.d/apache2 restart

Let's encrypt からSSL証明書取得

ルータのポート変換機能を使えるようにする

raspberry pi が割り当てられているローカルIPアドレスを取得する

terminal
$ sudo ifconfig

すると、192.168.x.y のIPアドレスを取得できる。

今回、http / https を利用するため、ポート 80 と ポート 443 に対して、
グローバルIPでアクセスした時に、ローカルIPアドレスに変換するように、ルータの設定を変更する。

各自がお持ちのルータの設定を確認ください。

証明書作成スクリプトのインストール

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

IPアドレスとホスト名を取得

家庭用であれば、IPアドレスはプロバイダ経由で動的に割り当てられると思います。
IPアドレスはよく変わるかもしれませんが、グーグル先生に「IPアドレス」で検索するといくつかサイトが出て来ます。
私も動的にIPアドレスが割り当てられていますが、そこでIPアドレスとホスト名を取得しています。
自己責任で調べて見てください。
ここでは、以下の通りとしておきます。
    IPアドレス:xxx.yyy.zzz.vvv
    ホスト名:abcdefg.xyz.ne.jp

証明書の取得

今回、証明書取得フォルダはwebアクセスするためのデフォルトのフォルダになるため、以下のフォルダを参照する。
    /var/www/html/
また、ホスト名は上記の通り取得している。

それをもとに、以下の通りコマンドを実行して、証明書を取得する。

terminal
$ ./certbot-auto certonly --webroot -w /var/www/html/ -d abcdefg.xyz.ne.jp

具体的には以下に証明書が存在する。

証明書
証明書のデータ
/etc/letsencrypt/live/abcdefg.xyz.ne.jp/fullchain.pem
秘密鍵
/etc/letsencrypt/live/abcdefg.xyz.ne.jp/privkey.pem

SSLの証明書を参照するように以下のファイルを修正する。

/etc/apache2/sites-available/default-ssl.conf
(変更前)
SSLCertificateFile          /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateFileKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
(変更後)
SSLCertificateFile          /etc/letsencrypt/live/abcdefg.xyz.ne.jp/fullchain.pem
SSLCertificateFileKeyFile   /etc/letsencrypt/live/abcdefg.xyz.ne.jp/privkey.pem

apache2 を再起動し、SSL証明書を有効化する。

terminal
$ sudo /etc/init.d/apache2 restart

参考URL

(1)Raspberry Pi2にWebサーバを構築し、LEDを点灯させる
(2)Let's Encrypt の使い方