Apache2でのBasic認証で発生する500 Internal Server Error問題の解決法

あけましておめでとうございます。2017年第一回目の記事(あけおめ記事は自動のため除く)です。

#0:状況

筆者もBasic認証をVPN上(VPN上でなくても解決できる)でWordPressを運用しているサーバ上にBasic認証を施そうとしたところ500 Internal Server Error (内部サーバエラー)が発生しました。ちなみに使用しているApache サーバはRaspberry Pi – Raspbianです。

Error.png
500 Internal Server Error

書いてる内容は

500 Internal Server Error
サーバ内部でエラーもしくは、構成ミスが発生したため、要求が完了できませんでした。
サーバ管理者に連絡して、エラーが発生した時刻、エラー直前に実行した操作を報告してください。
このエラーの詳細については、サーバエラーログを確認してください。

エラーを引き起こしたのは他でもない管理者である筆者なのだった…。この時に気づけばよかったのだが、『サーバーエラーログ』を見ていればすんなりと解決しました。

筆者もネットでググりまくっても出てくるのは、文字コードによるもの、改行によるもの、ファイルネームが間違っているものと全部試してみても500が解決する様子はない…。

#1:これで解決

最初からエラーログを見ていれば簡単でした。ちなみにlogが保存されているところは、グループがadmなので最初からrootでログインしておきましょう。次の方法で確認します。

$ sudo su
# cat /var/log/apache2/error.log

エラーの内容はいかほどなものか…。

[Sun Jan 01 08:01:43.414406 2017] [core:alert] [pid 1345] [client 25.XXX.XXX.XXX:XXX] /var/www/.htaccess: Invalid command ‘AuthGroupFile’, perhaps misspelled or defined by a module not included in the server configuration, referer: http://25.XXX.XXX.XXX/

AuthGroupFileはどうやら存在しないコマンドということみたいです。viなりで.htaccessを編集してAuthGroupFileの行を削除します。ちなみにこのコマンドは、グループ指定などに使うコマンドですが、なくても問題ないらしい。しかし、問題はこれだけではないみたいです。

[Sun Jan 01 08:11:01.869283 2017] [core:alert] [pid 1321] [client 25.XXX.XXX.XXX:XXX] /var/www/html/.htaccess: AuthName takes one argument, the authentication realm (e.g. “Members Only”), referer: http://25.XXX.XXX.XXX/

AuthNameの構成が間違っているとのこと。ダブルコーテーションのみでくくれ!って言われた…。

#変更前
AuthName "Please enter your ID and password";
#変更後
AuthName "Please enter your ID and password"

これですべてのエラーが解消されて、無事にBasic認証が動作しました。

#2:参考 .htaccess

ここに.htaccessの設定を載せておきます。

set.png
WordPress.comではうまくcodeが実行できないので画像で…。

 

それではよいお年を。

以上

Easy Install Hamachi on Raspberry Pi (Automatic Startup)

For older versions, “lsb” and “lsb-core” were necessary. In this article, “lsb” and “lsb-core” is unnecessary and it is setup until automatic startup.

The version used in this article is 2.1.0.174-1.

$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.174-1_armhf.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.174-1_armhf.deb

After installation please do the following to join Hamachi. The last “hamachi join” is unnecessary if you are using WEB approval, and you can participate by approving it on the WEB.

$ sudo hamachi login
$ sudo hamachi attach [Your Hamachi Email Address]
$ sudo hamachi set-nick [Whatever Nickname You Make]
$ sudo hamachi join [Network ID] [Password]

Finally reboot Raspberry Pi and check whether Hamachi will start automatically.

Raspberry PiとVPNで作るウェブオンラインストレージサーバ

画像や動画、文章などを簡単に保存するとなると昔ならHDDやポータブルHDDなどに保存していました。最近であれば、ウェブオンラインストレージを使えば簡単に画像や動画、文章を転送して、また共有することができます。代表的なサービスとしてはDropboxやGoogle Drive、OneDriveなどがあります。

今回はRaspberry Piを用いてVPN上で運用するウェブオンラインストレージサーバを構築します。使用するものはownCloudと呼ばれるものです。

#1:サーバのセットアップ

サーバのセットアップを行う。セットアップ済みの場合は、この項目を飛ばしても構いません。

今回使用するイメージはRaspbian Jessie Liteで、Raspbian Jessie With Pixelと同様です。

詳しいことはこちらの記事を参考にしてください。


Raspberry Piで実行するVPN上のWordPress

各種参考項目:

#1:Raspberry Piのセットアップ
#1-1:Raspberry Piに必要なイメージをダウンロード
#1-2:ダウンロードしたイメージをMicro SDに書き込む
#1-3:初期起動の設定

#2:VPNの導入
#2-1:Hamachiへの登録
#2-2:クライアントへダウンロード&インストール
#2-3:Raspberry PiをHamachi VPNに参加させる


#2:サーバに必要な条件を整える

Raspberry PiをウェブサーバとするにはApacheやPHPを導入する必要があります。これがなければ表示することが出来ません。

#2-1:Apache2を導入する

ApacheはHTMLを表示するためのものです。下記のコマンドより導入します。

$ sudo apt-get install apache2

先程ifconfigで調べた自身のIPアドレスをブラウザに入力すると次の表示がされます。

2016-12-24
It works!

#2-2:PHP5の導入

PHP5を導入する必要があります。下記のコマンドより導入します。

$ sudo aptitude install php5 php5-curl

#2-3:MySQLの導入

MySQLを導入します。途中でMySQLに設定するパスワードを聞かれますので、設定して下さい。ここでは例として”raspass”とします。二度聞かれるのでどちらも同じパスワードを入力して下さい。

$ sudo apt-get install mysql-server php5-mysql

#2-4:データベースの作成

実際に運用させるためのデータベースを作成します。今回は”ownCloud”というデータベースを作成します。因みにMySQLにログインするには例として”mysql -uroot -praspass”で入ることができます。詳しく説明すると”mysql -u[User Name] -p[Password]”となっています。今回はowncloudというデータベースを作成します。

$ mysql -uroot -praspass
mysql> CREATE DATABASE owncloud;
mysql> exit

#2-5:phpMyAdminの導入

phpMyAdminを導入します。こちらも途中パスワードを聞かれますので問題なければ先程と同じパスワードを使います。嫌だと思う場合は、phpMyAdminで聞かれるパスワードのみを変え、2度目に同じものを入力して下さい。

$ sudo apt-get install phpmyadmin

#3:ownCloudの導入

今回使うオンラインストレージはownCloudを使用します。最新パッケージはこちらをご覧ください。

#3-1:ownCloudをダウンロードする。

$ wget https://download.owncloud.org/community/owncloud-9.1.3.zip
$ unzip owncloud-9.1.3.zip

#3-2:Apache上に配置する

Apache上でWordPressを再現する必要があるため、移動します。

$ sudo cp -r owncloud /var/www/html/owncloud

#3-3:権限問題の解決

どうしても生じるのが権限問題です。www-dataに権限を移譲し、設定を執り行います。

$ sudo chown -R www-data:www-data /var/www/html/owncloud

#4:ownCloudの設定

いよいよownCloudの設定に移ります。

#4-1:アカウント作成

『http://[Hamachi IP Address]/owncloud/』にアクセスしてみましょう。お好みのユーザ名とパスワードを作成します。

Own1.png
アカウントの作成

データベースに接続します。データベースのユーザ名、データベースのパスワード、先ほど作成したデータベース名を入力します。

Own2.png
データベースへのログイン

#4-2:実行してみた

Own3.png
アップロードしてブラウザ上で表示

以上

How to Acquire CPU Temperature and CPU Frequency Using PHP

This article is in English. Sometimes the sentences are wrong. Please be understanding of this beforehand.

How to Acquire the CPU Temperature Using PHP

The temperature displayed is celsius.

echo round((exec('cat /sys/class/thermal/thermal_zone0/temp')/1000),2);

How to Acquire the CPU Frequency Using PHP

The unit displayed is MHz. If there are 4 cores, cpu0 to cpu3.

echo round((exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq')/1000),2);

Operation Example

Raspberry Pi is used for the server. By introducing “Insert PHP” in WordPress you can run PHP with widget.

00_raspi-config_l
Using “Insert PHP”.
00_900mhz
Add Completed.

Change the frequency and check the operation.

00_raspi-config
raspi-config
00_raspi-config_1ghz
Changed from 900MHz to 1000Mhz

00_1000mhz

PHPによるCPU温度とCPU周波数の取得方法

以前にも記事にしましたが、少々解りにくいと思うので書き直したいと思います。

PHPによるCPU温度取得

PHPを使ってCPU温度を取得します。求められている温度は摂氏(°C)です。

echo round((exec('cat /sys/class/thermal/thermal_zone0/temp')/1000),2);

PHPによるCPU周波数取得

PHPを使ってCPU周波数を取得します。求められている周波数はメガヘルツ(MHz)です。オレンジ色で示したのはcpu0の周波数です。コアが4つの場合、cpu0~cpu3ですので編集するとよいでしょう。

echo round((exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq')/1000),2);

Raspberry Piでの導入例

WordPressなら”Insert PHP”でウィジェットにPHPを実行することができます。下の画像は筆者しか見ることのできないテスト環境兼日記のWordPressである。

00_raspi-config_l.png
Insert PHPによる実装例

これによりWordPressのウィジェットに追加することができました。

00_900mhz.png
ウィジェット実装例

実際にきちんと表示されているかを確かめる。クロックを変更して確かめる。ちなみにオーバークロックは自己責任です。

$ sudo raspi-config
00_raspi-config
6 Overclockを選択する
00_raspi-config_1ghz
High 1000MHzを選択する

これによってRaspberry Piは1000MHzで動作する。実際に反映されたかを見る。

00_1000mhz.png
チェンジ後の表示

検証後は元の周波数に変更することを強くお勧めします。

PHPでCPU温度やCPU周波数を取得するプログラム

こんにちは、筆者です。PHPでCPU温度とCPU周波数を取得するプログラムを作成しました。WordPress上でウィジェットなどに実装して使えます。ちなみにウィジェットに実装する場合、『Insert PHP』というプラグインを実装すればよいかと。

  • CPU温度取得

root不要で取得できます。単位は°Cです。

echo round((exec('cat /sys/class/thermal/thermal_zone0/temp')/1000),2);
  • CPU周波数取得

root不要で取得できます。単位はMHzです。

echo round((exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq')/1000),2);
  • ウィジェット実装例

実際にWordPressに実装してみました。サーバーはRaspberry Pi 2でCoreが4つあります。
*cpu0 ~ cpu3まで

server-info
WordPressに実装
  • あとがき

こんな感じで表示できます。よろしければ使ってみてください。

Raspberry PiにHamachiをインストールするのが更に簡単になったので紹介

以前紹介した方法は古いヴァージョンでインストールにはlsbやlsb-coreが必要であった。今回紹介するヴァージョンではパッケージ等の導入する必要がない。

今回使うヴァージョンは2.1.0.174-1である。これ単体でインストールすると、Hamachiの導入とHamachiの自動起動まで設定される。

$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.174-1_armhf.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.174-1_armhf.deb

ログイン作業を行えばHamachiのグループに参加することが可能となる。最後のhamachi joinはWEB承認を使っている場合不要で、WEB承認を使っている場合はWEB上から承認すると参加できる。

$ sudo hamachi login
$ sudo hamachi attach [Your Hamachi Email Address]
$ sudo hamachi set-nick [Whatever Nickname You Make]
$ sudo hamachi join [Network ID] [Password]

これでログインが完了となる。Raspberry Piを再起動して自動起動するか確かめてもらいたい。

以上

Raspberry Piで実行するVPN上のWordPress

Raspberry Piの良いところ、Linuxが扱えることができるマイコンであるという点ですかね。さて、このRaspberry Piを使ってVPN上でWordPressを運用させると言うことは、本人もしくはVPNに参加する人間のみが編集、閲覧することが出来るサイトです。一種のクローズドサイトと呼ばれるものです。自分専用の忘備録であったり、日記であったり、仲間内での共同サイトであったりとVPNという閉鎖的回線を用いることによってプライバシが担保されるものです。簡易的な様子を図示しました。実際にはもっと複雑な処理をしていますが省いています。

vision_1.png
VPNを使えばどこでもWordPressを見ることができる。

因みに今回の設定は外部公開に向きませんのでご留意下さい(ポート開放等の公開行為)。あくまでもVPN上での運用が大前提です。

#1:Raspberry Piのセットアップ

Raspberry Piをセットアップする必要があります。筆者自身もはじめからセットアップを行いました。

#1-1:Raspberry Piに必要なイメージをダウンロード

Raspberry Piに必要なイメージとして、Raspbianを使います。今回筆者が使ったものはRaspbian Jessie LiteというものでRaspbian Jessie With Pixelではありません。Raspbian Jessie LiteはGUIモードがなくCUIモードのみとなっています。しかし、結局のところWordPressというWEB GUIを使用するので何ら問題ありません。また、個人の好みにもよるもので、With Pixelを選択してもLiteを選択しても動作には変わりありませんが、容量を少なく済ませたいのであればLiteをおすすめします。公式サイトよりダウンロードすることができます。

項目
OS Raspbian Jessie Lite
ヴァージョン November 2016
リリース日 2016年11月25日
カーネルバージョン 4.4

#1-2:ダウンロードしたイメージをMicro SDに書き込む

ダウンロードしたファイルを解凍(展開)し、Win32 Disk Imagerで対象のMicro SDに書き込む作業を行って下さい。Win32 Disk ImagerはOSDNよりダウンロードすることができます。詳しい書き込み方法はこちらを参考にして下さい。

#1-3:初期起動の設定

初期起動時、SSHはデフォルトで有効でしたが今回リリースされたヴァージョンではデフォルトでSSHが無効になっているため初期段階からSSHでログインすることができませんでした。有効にするには下記のコマンドを入力し、[5]=>[P5]の順に移動します。

$ sudo raspi-config

最後に自分自身のIPアドレスを確認します。有線LANの場合、eth0を参照し、無線LANの場合、wlan0を参照して下さい。割り当てられたIPアドレスはinet アドレスにて確認することができます。筆者の場合ですと、192.168.11.14に今回割り当てられました。

$ ifconfig
eth0 Link encap:イーサネット ハードウェアアドレス b8:27:eb:05:fc:33
     inetアドレス:192.168.11.14 ブロードキャスト:192.168.11.255 マスク:255.255.255.0

Windowsパソコンで操作する場合はTera TermでSSH接続を行います。Tera Termはこちらでダウンロードすることができます。先程取得したIPアドレスを入力して、ユーザ名とパスワードを入力して下さい。デフォルトのユーザ・パスワードは下記の表のとおりです。

項目
ユーザ名 pi
パスワード raspberry

ログインが完了したら、次にRaspbianのアップデートを行います。

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

日本語化とタイムゾーンの変更を行います。下記のコマンドを実行し、必要な処理を行います。[2]よりpiのパスワードを変更して下さい。次に[4]=>[I1]より[en_GB.UTF-8 UTF-8]と[ja_JP.EUC-JP EUC-JP]と[ja_JP.UTF-8 UTF-8]を選択し、デフォルトで使用するロケールを[ja_JP.UTF-8]として下さい。最後に[4]=>[I2]を選択して[Asia]=>[Tokyo]と進んで下さい。

$ sudo raspi-config

次に日本語フォント等を導入します。

$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname

vimエディタを追加(viが必要な場合のみ、nanoでも対応可能)

$ sudo apt-get install vim

以上を終えたら、下記のコマンドで再起動して下さい。

$ sudo reboot

#2:VPNの導入

VPNとして使うのはHamachiと呼ばれるものでSoftEtherよりも導入が簡単であり5台まで無料というメリットがあります。また、最近ではRaspberry Piへの導入が難なくできるのでおすすめであります。

#2-1:Hamachiへの登録

VPN.net – Hamachi by LogMeInにて登録を行います。

#2-2:クライアントへダウンロード&インストール

指示に従ってダウンロードを行って下さい。筆者の場合、Windowsにインストールしました。追加でiPhoneにもHamachiへ参加させました。

#2-3:Raspberry PiをHamachi VPNに参加させる

HamachiをRaspberry Pi (Raspbian)にインストールするのがとても簡単になりました。以前であればややこしい設定が必要でしたが、最近では自動起動まで勝手にやってくれます。Raspberry Piの操作に戻り、実際にHamachiをRaspberry Piに追加します。また、最新のヴァージョンはこちらで確認できます。選択する場合、『ARM HF version (BETA) *.deb』を選択して下さい。

$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.174-1_armhf.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.174-1_armhf.deb

次に参加要求を行います。最後のsudo hamachi joinの部分ですが、自動承認を選択した場合実行して下さい。通常であれば最後のsudo hamachi joinを実行せず、Hamachiの設定画面より『参加要求』から対象であるRaspberry Piを選択し、承認して下さい。

$ sudo hamachi login
$ sudo hamachi attach [Your Hamachi Email Address]
$ sudo hamachi set-nick [Whatever Nickname You Make]
$ sudo hamachi join [Network ID] [Password]

これでVPNへの参加を完了することができました。

#3:サイトに必要な条件を整える

Raspberry PiをウェブサーバとするにはApacheやPHPを導入する必要があります。これがなければ表示することが出来ません。

#3-1:Apache2を導入する

ApacheはHTMLを表示するためのものです。下記のコマンドより導入します。

$ sudo apt-get install apache2

先程ifconfigで調べた自身のIPアドレスをブラウザに入力すると次の表示がされます。

2016-12-24
It works!

#3-2:PHP5の導入

PHP5を導入する必要があります。下記のコマンドより導入します。

$ sudo aptitude install php5

#3-3:MySQLの導入

MySQLを導入します。途中でMySQLに設定するパスワードを聞かれますので、設定して下さい。ここでは例として”raspass”とします。二度聞かれるのでどちらも同じパスワードを入力して下さい。

$ sudo apt-get install mysql-server php5-mysql

#3-4:データベースの作成

実際に運用させるためのデータベースを作成します。今回は”wordpress”というデータベースを作成します。因みにMySQLにログインするには例として”mysql -uroot -praspass”で入ることができます。詳しく説明すると”mysql -u[User Name] -p[Password]”となっています。今回はwordpressというデータベースを作成します。

$ mysql -uroot -praspass
mysql> CREATE DATABASE wordpress;
mysql> exit

#3-5:phpMyAdminの導入

phpMyAdminを導入します。こちらも途中パスワードを聞かれますので問題なければ先程と同じパスワードを使います。嫌だと思う場合は、phpMyAdminで聞かれるパスワードのみを変え、2度目に同じものを入力して下さい。

$ sudo apt-get install phpmyadmin

#4:WordPressの導入

いよいよWordPressの導入です。日本語版を使って導入していきたいと思います。

#4-1:WordPress 4.7 日本語版をダウンロード

英語版が良いとお望みでしたら英語版もあるので参照するかと。ここでは日本語版について解説します。また、最新のWordPressについてはこちらから確認することが出来ます。

$ wget https://ja.wordpress.org/wordpress-4.7-ja.zip
$ unzip wordpress-4.7-ja.zip

#4-2:Apache上に配置する

Apache上でWordPressを再現する必要があるため、移動します。

$ sudo cp -r wordpress /var/www/html/wordpress

#4-3:権限問題の解決

どうしても生じるのが権限問題です。このまま実行してもwp-config.phpを手動で変更する必要がありますが、www-dataに権限を移行することによって今後生じる面倒事が無くなります。

$ sudo chown -R www-data:www-data /var/www/html/wordpress

#4-4:WEB上でWordPressの設定を行う

先程のifconfig IPアドレス値をブラウザ上に入力し、設定していきます。今回の場合ですと、私の場合、http://192.168.11.14/wordpressとなっています。環境が違うわけですからhttp://192.168.xxx.xxx/wordpressです。

2016-12-24 (1).png
正常表示

次に設定画面に先程設定したデータベース名などを入力していきます。データベースであるMySQLのパスワードは例として”raspass”を使用していますのでご自身が設定したパスワードを入力して下さい。その他の設定はそのままで十分です。

2016-12-24 (3).png
必要事項の入力

正しい値が入力されると以下の画面が出てきます。インストールの実行を行います。

2016-12-24 (5).png
正常にデータベースへ接続完了

 #4-5:サイトの基本情報の入力

サイトタイトルやユーザ名、パスワード、メールアドレスなどご自身のお好きな設定で。ここでは例を挙げているだけです。一応、公開はしませんが『検索エンジンがサイトをインデックスしないようにする』にチェックマークをつけましょう。

2016-12-24 (6).png
サイト基本情報の指定

#4-6:ログインをして動作を確認する

実際にログインを行って動作を確認して下さい。

2016-12-24 (7).png
管理画面
2016-12-24 (8).png
実際のサイト画面

#5:VPN上での改善

VPN上で表示するとレイアウトが崩れて正しく表示されない現象が発生します。これはWordPress上のアドレスがhttp://192.168.xxx.xxxであってVPNのアドレスであるhttp://25.xxx.xxx.xxxに対応していない為です。もし、正しく表示されているとしても、http://192.168.xxx.xxxに転送されているだけかもしれません。

因みに、これをVPN上のアドレスに対応させるだけでは不十分で次はローカルIP上からアクセス出来なくなります。

つまりIPアドレスである、http://192.168.xxx.xxx及びhttp://25.xxx.xxx.xxx (とhttp://raspberry.local)、に対応する必要があります。つまりWordPressのURLであるIPアドレスが2つ以上、つまり能動的(可変的)に動作する必要があります。

IP.png
処理のイメージ

#5-1:wp-config.phpの編集

wp-config.phpを編集し、サイトのURLを優先的に決定させ、能動的(可変的)にURLを変更可能にする設定を行います。ファイルの編集を行って下記の行を追加します。基本的に指定ありませんが(91行以下から制限あり)、データベースの照合順序[define(‘DB_COLLATE’, ”);](44行目)の下に追加するのが順当だと思います。

$ sudo vi /var/www/html/wordpress/wp-config.php
/** 動的URLに対応するめの設定 */
define('WP_SITEURL', 'http://' .$_SERVER['HTTP_HOST']. '/wordpress');
define('WP_HOME', 'http://' .$_SERVER['HTTP_HOST']. '/wordpress');

#5-2:記事本文中の画像等のURLを能動的(可変的)なものにする

wp-config.phpの設定のみでは不十分で、本文中の画像等のURLは変化しません。記事中で対応させるために『Insert PHP』というプラグインを新規追加します。[insert_php]XXXXXXX[/insert_php]で囲まれた範囲はphpが実行されます。つまりHTTP_HOSTが出力されるPHPを挿入すると可変的なURLにもメディアが対応することができます。[insert_php]echo $_SERVER[‘HTTP_HOST’];[/insert_php]をhttp://192.168.xxx.xxxの部分に置換することで対応することができます。IMGのURL部分に置換することで画像の能動的(可変的)な改善が得られます。

現在のアクセスURLは『http://[insert_php]echo $_SERVER['HTTP_HOST'];[/insert_php]』です。

#6:WordPress(PHP)のメディアアップロード容量を増やす

通常であれば、2MBですがこれは少ないのでメディアの許容アップロード値を増加させるべく対応させます。php.iniの変更を行います。

#6-1:php.iniの編集

$ sudo vi /etc/php5/apache2/php.ini
#393行
memory_limit = 128M
#660行
post_max_size = 80M
#820行
upload_max_filesize = 60M

#6-2:.htaccessの編集

次に.htaccessを編集します。以下を追加します。

$ sudo vi /var/www/html/wordpress/.htaccess
php_value memory_limit 128M
php_value post_max_size 80M
php_value upload_max_filesize 60M

#7:あとがき

最後に再起動を済ませると良いかもしれませんね。

$ sudo reboot

#7-0:

さて、ここまでどうでしたか?筆者も実行のみだと1時間くらいで終わりました。しかし、記事にするとなると3倍以上の時間がかかります。意外と大変…。でも、自分の忘備録ともなりますし、まぁ多分将来約に立つのかも。なにかエラー等が出ましたらコメント欄もしくは、お問い合わせページより報告お願いします。(クリスマスになに書いてるんだろ…。)

以上

RaspberryPiと携帯回線網(+VPN)の死活監視プログラム

こんにちは、筆者です。RaspberryPiと携帯回線網の組み合わせは最強です。しかし、時々ですが携帯回線がダウンしてしまう場合があります。それの対策として死活監視プログラムの作成が必須となります。L-02Cのファームアップデートだけでは対処できないかも…。

Pythonを使ったPingの確認

Pythonを使ったPingの確認は前回の記事に詳しくかいています。pypingを使う方法です。pypingを使うためにはpipで追加する必要があります。

$sudo pip install pyping

LEDを組み合わせる

GPIO 17,27,22 (Board 11, 13, 15)を使います。LEDと抵抗を準備してください。

Pythonで作ってみる(ベータ版)

ちょっと急いで作ったので使用は自己責任で。多分大丈夫だとは思う。送り先と繰り返し調整は注意して下さい。間違えがあればコメントよろしくお願いします。一応確認はしていますが…。

※追記:pypingは多分pingを送るinterfaceがないとエラーが発生します。つまり、エラーが繰り返してしまうトラブルが発生します。これを解消するためpypingのエラーに対して例外処理を施して再起動を円滑に行えるように対処しました。

$vi ping_monitor.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyping
import RPi.GPIO as GPIO
import time
import os
import sys
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
################################################
#確認したいアドレス
host_dns     = "8.8.8.8"
host_vpn_A   = "25.18.1.235"
#代替比較アドレス
host_vpn_B   = "25.19.178.224"
################################################
#tが時間,sがtime sleep
def led_n3_f(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(11, True)
      GPIO.output(13, True)
      GPIO.output(15, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, False)
      GPIO.output(15, False)
      time.sleep(s)
      n += 1
def led_n1_f(led_no, t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(led_no, True)
      time.sleep(s)
      GPIO.output(led_no, False)
      time.sleep(s)
      n += 1
def ping_tp(host_name, led_no, t):
   try:
      r_host = pyping.ping(host_name)
      if r_host.ret_code == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def ping_sb(host_name_A, host_name_B, led_no, t):
   try:
      rA_host = pyping.ping(host_name_A)
      rB_host = pyping.ping(host_name_B)
      rAB     = (rA_host.ret_code) * (rB_host.ret_code)
      if rAB == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def led_wait(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(15, False)
      GPIO.output(11, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, True)
      time.sleep(s)
      GPIO.output(13, False)
      GPIO.output(15, True)
      time.sleep(s)
      n += 1
#EX:)解説:ホスト名, GPIOのPIN, 指定時間
#EX:)ping_tp(host_vpn_A, 11, 5)
#待ち時間
led_n3_f(10, 0.7)
led_wait(50, 0.25)

############################################################
while True:
   try:
      cn = 0
      while cn < 30:
         led_n1_f(15, 10, 1.5)
         GPIO.output(15, True)
         time.sleep(50)
         cn += 1
      tt1 = ping_tp(host_dns, 11, 20)
      if tt1 == 0:
         kk1 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
         if kk1 == 0:
            pass
         else:
            led_n1_f(15, 10, 0.5)
            os.system('sudo hamachi login')
            kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk2 == 0:
               pass
            else:
               led_n1_f(15, 20, 0.05)
               os.system('sudo reboot')
               sys.exit()
      else:
         tt2 = ping_tp(host_dns, 11, 20)
         if tt2 == 0:
            kk3 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk3 == 0:
               pass
            else:
               led_n1_f(15, 10, 0.5)
               os.system('sudo hamachi login')
               kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
               if kk2 == 0:
                  pass
               else:
                  led_n1_f(15, 20, 0.05)
                  os.system('sudo reboot')
                  sys.exit()
         else:
            led_n1_f(15, 20, 0.05)
            os.system('sudo reboot')
            sys.exit()
   except:
      led_n3_f(1800, 0.05)
      os.system('sudo reboot')
      sys.exit()

自動起動するようにする

再起動後自動起動することによってまた監視を続行する。

$sudo vi /etc/rc.local

#最後らへんに追加 先程作ったディレクトリを選択してください。ここではusr
python /usr/local/bin/ping_monitor.py &

exit 0

以上

自動起動を止めたい場合はrc.localの追加部分をコメントアウトするか削除してください。

PythonでPingの確認を行う

こんにちは筆者です。RaspberryPiとL-02Cにハマりまして必須と思われるPingを送信して確認するプログラムを作りたいと思います。

pypingを使う

Pythonでpingを送りたいのならosを使うかsubprocessを使うかのどちらかだけだと思っていたが実はpypingというものがあるらしい。シンプルで簡単なので今回はこちらを試してみた。

pipでpypingをインストールする。

$sudo pip install pyping

お好きなエディタ(viとかnanoとか)を使ってping.pyを作ります。この構成では到達を確認するものです。

$vi ping.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyping

#確認したいアドレス
host = "192.168.11.1"
RPing = pyping.ping(host)

if RPing.ret_code == 0:
    print("到達を確認しました。")

else:
    print("到達を確認できませんでした。")

以上が基本的な構成となっています。

色々使ってみる

GoogleにPingを送る場合で色々やってみた。たぶんPingを3回ほど送信して最大値と最小値、そして平均値を求めていると思う。

$vi ping.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyping

#確認したいアドレス
host = "www.google.com"
RPing = pyping.ping(host)

#送り先
print "ADD:"+str(RPing.destination)
#送り先IP
print "AIP:"+str(RPing.destination_ip)
#最大往復秒
print "MAX:"+str(RPing.max_rtt)+"ms"
#最小往復秒
print "MIN:"+str(RPing.min_rtt)+"ms"
#平均往復秒
print "AVG:"+str(RPing.avg_rtt)+"ms"

必ず管理者権限を使って実行してください。Windows Pythonでも同じことが言えます。

$sudo python ping.py
ADD:www.google.com
AIP:216.XXX.XXX.XXX
MAX:109.266ms
MIN:98.217ms
AVG:103.011ms

死活監視にも使えますので是非使ってみて下さい。以上、忘備録でした。

以上