はじめに
出先からおうちの家電を動かしたい!ということで、
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 のインストール前に、最新のソフトの情報を取得し、システムを最新の状態にする。
$ sudo apt-get update
$ sudo apt-get upgrade
apache2 をインストールする。
$ sudo apt-get install apache2
mod_wsgi のインストール
apache2 でmod_wsgi を使うためにlibraryをインストールする。
$ sudo apt-get install libapache2-mod-wsgi
pythonで mod_wsgi を使うためのライブラリをインストールする。
$ sudo pip install mod_wsgi
apache の設定ファイルの更新
webからアクセスするためのディレクトリを homeディレクトリ(私の設定は pi と言うディレクトリ名)配下にある public_htmlフォルダ に変更する。
$ 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/ とし、以下のファイルを編集する。
・・・
<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ファイル のリンクを置く。
$ sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load
apache2 で serve-cgi-bin.conf を参照するために、以下のファイルを編集する
(変更前)
# Include conf-avaliable/serve-cgi-bin.conf
(変更後:コメントを外す)
Include conf-avaliable/serve-cgi-bin.conf
cgi を利用できる拡張子(.py, .wsgi)を追加するために、以下のファイルを編集する。
(変更前)
AddHandler cgi-script .cgi
(変更後)
AddHandler cgi-script .cgi .py
AddHandler wsgi-script .wsgi
apache2で https(http + ssl) を使えるようにするために、特定フォルダに sslファイル のリンクを置く。
$ 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 を使えるようにするために、特定フォルダにファイルのリンクを置く。
$ 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 を再起動し、変更内容を有効化する。
$ sudo /etc/init.d/apache2 restart
Let's encrypt からSSL証明書取得
ルータのポート変換機能を使えるようにする
raspberry pi が割り当てられているローカルIPアドレスを取得する
$ sudo ifconfig
すると、192.168.x.y のIPアドレスを取得できる。
今回、http / https を利用するため、ポート 80 と ポート 443 に対して、
グローバルIPでアクセスした時に、ローカルIPアドレスに変換するように、ルータの設定を変更する。
各自がお持ちのルータの設定を確認ください。
証明書作成スクリプトのインストール
$ 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/
また、ホスト名は上記の通り取得している。
それをもとに、以下の通りコマンドを実行して、証明書を取得する。
$ ./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の証明書を参照するように以下のファイルを修正する。
(変更前)
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証明書を有効化する。
$ sudo /etc/init.d/apache2 restart
参考URL
(1)[Raspberry Pi2にWebサーバを構築し、LEDを点灯させる] (https://qiita.com/aryoa/items/2c28b466e911a3dd101d)
(2)[Let's Encrypt の使い方] (https://letsencrypt.jp/usage/)