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/
Imagerを起動し、OS、インストール先を選択。今回はraspberry pi OS Lite(64-bit)
。右下の歯車からSSH、Wi-fi等の設定をして書き込むをクリックし全自動で完了する。
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を有効にしていたらこうなる。
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
ユーザーログインのパスワードが求められるため、入力してログインできれば接続完了。
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される。
⑨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接続設定を行った場合は下記設定が記述されているので{}内にpriority
とid_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/.ssh
にid_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
のタブでセッション名に公開鍵接続である旨を記載すると⑨の確認で便利。
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の内容を再確認する。
ここまでうまく事が進めばローカルの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
にアクセス・ログインし、詳細設定から
セキュリティ>ポート変換
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
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!が表示されればインストール完了。
参考記事(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 税込