LoginSignup
18
40

More than 3 years have passed since last update.

Raspberry Pi 3をwebサーバにして作ったアプリをデプロイ

Last updated at Posted at 2019-12-05

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をフォーマットできます。
以下はフォーマット後の画面です。
Screenshot at 2019-12-03 14-07-19.png

説明の必要がないくらい簡単なので、特に作業の委細は述べません。

microSDにOSインストール

インストール、とはいっても、公式サイトからダウンロードしたNOOBSの中身ををmicroSDにぶち込んで起動するだけです。

公式が遅い時はミラーからどうぞ。

参考

https://qiita.com/tukiyo3/items/c8555eacb67466b81bc8

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から変更があったらしい。

/etc/dhcpcd.conf
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内のラズパイ宛に届けてやるための設定をします。

ご家庭で使用中のルータの設定画面を開いてみてください。

スクリーンショット 2019-12-04 20.15.46.png
右下の詳細設定を選択します。

スクリーンショット 2019-12-04 20.16.06.png
「セキュリティー」→「ポート変換」を選択し、ssh(22),http(80),https(443)番ポートへのアクセスを全て先ほどの固定したipが受け取るように設定します。

これで外部からアクセスできるはずです。しかしこのままでは、グローバルipが変わってしまった際の対処が面倒。なのでDDNSを取得して解決します。

DDNSを取得

MyDNSでドメインを取得します。

サイトで登録後、IDとパスワードがメールで来るのでそれをもとにログインします。

ログイン後、「DOMAIN INFO」を選択し、取得したいドメインを記載します。
ドメインが他と干渉しなければOKとでるはずなので、取得は完了。

ただ、ドメインを取得しても、ドメイン名を関連づけたい回線から定期的にIPアドレスを通知しないといけません。
実際、1週間以上通知がないとドメインが使えなくなってしまうみたいです。

通知の方法はいくつかあるのですが、ここではラズパイ側から毎時間httpのbasic認証でアクセスをすることにしました。

/etc/cron.hourly/mydns
#!/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が標準でついてたのでもうこれでいいや。

/etc/apache2/apache2.conf
<Directory "/var/www/[laravelapp]/public">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
/etc/apache2/sites-available/000-default.conf
DocumentRoot "/var/www/[laravelapp]/public"

と記述。

矛盾がないように/var/www/下でgit clone [リモートリポジトリのURL]をします。

あとは、php,mysql,composer等入れて各種設定を済ますだけなのだが、ここが一番大変だった。いろいろごちゃごちゃやったので記憶がないです。

phpの拡張機能、特にPDOとか、mbstringあたりのエラーが出まくって大変だった。

php.iniのコメントアウト外し、apache2の再起動とかを忘れると無駄に時間を食います。

そしてやっとこさトップページが出たのでかんせ〜いと思ったら...

トラブル

ログイン画面や登録画面へ行くと404エラーが出る。

ルーティングはしっかり機能しているはずなのに何で...

原因はすぐにわかりました。

先ほどのapache2.confAllowoverride Allが記述されていないのが原因でした。

これがないとpublic下の.htaccessが動かんらしい。

よくみると、初期状態ではAllowoverride Noneとなってますね...

参考

https://qiita.com/msht0511/items/b32122413745d0a3d50a

同様の理由で、apacheのmod_rewrite機能も有効化しないといけないみたいでした。

sudo a2enmod rewrite
sudo service apache2 restart

で解決。

おわり

最近作った弐寺のクリアランプマネージャです。(予告なくサービスの公開を終了するかもしれません)→地力Estimator

ぜひこちらの記事も読んでみてください。

18
40
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
40