Raspberry Pi Advent Calendar 2019 6日目の記事です
#概要
Raspberry Pi 3を自宅のWebサーバにしてWebアプリをデプロイ、
自宅のネットワーク外からでもアクセスできるようにすることが目標です。
Raspberry Pi 3のOSにはRaspbianを選択。
centOSがなぜか起動できなかったんでこっちでやります。
#手順
##microSDのフォーマット
ラズパイ用のmicroSDをFAT32でフォーマットします。
因みにフォーマットする側のホストOSはLinuxMint18.3'Sylvia'
利用するソフトはgpartedです。
まずは、apt install gparted
でgpartedをインストールした後、起動します。(スーパーユーザ権限で)
すると、GUIでポチポチやるだけでmicroSDをフォーマットできます。
以下はフォーマット後の画面です。
説明の必要がないくらい簡単なので、特に作業の委細は述べません。
##microSDにOSインストール
インストール、とはいっても、公式サイトからダウンロードしたNOOBSの中身ををmicroSDにぶち込んで起動するだけです。
公式が遅い時はミラーからどうぞ。
参考
##LAN外からssh接続できるように設定
OSのインストールが完了したていで話を続けます。
ここからはラズパイ内で設定をいじっていくことになるわけですが、毎回ラズパイ本体にキーボードとマウス、ディスプレイを繋いで作業をするのは面倒なので、sshで接続できるようにします。
まず、sudo raspi-config
でラズパイのssh接続設定を有効にします。
GUIで操作できますので「5. Interfacing Options」→「P2 SSH」と選択し、enabledしてください。
変更はreboot後に適用されます。
次に、ラズパイのローカルipを固定します。固定のファイルは/etc/dhcpcd.conf
になります。ネット上では /etc/network/interfaces
だという記事が多いのですが、どうやらRaspbian Jessieから変更があったらしい。
interface [インターフェース名]
static ip_address=[固定したいローカルip]
static routers=[デフォルトゲートウェイのip]
static domain_name_servers=[DNSサーバのip]
と記述すればipが固定されます。
これでひとまずLAN内からはssh接続ができます。
ssh pi@[固定したip] -p 22
とコマンドを打って接続を確認。
###公開鍵認証方式の設定
ここまでで、パスワード認証方式でのssh接続はできました。しかし、のちのちLAN外から接続するとなると、セキュリティの面で公開鍵認証方式を利用するのが好ましいです。
自分はこの記事の「公開鍵認証方式の設定」を参考にしました。
##ルータのポートフォワーディング設定
LAN外から届いたssh接続をLAN内のラズパイ宛に届けてやるための設定をします。
ご家庭で使用中のルータの設定画面を開いてみてください。
右下の詳細設定を選択します。 「セキュリティー」→「ポート変換」を選択し、ssh(22),http(80),https(443)番ポートへのアクセスを全て先ほどの固定したipが受け取るように設定します。これで外部からアクセスできるはずです。しかしこのままでは、グローバルipが変わってしまった際の対処が面倒。なのでDDNSを取得して解決します。
##DDNSを取得
MyDNSでドメインを取得します。
サイトで登録後、IDとパスワードがメールで来るのでそれをもとにログインします。
ログイン後、「DOMAIN INFO」を選択し、取得したいドメインを記載します。
ドメインが他と干渉しなければOKとでるはずなので、取得は完了。
ただ、ドメインを取得しても、ドメイン名を関連づけたい回線から定期的にIPアドレスを通知しないといけません。
実際、1週間以上通知がないとドメインが使えなくなってしまうみたいです。
通知の方法はいくつかあるのですが、ここではラズパイ側から毎時間httpのbasic認証でアクセスをすることにしました。
#!/bin/sh
wget -O - 'http://ID:PASS@www.mydns.jp/login.html' > /dev/null
こんなシェルスクリプトをcronに書いておく。
そしてcrontab -u pi -e
で設定ファイルに書き込みます。
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 2
easiestって言ってくれるあたり優しさを感じます。
書き込む内容は以下
0 * * * * /etc/cron.hourly/mydns >/dev/null 2>&1
crontab -l
で現在の設定が確認できます。
また、cronの動作の確認は公式サイトのLOG INFOでできるはずです。
ただし、サーバの負荷の関係で同じアクセスに関しては24時間に一度しか表示されないので注意。
参考
https://qiita.com/mizuki_takahashi/items/89699f87fb10d812748a
http://dotnsf.blog.jp/archives/1034948871.html
##デプロイ
なんだかんだここが一番だるい。
Raspbianにapache2が標準でついてたのでもうこれでいいや。
<Directory "/var/www/[laravelapp]/public">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
DocumentRoot "/var/www/[laravelapp]/public"
と記述。
矛盾がないように/var/www/
下でgit clone [リモートリポジトリのURL]
をします。
あとは、php,mysql,composer等入れて各種設定を済ますだけなのだが、ここが一番大変だった。いろいろごちゃごちゃやったので記憶がないです。
phpの拡張機能、特にPDOとか、mbstringあたりのエラーが出まくって大変だった。
php.iniのコメントアウト外し、apache2の再起動とかを忘れると無駄に時間を食います。
そしてやっとこさトップページが出たのでかんせ〜いと思ったら...
###トラブル
ログイン画面や登録画面へ行くと404エラーが出る。
ルーティングはしっかり機能しているはずなのに何で...
原因はすぐにわかりました。
先ほどのapache2.conf
にAllowoverride All
が記述されていないのが原因でした。
これがないとpublic下の.htaccessが動かんらしい。
よくみると、初期状態ではAllowoverride None
となってますね...
参考
同様の理由で、apacheのmod_rewrite機能も有効化しないといけないみたいでした。
sudo a2enmod rewrite
sudo service apache2 restart
で解決。
#おわり
最近作った弐寺のクリアランプマネージャです。(予告なくサービスの公開を終了するかもしれません)→地力Estimator
ぜひこちらの記事も読んでみてください。