6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

raspberry piでnginxのwebサーバが立つまでの手順

Last updated at Posted at 2022-06-21

webサーバーを壊してしまったので備忘録として0からraspberry piを使ってヘッドレスのNginx Webサーバを立ち上げるまでの手順を記します。パンツは履いたままで大丈夫です。

目次

事前に用意するもの
1.CDカードにOSを焼く
2.起動。
3.SSHで接続
4.ユーザーの設定
5.ipアドレスの固定
6.SSHを公開鍵認証に変更
7.Raspiファイアウォールの設定
8.ルーターのポート開放
9.外部からSSH接続
10.ドメインの関連付け(myDNS)
11.web鯖nginxの最新版導入(nginx-1.22.0)
12.SSL証明書発行(Let`s Encrypt)と自動更新

手順を進めるにあたり、username、password、exampleはご自身の環境に合わせて変更してください。

事前に用意するもの

  • 本体 本記事ではraspberry pi 4 model B 8G(以下raspi)
  • type C ケーブル
  • ACアダプター 15W以上(5V,3A)
  • microSDカード
  • microSDカードリーダー
  • MobaXterm(ソフト)
  • ルーター管理者権限
  • 外部ネットワーク
  • ドメイン

amazon 購入リンク紹介
用意するものが分からない場合やおすすめが気になる方はご活用ください。

1.CDカードにOSを焼く(Raspberry pi OS debian11 bullseye)

公式サイトからRaspberry Pi Imagerをダウンロードおよびインストール。インストール中にSDカードをPCに接続。imagerにOSイメージが内包されているため、別途OSのダウンロードは不要。
https://www.raspberrypi.com/software/
image.png
Imagerを起動し、OS、インストール先を選択。今回はraspberry pi OS Lite(64-bit)。右下の歯車からSSH、Wi-fi等の設定をして書き込むをクリックし全自動で完了する。
image.png
2022年の4月にインストールの仕様が新しくなり、bootにファイルを書き込む的な操作は不要になった模様。従来通り、平文でファイルを書き込むとインストールがうまくいかないので注意。設定項目は下記の通り、設定したい項目にチェックを入れる。

  • ホスト名
  • SSHを有効化
    • パスワード認証を使う
    • 公開鍵認証のみを許可する
      • piのためのauthrized_keys
  • ユーザー名とパスワードを設定する。
    • ユーザー名
    • パスワード
  • Wi-Fiを設定する
    • SSID
    • パスワード
    • Wfiを使う国
  • ロケールを設定する
    • タイムゾーン
    • キーボードレイアウト

インジケーターランプがおかしいなと思ったときはこちら

2.起動。

SDカードをRaspiに差し込み電源を接続する。この時、SDカードが少しはみ出てる状態になるが大丈夫、ちゃんと奥まで入っている。
電源投入後数分で初期起動が確立し、インストール時に設定したwifiに自動接続するため、同一LAN内のwinPCからpingコマンドでOSインストール時に設定したホストに撃って帰ってくればインストール成功。以前のデフォルトではraspberrypi.localだった為、今回もこのまま設定をしている。画像ではなぜかipV6になってしまったがwin側でIPv6を有効にしていたらこうなる。
image.png

laspberrypi.localに繋がらない。

ここでつまずいた点として、windows10のバグでmDNSが正常に機能しないことがあり、laspberrypi.localにpingを撃っても名前解決されない場合がある。主環境ではwinを再起動することで一時解決したが、根本的な解決策はwinのアプデを待つことのようだ。解決しない場合このままではSSH接続ができないため、netscan.exe、ルーターの管理画面等でraspberry piのipアドレスを見つけてくる必要がある。ホスト名はあると便利だけど、ipアドレスがわかればなくても今回は困らない。

3.SSHで接続

インストールが確立したら、SSHクライアントからホストに接続する。接続設定はインストール時の記憶を参照。
MobaXtermの場合Session settinngsからSSHを選択し設定項目を入力。
★Bookmark settingのタブでセッション名にパスワード認証である旨を記載すると後々便利。

  • Remote host : raspberrypi.local(繋がらない時はipベタ打ち)
  • ☑specifi username : pi
  • Port : 22
    →OK
    image.png
    ユーザーログインのパスワードが求められるため、入力してログインできれば接続完了。
    image.png
    OSバージョンの確認
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

4.ユーザーの設定

①. rootユーザーにパスワードを設定

sudo passwd root

②. 常用ユーザーの追加(下記は"username"を追加)

sudo adduser username

③. piユーザーの権限確認

pi@raspberrypi:~ $ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev pi spi gpio

④新たに追加したユーザーに権限をコピー

sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input,spi,gpio username

⑤コピーされた権限を確認

pi@raspberrypi:~ $ groups username
username : username adm dialout cdrom sudo audio video plugdev games users input netdev pi spi gpio

⑥piユーザーからフォルダをコピー

sudo cp -r /home/pi/* /home/username

⑦Raspi再起動

sudo reboot

この時にSSHの接続が切れるため、再接続する前にMobaXetermのssh設定からユーザーをpiからusernameに変更するし再接続する。

⑧自動ログインの解除

sudo raspi-config

1 System Options → S5 Boot / Auto Login → B1 Consoleでエンターし、rebootされる。
image.png
image.png
image.png

⑨piユーザーの削除

sudo userdel -r pi

⑩削除されたか確認

username@raspberrypi:~ $ id -a pi
id: ‘pi’: no such user

①~⑩の詳細は下記記事参照

「買ったらまず実施!RaspberryPiのセキュリティ対策 - 手順」- Qiita

5.ipアドレスの固定

wi-fiの設定にidを振る

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

インストール時にwifi接続設定を行った場合は下記設定が記述されているので{}内にpriorityid_strを追記する。priorityはいわゆる優先度でほかのネットワークがない場合は1でよい。id_strはタグでipアドレスを固定するときに使用できる。ダブルクォーテーションの中に自由に設定する。

update_config=1
network={
        ssid="Wifi5G"
        psk=2aee2d9814471e7ba806f59f509393d329f2e66096214acd0b23cb7b0195b5
        priority=1
        id_str="Home"
}

ちなみに、このファイルに同様の形式で記述すれば他のwifiを追加することも可能です。複数network設定がある場合にはpriorityの低い順に優先接続されます。

固定IPの設定

sudo nano /etc/dhcpcd.conf

このファイルには接続するネットワークのip設定が記述されています。コメントアウトでいろいろなことが書いていますが、# Example static IP configuration:のコメントの下部あたりに下記の設定を追記します。

# static IP configuration:

interface wlan0
iface Home inet static
static ip_address=XXX.XXX.XXX.YYY/24
static routers=XXX.XXX.XXX.Z
static domain_name_servers=XXX.XXX.XXX.Z

iface Home inet static部分のHomeはwi-fi設定時のid_strの内容になります。
他のネットワークがある場合にはこの下に iface example ~以降を追記すればwifi別で設定可能です。
動作テストとして、curlコマンドでインターネットにアクセスできているか確かめる。

username@raspberrypi:~ $ curl https://example.com
<!doctype html>
<html>
<head>
~~~~~~
</body>
</html>

IP固定について詳しくは下記ページ参照

「ラズパイで複数のネットワーク設定をする」- Qiita

6.SSHを公開鍵認証に変更

①winで公開鍵と秘密鍵を生成

cmdで書きコマンドを実行

ssh-keygen -t rsa -b 4096 -C "email@example.com"

ファイルの生成場所とパスフレーズが聞かれるので設定する。

②winからRaspiにid_rsa.pubを転送

Raspi側で/home/username/.sshフォルダを作成
この時sudo権限で作成するとハマるので注意

mkdir ~/.ssh

MobaXtermのナビゲーションウィンドウ等から、作成した/home/username/.sshid_rsa.pubを転送する。

id_rsa.pubの内容をauthorized_keysに追加

cd ~/.ssh/
cat id_rsa.pub >> authorized_keys

④パーミッションを変更

chmod 600 authorized_keys
chmod 700 ~/.ssh

⑤転送された公開鍵を削除する。

rm -vi ~/.ssh/id_rsa.pub

⑥公開鍵でssh接続確認

Mobaxterm等で新たにsshセッションを作成。host、username、portを同じにし、advanced SSH settings□Use Private keyにチェックをいれ、①で生成id_rsaを指定する。
★Bookmark settingのタブでセッション名に公開鍵接続である旨を記載すると⑨の確認で便利。
image.png
OKを押して作成したセッションに接続できれば確認OK

⑦パスコード認証など、ssh認証設定の編集

公開鍵での接続確認が終わるまで現在繋がっているSSHセッションを切断しないこと。 最悪の場合、再インストールの刑です。

sudo nano /etc/ssh/sshd_config

下記項目がコメントアウトされているため修正または追記

/etc/ssh/sshd_config

PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no

sshサービスを再起動

sudo /etc/init.d/ssh restart

⑧公開鍵 のみ でアクセスできるか確認

⑦で作成したセッションで接続できることを確認し、「SSHで接続」の項で作成したセッションでは接続できなくなっていれば成功。両方接続できなければ、接続中のセッションからsshd_configの内容を再確認する。
image.png

ここまでうまく事が進めばローカルのwinPCからraspiに公開鍵でssh接続できている。そのほかのセッション設定は削除してもよい。

詳細は下記参照

「買ったらまず実施!RaspberryPiのセキュリティ対策 - ④SSHを公開鍵認証に変更」- Qiita

7.Raspiファイアウォールufwの設定

①aptの更新

sudo apt update && sudo apt upgrade

②ufwのインストール

sudo apt install ufw

③すべてのポートを拒否する。

sudo ufw default deny

④SSHポート22、http 80 https 443を開放

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443

⑤IPv6の除外

sudo nano /etc/default/ufw
# /etc/default/ufw

IPV6=no

⑥ufwの起動

sudo ufw enable

⑦ufwのステータスの確認

username@raspberrypi:~ $ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere

以上、ほかのポートも追加したい場合は④で別のポートを指定する。
詳細は下記参照。

8.SSH用にルーターのポート開放

Buffalo製ルーターの場合で記載します。ルーター機能付きモデム、ONUの場合はそのキャリア製品のルーター設定から解放を行ってください。buffaloの場合デフォルト、ゲートウェイIPアドレスの192.168.11.1にアクセス・ログインし、詳細設定から
コメント 2022-06-19 114802.jpg
セキュリティ>ポート変換
image.png
LAN側IPは5.ipアドレスの固定で行ったRaspiのipを入力。LAN側ポートはSSHの22。プロトコルはTCPでポートは任意の番号を空ける。同様に、80、443も開けておく。

ポート開放設定が出来たら外部から見てポートが開いているか下記サイトで確認する。

9.外部からSSH接続

自分のWAN側IPアドレスを確認し設定したポートで、6.SSHを公開鍵認証に変更「⑥公開鍵でssh接続確認」をテザリング等の外部ネットワークから接続する。

10.ドメインの関連付け(myDNS)

myDNS.jpへip自動通知

本当は、wgetのみでコマンドが通るか確認しますが、手順省略のため初めからcrontabに書き込みテストします。

crontab -e
*/3 * * * * wget -q -O /dev/null http://masterID:Password@ipv4.mydns.jp/login.html

↑3分毎にIP通知
masterIDとPaswordはメールで送られてきたmyDNS.jpのログイン情報に書き換えてください。

no crontab for napspans - using an empty one
crontab: installing new crontab

ip更新確認

MyDNSのLogInfoからipが更新されたか確認する。

https://www.mydns.jp/members/#loginfo
image.png
IPv4 UPDATE:が9.外部からSSH接続のIPと同一になっていればOK

SSH接続確認

9.外部からSSH接続のhostをmyDNSで登録しているドメインに変更し、外部ネットワークからアクセスし、接続できるか確認する。

参考記事

11.web鯖nginxの最新版導入(nginx-1.22.0)

①依存パッケージのインストール

sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring

②nginx署名鍵の取得、インポート

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

③鍵が正しいか確認

gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
出力内容
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>

pubのフィンガープリントが573BFD6B3D8FBC641079A6ABF5BD827BD9BF62であること。

④安定版nginxインポートのためのaptリポジトリ追加

username@raspberrypi:~ $ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian bullseye nginx

nginx公式リポジトリの優先

username@raspberrypi:~ $ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx
Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900

⑤nginxインストール

sudo apt update
sudo apt install nginx

⑥nginxバージョン確認

username@raspberrypi:~ $ nginx -version
nginx version: nginx/1.22.0

⑦nginx設定ファイルの更新

sudo nano /etc/nginx/conf.d/default.conf

デフォルトで設定されているserver_nameを書き換え。

# /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  example.com;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

上書きしてサービスの再起動

sudo service nginx restart

⑧web接続テスト

設定したドメインにhttpでアクセスする。
ブラウザにドメインだけ入力するとデフォルトでhttpsに接続されるため、確認。
Welcome to nginx!が表示されればインストール完了。
image.png

参考記事(nginx公式ドキュメント)

12.SSL証明書発行(Let`s Encrypt)と自動更新

CertBot(Let`s Encryptのクライアント)をインストール

sudo apt install certbot python3-certbot-nginx

証明書の取得

sudo certbot --nginx -d example.com -d www.example.com

実行するとアカウントの作成のために、数点質問があるので答える。
ここでのメールアドレスには証明書の有効期限が切れそうになると通知が来る。また、3個目の質問は勧誘メールの同意なので注意。

napspans@raspberrypi:~ $ sudo certbot --nginx -d napspans.space -d www.napspans.space
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): example@email.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Account registered.

アカウントが作成されると発行が進み、successする。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://napspans.space
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/napspans.space/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/napspans.space/privkey.pem
   Your certificate will expire on 2022-09-18. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again with the "certonly" option. To non-interactively
   renew *all* of your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

⑦nginx設定ファイルの更新で更新したconfigファイルがcertbotによって追記される。

ブラウザからhttpsでアクセスできるか確認する。

証明書の更新

sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/napspans.space.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificates are not due for renewal yet:
  /etc/letsencrypt/live/napspans.space/fullchain.pem expires on 2022-09-18 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

実行結果ではskippedと表示されますが、これは証明書の有効期限が残り30日以内でない場合負荷軽減のため更新しない仕様によるものであり正常動作です。
どうしても成功させてい場合は下記オプションで実行してください。
--force-renew
証明書の有効期限の残りを無視して、過去に発行したすべての証明書を強制的に更新することができます。 ただし、すべての証明書の強制更新を毎日行うことは適切ではなく、Let's Encrypt 認証局のレート制限に引っかかってしまう恐れがあります。

--dry-run
テスト用オプション、実際に更新は行いません

自動更新設定

sudo crontab -e

ルート権限でcrontabに下記実行コマンドを追記する。
更新はsudoで行うためここ重要です。
Linuxでの「Sudo crontab -e」と「crontab -e」の違い

0 0 1 * * sudo certbot renew && systemctl restart nginx

このcrontabで本当に更新されるかは60日後に結果がわかります。
更新審されているかすぐに知りたい方は--force-renewオプションにてcrontabを毎時にし、翌日サイトの証明書を確認してみてください。

参考記事

以上。まとめ

本記事は備忘録として記述しております。おま環の可能性がありますがご承知ください。お疲れ様でした。

amazon 購入リンク

ラズベリーパイ4 コンピューターモデルB 4GB
30日間での最低価格 -20% ¥11,570 税込

スイッチ付き TypeC電源 3A
価格: ¥1,169 税込

microSD 32GB サンディスク
¥1,241 税込

microSD カードリーダー サンディスク
¥1,640 税込

6
9
0

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
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?