Edited at

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

More than 1 year has passed since last update.


はじめに

出先からおうちの家電を動かしたい!ということで、

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 の使い方