日々

日中、Raspberry Piで暫定的に動かしてるサーバをSSL対応させるべく、Let's Encryptでサーバ証明書を取得してみた。用意されてるスクリプトApacheSSL設定まで自動的にやってくれるのか。便利。ついでにメールサーバも立てて、PostfixDovecotにもサーバ証明書を設定してSSL対応にしてみた。
定時後、出社時にガス欠ランプ点いてたので帰りがてらジェームス山へ向かう。途中、垂水SAのセブン・イレブンから近い塩屋北町のローソンの隣に新たにセブン・イレブンが出来ようとしていた。あと、オートバックスのガソリンスタンドがリッター137円だか138円だかでめっちゃ安かった。ジェームス山のessoでスピードパス使ってレギュラー満タン給油。電光掲示板の値段通りでリッター143円。
その後、第二神明で帰宅。晩御飯は先日焼肉に使った国産牛が割りと脂多めで厚めだったのでステーキ風に何枚も焼いたもの。あとはわかめと豆腐の味噌汁。CCさくら見終わってからお茶入れてもらって一服。

一人未読

  1. 19:40〜20:04 ダーリン・イン・ザ・フランキス #10「永遠の街」(ABCテレビ 2018/03/17(土) 26:59)
  2. 20:05〜20:06 タマ&フレンズ 〜うちのタマ知りませんか?〜 #72「ねこじゃらし楽しい!」(ABCテレビ 2018/03/17(土) 27:29)
  3. 20:06〜20:49 魔法使いの嫁 #23「Nothing seek, nothing find.」(毎日放送 2018/03/17(土) 27:38)
  4. 20:49〜21:14 カードキャプターさくら クリアカード編 #11「さくらとさかさまペンギン」(NHK BSプレミアム 2018/03/18(日) 07:30)
  5. 21:40〜22:05 HUGっと!プリキュア #7「さあやの迷い?本当にやりたいことって何?」(ABCテレビ 2018/03/18(日) 08:30)
  6. 22:06〜22:30 仮面ライダービルド #27「逆襲のヒーロー」(ABCテレビ 2018/03/18(日) 09:00)
  7. 22:30〜22:56 快盗戦隊ルパンレンジャーVS警察戦隊パトレンジャー #6「守るべきものは」(ABCテレビ 2018/03/18(日) 09:30)
  8. 22:56〜23:21 りゅうおうのおしごと! #11「寿」(サンテレビ 2018/03/19(月) 24:30)
  9. 23:21〜23:25 りゅうおうのおしごと!〜かんそうせん〜 #11「将棋界ゆかりの鳩森八幡神社にお参り」(TOKYO MX 2018/03/19(月) 25:00)
  10. 23:26〜23:29 25歳の女子高生 #11「最低最悪の日」(AT-X 2018/03/19(月) 25:55)

Raspberry PiでWordPressサーバを作る

Raspberry Piを自宅のルータに接続して、グローバルの固定IPアドレスを取得せずにダイナミックDNSでホスト名を割り当て、IPアドレスを固定せずにUPnPでポート開放して、PHPMySQLが使えるWebサーバとSSH&SFTPサーバを独自ドメインでインターネット上に公開してみる。
Raspberry PiのOSのダウンロード、解凍、microSDカードへの書き込み、SSHサーバを有効化するための空ファイルの作成、SSH接続によるリモート操作のためにWindows PC等を使用する。
Raspberry Piにディスプレイやキーボードを接続する必要はない。Raspberry Pi Zero等はUSB LANアダプタでルータに接続する必要がある。

OSのダウンロードと解凍

Raspberry Pi公式サイト(英語)の「DOWNLOADS」→「RASPBIAN」→「RASPBIAN STRETCH LITE」の「Download ZIP」で「2018-04-18-raspbian-stretch-lite.zip」をダウンロードしたら解凍して「2018-04-18-raspbian-stretch-lite.img」を取り出す。
Windowsの場合は「2018-04-18-raspbian-stretch-lite.zip」を右クリック→すべて展開→展開で解凍できる。
※コードネーム(RASPBIANに続くSTRETCHの部分)や日付などは更新されると変わる。

microSDカードにOSを書き込む

2GB以上のmicroSDカードを取り付けて、ddコマンド等で「2018-04-18-raspbian-stretch-lite.img」をmicroSDカードに書き込む。
Windowsの場合は、Raspberry Pi公式サイト(英語)の「DOWNLOADS」→「RASPBIAN」→「installation guide」→「Etcher」で、ETCHER公式サイト(英語)の「Download for Windows x64」*1で64ビット版Windowsインストーラーをダウンロードしたら、「Etcher-Setup-1.4.4-x64.exe」を実行→ライセンス契約書が出たら、同意する。
Etcherが起動したら、Select image→先ほど解凍した「2018-04-18-raspbian-stretch-lite.img」を選択して、開く→microSDカード以外が選択されていたら、Changeで変更→Flash!→このアプリがデバイスに変更を加えることを許可しますか?が出たら、はい→Flash Complete!が出たら、Etcherを閉じる。

SSH接続の設定

一旦、microSDカードを取り外して、再度取り付けたら、先頭のFATパーティション(ボリュームラベルがbootのドライブ)にsshの名前で空のファイルを作成する。
Windowsの場合は、スタートメニューを右クリック→ファイル名を指定して実行→名前に「CMD /C "COPY NUL D:\ssh"」と入力して、OK(「D:」の部分はボリュームラベルがbootのドライブ名に置き換える)で空のファイルを作成する。

SSH接続

Raspberry PimicroSDカードとLANケーブルとACアダプタを取り付けて電源を入れると、SSHクライアントから接続先ホスト名にraspberrypi.local、接続先ユーザー名にpi、接続先パスワードにraspberryを指定することでSSH接続できる。
Windowsの場合はmDNSで名前解決できないのでiTunesもしくはBonjour Print Servicesを予めインストールしておく。
Windows 10のsshコマンドは、スタートメニューを右クリック→ファイル名を指定して実行→名前に「ssh 接続先ユーザー名@接続先ホスト名」を入力して、OK(接続できない場合は「DEL %USERPROFILE%\.ssh」でユーザーフォルダ直下の.sshフォルダ内を削除してから再度行う)。初回のみ「Are you sure you want to continue connecting (yes/no)? 」が表示されるので「yes」と入力する。「接続先ユーザー名@接続先ホスト名's password: 」が出たら接続先パスワードを入力する。
Windows 10 Fall Creators Update(バージョン 1709)の場合は標準でsshコマンドが入っていないので、スタートメニュー→設定→アプリ→アプリと機能→オプション機能の管理→機能の追加→OpenSSH Client (Beta)→インストールで、インストールした後に再起動する。
他のWindowsの場合は、PuTTY-ranvis等のSSHクライアントをインストールして使用する。

ホスト名、言語、タイムゾーンの変更

sudoコマンドを使って、rootユーザーでraspi-configコマンドを実行する。(WindowssshコマンドやPuTTYなどを使っている場合、コマンドを1行ずつコピーして、SSH接続している画面上で右クリックすれば貼り付けられる。)

sudo raspi-config

以後、カーソルキーで選択、Tabキーで項目間の移動、スペースキーもしくはEnterキーで決定もしくはチェックのON/OFFとして操作できるので、以下のようにホスト名、言語、タイムゾーンを変更して再起動する。

  1. 2 Network Optionsを選択して、Select→N1 Hostnameを選択して、Select→Ok→raspberrypiを新しいホスト名に変更して、Ok
  2. 4 Localisation Optionsを選択して、Select→I1 Change Localeを選択して、Select→en_GB.UTF-8 UTF-8のチェックをはずして、ja_JP.UTF-8 UTF-8にチェックを入れて、Ok→ja_JP.UTF-8を選択して、Ok
  3. 4 Localisation Optionsを選択して、Select→I2 Change Timezoneを選択して、Select→Asiaを選択して、Ok→Tokyoを選択して、Ok
  4. Finish→Yes(この後、自動的に再起動される)

ユーザー名、パスワードの変更

自分自身のユーザー名は変更することが出来ないので、sudoコマンドが使える一時的なユーザーを別途作成する。「tmpuser」の部分は任意の一時的なユーザー名に置き換える。

sudo useradd -m -G sudo -s /bin/bash tmpuser
sudo passwd tmpuser
exit

一時的なユーザーで接続後、パスワード無しのsudo設定を削除し、標準のユーザー名、ホームディレクトリ、グループ名、パスワードの変更を行う。「newuser」の部分は変更後のユーザー名に置き換える。

sudo rm /etc/sudoers.d/010_pi-nopasswd
sudo usermod -l newuser pi
sudo usermod -d /home/newuser -m newuser
sudo groupmod -n newuser pi
sudo passwd newuser
exit

変更したユーザーで接続後、一時的に作成したユーザーを削除する。「tmpuser」の部分は一時的なユーザー名に置き換える。

sudo userdel -r tmpuser

Raspberry Piファームウェアの更新

rpi-updateコマンドでRaspberry Piファームウェアをアップデートする。

sudo rpi-update

更新があった場合は「*** A reboot is needed to activate the new firmware」と表示されるので、Raspberry Piを再起動する。

sudo reboot

パッケージの更新

Raspbianのパッケージ一覧リストを更新し、インストール済パッケージの更新を行う。

sudo apt-get update
sudo apt-get upgrade -y

NTPサーバで時計を同期

ntpパッケージをインストールする。

sudo apt-get -y install ntp

しばらくしてから「ntpq -p」で行頭に「*」の付いたNTPサーバがあれば同期されている。
必要に応じて/etc/ntp.confを自分のプロバイダや国内のNTPサーバに書き換えて「sudo systemctl restart ntp」で再起動する。

Windows共有

Sambaをインストールするとホスト名.localでなく、ホスト名でもアクセス出来るようになる。
また、ユーザーのホームディレクトリを共有フォルダとしてアクセス出来るように/etc/samba/smb.confを書き換えて、Sambaを再起動する。「newuser」の部分はホームディレクトリを共有フォルダにしたいユーザー名に置き換える。

sudo apt-get -y install samba
sudo sed -i -e '/^\[global\]/a\   unix charset = UTF-8\n   dos charset = CP932' /etc/samba/smb.conf
sudo sh -c "echo '[newuser]' >> /etc/samba/smb.conf"
sudo sh -c "echo '   path = /home/newuser' >> /etc/samba/smb.conf"
sudo sh -c "echo '   guest ok = yes' >> /etc/samba/smb.conf"
sudo sh -c "echo '   read only = no' >> /etc/samba/smb.conf"
sudo sh -c "echo '   force user = newuser' >> /etc/samba/smb.conf"
sudo systemctl restart smbd

Webサーバのインストール

WebサーバのApacheをインストールする。

sudo apt-get -y install apache2

Webブラウザで「http://ホスト名.local/」が開けるか確認する。

PHPのインストール

PHPApachePHPモジュールをインストールする。

sudo apt-get -y install php libapache2-mod-php

下記のように/var/www/html/phpinfo.phpを作成後、Webブラウザから「http://ホスト名.local/phpinfo.php」を開くとPHPの動作確認が出来る。確認後、/var/www/html/phpinfo.phpは削除しておく。

sudo sh -c 'echo '\''<?php phpinfo(); ?>'\'' > /var/www/html/phpinfo.php'

MySQLのインストール

MySQLPHPMySQLモジュールをインストールした後、Apacheを再起動してPHPMySQLモジュールを読み込ませ、MySQLのrooユーザーのパスワードを設定する。「rootpass」の部分はrootに設定するパスワードに置き換える。

sudo apt-get -y install mysql-server php-mysql
sudo systemctl restart apache2
sudo mysql -u root
UPDATE mysql.user SET Password = PASSWORD('rootpass') WHERE User = 'root';
FLUSH PRIVILEGES;
EXIT

MyDNS.JPでドメインを設定してサーバを外部に公開

ダイナミックDNSサービスのMyDNS.JPにユーザ登録してドメイン名を設定する。
無料のドメイン名は末尾が「.mydns.jp」等になる。別途、独自ドメインを取得している場合は取得したサイトでネームサーバーにns0.mydns.jpを設定する(複数設定できる場合は、ns1.mydns.jp、ns2.mydns.jpも設定する)。

  1. MyDNS.JPの「JOIN US」(ユーザー登録)で「氏名」、「住所」、「電話番号」、「メール1」、「確認用キー」を入力して「CHECK」、「以下の内容でよろしければ、OKボタンを押してください。」が出たら「OK」。
  2. 「ご登録ありがとうございました。」が出たら、先ほど入力したメールアドレスに届いたメールでマスターIDとパスワードを確認する。
  3. 「User Login」から「MasterID」と「Password」を入力して「LOG IN」→「DOMAIN INFO」→「Domain」に任意のドメイン名(例:hogehoge.mydns.jp)を入力して「CHECK」、「以下の内容でよろしければ、OKボタンを押してください。」が出たら「OK」。

ポート開放ツールのMiniUPnPをインストールして、5分ごとにWebサーバおよびSSHサーバ(SFTPサーバ)で使用するポートを開放し、MyDNS.JPのダイナミックDNSを更新する設定を追加する。「MasterID」と「Password」の部分はMyDNS.JP登録時に届いたメールのマスターIDとパスワードに置き換える。

sudo apt-get -y install miniupnpc
sudo sh -c 'echo '\''#!/bin/sh'\'' > /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''tmpfile=`mktemp`'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''upnpc -l > $tmpfile 2>&1'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''nowip=`sed -n -e "s/Local LAN ip address : //p" $tmpfile`'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''for port in 22 25 80; do'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''oldip=`sed -n -e "/TCP *$port->/s/.*->\([0-9.]*\):.*/\\1/p" $tmpfile`'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''if [ -n "$oldip" -a "$oldip" != "$nowip" ]; then upnpc -d $port TCP > /dev/null 2>&1; fi'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''upnpc -a $nowip $port $port TCP > /dev/null 2>&1'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''done'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''rm $tmpfile'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo sh -c 'echo '\''wget -O - https://MasterID:Password@www.mydns.jp/login.html > /dev/null 2>&1'\'' >> /usr/local/bin/mydnsupdate.sh'
sudo chmod 700 /usr/local/bin/mydnsupdate.sh
sudo sh -c 'echo '\''*/5 * * * *  root  /usr/local/bin/mydnsupdate.sh'\'' > /etc/cron.d/mydnsupdate'

※エディタ等で/usr/local/bin/mydnsupdate.shを作成する場合は、sudo sh -c 'echo '\''から'\''の間を入力する。ただし、\\1の部分は\1に置き換える(sudo sh -cで実行させる都合上、エスケープさせているので)。

WordPressのインストール

ApacheMySQLPHPがインストールされているので、試しにWordPressApacheのルートディレクトリにインストールしてみる。
WordPressをダウンロードして展開し、Apacheのルートディレクトリに設置、パーミッションを設定した後、MySQLWordPress用のユーザー名とパスワード、データベースを作成する。「wpuser」と「wppass」の部分はWordPress用に任意のユーザー名とパスワード、「wordpress」の部分はWordPress用に任意のデータベース名に置き換える。

wget http://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
sudo rm /var/www/html/*
sudo mv wordpress/* /var/www/html/
rmdir wordpress
sudo chown -R www-data:www-data /var/www/html/
sudo mysql -u root -p
CREATE DATABASE wordpress;
GRANT ALL ON wordpress.* TO wpuser@localhost IDENTIFIED BY 'wppass';
EXIT

Webブラウザでhttp://ホスト名.local/を開いて、日本語→続ける→さあ、始めましょう!→データベース名にwordpress、ユーザー名にwpuser、パスワードにwppassを入力して、送信→インストール実行→サイトのタイトル、ユーザー名、パスワード、メールアドレスを入力して、WordPress をインストールで初回設定を行う。「wpuser」と「wppass」の部分はWordPress用のユーザー名とパスワード、「wordpress」の部分はWordPress用のデータベース名に置き換える。
尚、WordPressは初回設定したURL以外からアクセス出来ないので、ダッシュボード→設定→一般からWordPress アドレス (URL)とサイトアドレス (URL)をMyDNS.JPで指定したドメイン名に書き換えて、変更を保存(この後、エラー404が表示され、http://ホスト名.local/からはアクセス出来なくなる)。

今後の予定

  • Webサーバの任意のディレクトリでCGI使えるようにする
  • ユーザごとのディレクトリを使えるようにする
  • メール送信できるようにする
  • メールサーバを立てる
  • SSL対応にする

*1:32ビット版Windowsの場合は「Download for Windows x64」右隣の「▼」から「Etcher for Windows x86 (32-bit) (Installer)」を選択してダウンロードする