- 投稿日:2020-10-16T18:22:45+09:00
「サイトが見れない!!!!」ってなったときの対応
タイトル見ただけで心臓がキュッってなりますが…
今までの経験からメモ書きしてみました
半分くらい自分用原因究明に使える指標
HTTPのステータスコード
https://developer.mozilla.org/ja/docs/Web/HTTP/Status
これらのうちエラーになるのは400系と500系
ざっくりとした違いは下記
- 400系:アクセス自体ができてない
- 名前解決ができてない
- 権限がない
- サーバーが落ちてる
- 500系:サーバー内部の処理でエラーを吐いて止まってる
- サーバー設定が間違ってる
- サイトを動かしているフレームワークのエラー
どっちかによって対応が変わるのでまずはここを切り分けます
ログファイル
linux系で出力のパスをいじってないなら/var/log/の中に大体のログがあると思います。
apache: /var/log/httpd/ nginx : /var/log/nginx/ nginx+phpならphp-fpmも要確認: /var/log/php-fpm/何が動いてるのかを確認するなら
ps aux
大量の情報が出てくるので、あたりがついてるならさらにgrep
も併用AWSモニタリング
AWSなら結構な情報がコンソールから確認できます
- EC2:
- CPU使用率
- リクエスト数
- ELB:
- レイテンシー
- 稼働サーバー数
- RDS:
- CPU使用率
- 接続数
- 書き込み/読み込みスループット
対応
1、 落ち着く
わりと重要です。
人間テンパるとろくなことをしません…
現状を整理するなり偉い人に相談するなりして心を落ち着かせましょう2、 ステータスコードを確認する
上記の通りアクセスできない原因はいっぱいあるので、これから切り分けます
大概のブラウザで画面にステータスコードが出てるはず3-1、 400系だった場合
原因によってコードが細かく分かれてるので対応はしやすいです
よく見るのは下記
- 400 Bad Request
- リクエストが無効です。新しい機能のリリース直後なら内部で送ってるリクエストがおかしいとか?
- 403 Forbidden
- 権限問題です。IP制限やファイルのパーミッションを確認します
- 404 Not Found
- 後述します
3-2、 500系だった場合
よく見るのは下記
ひとまずエラーログを確認するところから始まります
対応内容はログによって多岐に渡るので割愛
- 500 Internal Server Error
- サーバー内部で何か起きてます。下に出会ったことがあるエラーの一例を載せてます。
- 502 Bad Gateway
- ゲートウェイやProxyとして動作しているサーバがリクエストを実行しようとしたら不正なレスポンスを受け取ってます。
ここからは実例
404 Not Foundの対応
原因が多岐に渡るので別枠にします
あり得るのは
1、サーバーが落ちてる
2、名前解決ができてない
あたりなのでこの辺をチェックします。pingしてみる
ping {IP/ホスト名}で通信テストしてみます
(これはダミーとしてlocalhostにしてます)$ ping localhost PING localhost (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=6.893 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.115 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.076 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.117 ms ^C --- localhost ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.076/1.800/6.893/2.940 ms生きてればとりあえず帰ってきます。
ポート番号を指定したいなら素のpingだとできないので別の方法を使います。
私はnping使ってます。便利
https://qiita.com/Yu-s/items/4b4f683fda374c8ddcc9ログインしてみる
大概sshか何かでログインできるようにしてるはず
前まで出来てたはずのコマンドでログインできないなら落ちてる可能性が高いですAWSならコンソールから確認する
EC2ダッシュボード > インスタンス > インスタンスの状態
から確認できます。stopになってたら落ちてます。
(aws-cliとかオートスケールとか使ってない場合、誰かが意図的に止めた可能性も…自動でstopにはならないはず…)
ステータスチェックが失敗してるかどうかも確認できるので、これが失敗してても落ちてます。ただしインスタンスが自動で再起動を繰り返している場合(=実質落ちてる)でもrunningになってることがありますので注意
ここまででサーバーが生きてるのが確認できたのにドメインでアクセスできない場合おそらく名前解決ができてません
digしてみる
手っ取り早く確認するならこれ
https://www.atmarkit.co.jp/ait/articles/1711/09/news020.htmlnslookupでもできます
https://www.atmarkit.co.jp/ait/articles/1710/27/news021.html$ dig www.google.com ; <<>> DiG 9.10.6 <<>> www.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3344 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 89 IN A 172.217.24.132 ;; Query time: 13 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Fri Sep 11 13:51:58 JST 2020 ;; MSG SIZE rcvd: 59
;; ANSWER SECTION:
がなければ名前解決できてないです500 Internal Server Errorの対応
エラーが起きてる可能性があるのは
- サーバーソフトウェア
- コードを動かしているフレームワーク
の二択なのでとりあえずその二通りのログを見ます。
対応方法はエラー内容によって色々ですが、下記に私が出会ったことのあるエラーを紹介します。ログローテート忘れ
nginxのエラーログで下記が出てました
write() to "/var/log/nginx/access.log" was incomplete: 83 of 314 while logging request「アクセスログを書き込めなかったよ」とのこと。
見に行くと当日のアクセスログだけめちゃくちゃなサイズになってたのでこれでストレージが枯渇したと推測しました。
該当ファイルを削除するととりあえず解消するはずですがアクセスログを削除しても解消せず…
(多分他にも重たいファイルがあったんだと思います)
探す時間が惜しい&オートスケールしてたので新しいサーバーを立ち上げて入れ替えてとりあえず対処しました。で、その間に根本的な原因を調査するとログローテートされてないことに気づきました…
この数日前にnginxのアップデートをしたのですが、その際にログローテート周りの設定ファイルを戻し忘れたようです。
これ以外にもストレージやメモリ枯渇したらアクセスできなくなるので、それを調べるコマンドはメモっておくといいかもですね$ df -h //ストレージ確認 $ free -m //メモリ確認設定変更を起動設定に反映し忘れ@オートスケール
ある日サイトが急に落ちて500エラーが出てたのでエラーログをチェック
cakephp2のログを見ると、数日前に出した新機能関連のエラーが!
直したはず…?と考えてすぐ気付きましたが、その設定変更を起動設定に反映し忘れてました…
どうやら
トラフィックが上がる
=>エラーが再現するオートスケールサーバー起動
=>アクセスできない
の流れだったようです。cakephp2のキャッシュ周りのエラーでキャッシュファイルを削除すれば直る類のものだったので、
キャッシュを再び削除
=>その状態でAMI作成
=>起動設定に指定
で対応できましたまとめ
死ぬほど焦りますが、、
・落ち着く
・原因の切り分け
・偉い人に相談
で大体なんとかなります。
- 投稿日:2020-10-16T16:32:54+09:00
フロントエンジニアがgoのAPIサーバーをサクッとsystemdで自動起動させてみた
systemdでサービス化した方がいいと言われたので、とりあえずやってみた。
①プロジェクトファイル(ここではsample)でgo build
②etc/systemd/systemにapp.serviceを作ります
③app.serviceに下記を記述[Unit] Description=Automatic start server demon [Service] ExecStart=/home/sample/sample WorkingDirectory=/home/ec2-user/sample Restart=always Type=simple User=ec2-user [Install] WantedBy=multi-user.target【解説】
ExecStartで実行ファイルを指定
go buildしたらファイル名と同じバイナリが生成されるので、それを指定WorkingDirectoryで実行するディレクトリを指定
Restart=always alwaysにすることで落ちても自動再起動してくれる
Type=simple 実行完了と判別するタイミングを指定
simple=コマンドが実行されたら
Type=forking=実行したコマンドが終了したら
Type=oneshot=コマンドが完了したらUser 実行するUser
WantedBy=multi-user.target enable時にこのユニットの.wantsディレクトリにリンクを作成する
これはよくわからなかった。④
sudo systemctl deamon-reload
を実行
app.serviceの内容を更新⑤
sudo systemctl enable /home/ec2-user/etc/systemd/system/app.service
を実行
サービスの自動起動を有効にする
*絶対パスで指定すること⑥
sudo systemctl start app.service
を実行これで自動起動されます
- 投稿日:2020-10-16T15:53:55+09:00
Linux kernel version の確認
git から clone してきた linux kernel のソースコードのカーネルバージョンがなんだっけ?ってなった時に確認する手順のメモ。
git clone した kernel code の ディレクトリ直下にある Makefile の先頭(SPDX License の記述があるので 2 行目から)の VERSION, PATCHLEVEL, SEBLEVEL を確認する。
$ cd linux $ cat Makefile #SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 8 SEBLEVEL = 0 EXTRAVERSION = :
- 投稿日:2020-10-16T15:04:52+09:00
viコマンドの備忘録
とりあえずこれだけ知ってれば使えるやつ。
(ってかこれしか使いこなせてない
コマンド 操作 i 挿入モード :w 書込 :q 終了 :wq 書込 +終了 :w !sudo tee % 読取専用ファイル書込 :q! 強制終了 u 変更取消 /文字列 検索 dd 行削除 ctrl + f 次ページ ctrl + b 前ページ
- 投稿日:2020-10-16T14:48:35+09:00
Arch on lvm on luksの構築と初期設定
概要
本記事では、luks(dm-crypt)で暗号化したパーティションにlvmで論理ボリュームを作り、その上にArchLinuxのデスクトップ環境を構築していきます
+--------------+--------------+-----------------+-----------------+ | | | Logical volume1 | Logical volume2 | | Grub | Boot | lv_root | lv_home | | partition | pattition |_ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _| | | | LUKS encrypted partition | | /dev/sda1 | /dev/sda2 | /dev/sda3 | +--------------+--------------+-----------------------------------+ | /dev/sda | +-----------------------------------------------------------------+この方式だとブートローダーと/boot以外の全てのシステムを1つの大きなボリュームに入れて暗号化することができるため、パーティションの構造を隠すことができたり一つのキーで全体のロックを解除することができます
モバイルノートPCを暗号化するにあたって調べたことと構築した手順を備忘録も兼ねて書いておきますdm-crypt・・linux上で用いられる透過的なディスク暗号化サブシステム
luks・・オープンソースの暗号化仕様
lvm・・ストレージを論理的なボリュームに束ねて利用するシステム環境
・uefi-gpt
・cpu: intel i5 x86_64
・メモリ: 8G
・ディスク: 64G注意
・暗号化するとどんな方式であっても必ずオーバーヘッドが発生します。この方式だと僕の環境ではRWとも30%くらいは遅くなっているので、予め仮想マシン等で許容できるか検証をお願いします
・ディスクの故障時やパスワードの紛失時にデータを取り出すことはできません
・ディスクの暗号化で防ぐことができるのは物理的な攻撃のみです
・説明すっ飛ばしてるところも多いのでArchを触ったことがないと厳しいと思います
基本的なインストール手順はこちら->ArchWiki インストールガイド
・vimが嫌だとかよくわからない場合nanoを使ってください
・ディスク名が/dev/sdaでない場合もあるのでlsblk
で確認して適宜書き換えてください例:/dev/nvme0n1の場合 /dev/sdaを/dev/nvme0n1、/dev/sda1を/dev/nvme0n1p1構築
1. 準備
まずはダウンロードしたisoをBalenaEtcherやrufusでUSBに焼き、インストールするPCのEFIから起動
・ip a
でインターネットに接続されていることを確認
・有線で接続していない場合はiwctl
で指示に従ってwifiに接続
・/etc/pacman.d/mirrorlist
で日本のサーバーを一番上に追加し、pacman -Syy
で更新
・loadkeys jp106
で日本語配列のキーボードを追加
・timedatectl set-ntp true
で時刻を合わせる2. ディスクの消去
まずは
shred
コマンドでディスク内のデータを完全に消去する
どうせ暗号化するし寿命が縮まるので多重上書きは必要ないと思う
lsblk -l
でディスクの構成を確認し、インストール先を確認する
ここで間違えると必要なデータが消えてしまうので慎重に
この場合だと/dev/sda
がインストール先shred -n 0 -v -z /dev/sda3. 物理パーティションの作成
完成形がこちら
パーティション1が Grub(ブートローダー)
パーティション2が /boot
パーティション3が /parted /dev/sda Command (): g Command (): n Partition number(): 1 First sector(----): Enter Last sector(----) : +500M Command (): n Partition number(): 2 First sector(----): Enter Last sector(----) : +500M Command (): n Partition number(): 3 First sector(----): Enter Last sector(----) : Enter Command (): t Partition number(): 1 Partition type () : 1 Command (): t Partition number(): 3 Partition type () : 304. パーティションのフォーマットと暗号化
grub用パーティションはfat32に、/bootはext4にフォーマット
mkfs.fat -F32 /dev/sda1 mkfs.ext4 /dev/sda2rootパーティションを暗号化
大文字でYESと入力した後、パスワードを設定
lvmという名前で開き直し、読み書き可能な状態にするcryptsetup -v luksFormat /dev/sda3 cryptsetup open --type luks /dev/sda3 lvm5. 暗号化されたブロックをlvmで分割する
物理ボリューム(pv)を初期化し、その上にボリュームグループ(vg)を作成
ボリュームグループから20GBをrootとして、残りの100%をhomeとして論理ボリューム(lv)を生成
この値は使用するディスクのサイズと好みによって変更する
推奨は2:3くらいpvcreate --dataalignment 1m /dev/mapper/lvm vgcreate vol /dev/mapper/lvm lvcreate -L 20G vol -n lv_root lvcreate -l 100%FREE vol -n lv_home
論理ボリュームをxfsにフォーマット
ext4やbtrfsでも大丈夫mkfs.xfs /dev/vol/lv_root mkfs.xfs /dev/vol/lv_home6. ドライブのマウントとfstabの生成
必要なディレクトリの生成とマウント
mount /dev/vol/lv_root /mnt mkdir /mnt/home mount /dev/vol/lv_home /mnt/home mkdir /mnt/boot mount /dev/sda2 /mnt/boot mkdir /mnt/etcfstabの生成
genfstab -U -p /mnt >> /mnt/etc/fstab cat /mnt/etc/fstab7. ベースシステムのインストール
pacstrap -i /mnt basearch-chroot /mntベースシステム、ネットワークマネージャ、必須パッケージをインストール
linux-ltsやlinux-zenを使用する場合はheadersも書き換える
intel-ucodeはintel製cpuを使用している場合のみインストールpacman -S base-devel linux linux-headers linux-firmware \ networkmanager wpa_supplicant wireless_tools wireless_tools netctl \ lvm2 xfsprogs zsh vim openssh intel-ucode;sshとネットワークマネージャをPC起動時に自動的に起動させる
systemctl enable sshd systemctl enable NetworkManager8.フックを追加
起動時に復号化とlvmボリュームの有効化に必要なカーネルモジュールとツールを読み込むフックを追加
vim /etc/mkinitcpio.confmkinitcpio.confのHOOKの、blockとfilesystemsの間に追加
usb接続の場合keyboard、日本語配列のキーボードを使っている場合keymapが必要になる
前から順番に読み込まれるので正しい順番か確認することmkinitcpio.confkeyboard keymap encrypt lvm2mkinitcpio -p linux9. ロケール、時刻、言語の設定
/etc/locale.gen
内のja_JP.UTF-8
とen_US.UTF-8
の先頭の#を消すvim /etc/locale.genlocale-genで適用
locale-gen時刻を東京に設定
ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime hwclock --systohc --utc export LANG=ja_JP.UTF-810. ユーザーの追加とパスワード設定
ユーザ名は書き換える
ここではzshをデフォルトシェルとしているが、bashやfish等に変更可能passwd useradd -m -G wheel -s /bin/zsh ユーザー名 passwd ユーザー名EDITOR=vim visudo
# wheel ALL=(ALL) ALL
の先頭の#を消す11. GRUBブートローダーのインストール
grub関連をインストール
/etc/default/grubを編集GRUB_ENABLE_CRYPTODISK="~"の先頭の#を外す
GRUB_CMDLINE_LINUX_DEFAULTのloglevel=3とquietの間に追加↓
cryptdevice=/dev/暗号化されたパーティション:lvmのボリューム名:allow-discards
ここでタイポするとめんどくさいことになる
pacman -S grub efibootmgr dosfstools os-prober mtools vim /etc/default/grub/etc/default/grub-# GRUB_ENABLE_CRYPTODISK= cryptdevice=/dev/sda3:vol:allow-discardsmkdir /boot/EFI mount /dev/sda1 /boot/EFI grub-install --target=x86_64-efi --bootloader-id=grub_uefi --recheck cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo grub-mkconfig -o /boot/grub/grub.cfg12. 再起動
exit umount -a reboot -h now13. AURヘルパー(yay)のインストール
sudo pacman -S go git git clone https://aur.archlinux.org/yay.git cd yay; makepkg -si; cd ..; rm -rf yay14. deepin desktop環境(DDE)のインストール
ここではDDEを使用しているが、当然別の環境に置き換えたり追加することもできる
X Window Systemとグラフィックドライバーのインストール
nvidia製グラボで1000番台以降の場合、nvidia nvidia-settings nvidia-utils
を追加インストール
AMDや1000番より古いグラボを使っている場合は必要なパッケージを調べてインストールするyay -S xorg-server xorg-apps xorg-xinit xorg-twm xorg-xclock xterm mesaDDEとログインマネージャのインストール
10/16現在、deepin-extraグループに競合があり正常にインストールできない問題があるため、deepin-extraグループは数字でインストールするパッケージを選択することyay -S lightdm deepin deepin-extralightdmログインマネージャの設定
/etc/lightdm/lightdm.conf
のgreeter-session
の先頭の#を外し=以降をlightdm-deepin-greeter
に書き換えるsudo vim /etc/lightdm/lightdm.conf greeter-session=lightdm-deepin-greetersudo systemctl enable lightdm sudo systemctl start lightdmこれでDDEが立ち上がれば構築は完了
14. 初期設定
zshのテーマをインストール
touch ~/.zshrc yay -S --noconfirm zsh-theme-powerlevel10k-git echo 'source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme' >>! ~/.zshrc日本語フォントのダウンロード
源ノ角ゴシックと白源 (はくげん/HackGen)をダウンロード
ちなみにこの記事のコンソール画面は全部、Hackgen35Nerd Consoleyay -S adobe-source-han-sans-jp-fonts ttf-hackgen日本語入力の設定
fcitxとmozcを使って日本語入力
yay -S fcitx-im fcitx-configtool fcitx-mozc vim ~/.xprofile~/.xprofileを作成し下の3行を追加
再起動後にfcitx Configrationを開きmozcを一番上に追加.xprofileexport GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=”@im=fcitx”その他パッケージのインストール
google-chrome、vscode、virtualbox等のソフトフェアをyayで入れていく
終了
以上で終了です
間違いや質問があればコメント欄にお願いします参考
インストールガイド
dm-crypt/システム全体の暗号化
How to install Arch linux on encrypted lvm
- 投稿日:2020-10-16T13:46:30+09:00
CentOS8をVirtualBoxでインストールしたあと、再起動するとエラーが出る件
CentOS8をインストールするまで
こんにちは。プログラミングを始めて半月ほどのSayaです。
右も左も分からないのですが、エンジニアのOSはLinuxが当たり前?という噂を聞き、
Progateで満足している場合じゃない!と焦って、CentOS8をMacbookairにVirtualBoxを使ってダウンロードとインストールを行いました。これまでYoutube等でたくさんあったプログラミングの情報がCentOSと検索した瞬間にほとんど何も出てこなくなるのはなぜなのでしょうか?
Linuxと検索すれば良かったのでしょうか?私は何か間違えているのか?と不安になりながらも、先輩方がお勧めしている、Linux標準教科書を読み、CentOSをダウンロードすることを決意しました。
しかし、全て見様見真似で行うことしかできない私には大きな壁が...
何と最近CentOS8というのにバージョンアップしたらしく、上記の教科書にはバージョン8については書いてありませんでした...
もう何もかも分からないけど、とりあえずバージョン変わったくらいでどうってことないだろうと、腹をくくり、ダウンロードをすることを決意しました!わかりやすく手順がまとまっているサイトがないか探しました。
いくつかあったのですが、参考にさせていただいたものをご紹介します。・【ISOイメージ】CentOS【GUI】をVirtualBoxで起動さしてみた!!!
・Mac上でVirtualBoxにCentOS 8をインストールして学習環境を構築する無事ダウンロードを終えて(後述しますが実は終えていなかった)、VirtualBoxで仮想マシンを立ち上げていこうと思ったのですが...
CentOSダウンロード後にVirtualBoxで仮想マシンを作成し起動ハードディスクを選択するのですが、起動ハードディスクが無いという問題にぶつかりました。
何でだろうと思って、ダウンロードファイルを開いてみようと思ったら、それが空でした...
まずダウンロードがちゃんとできていませんでした。
ダウンロードに30分弱かかることを今回初めて知りました...
しかもダウンロード途中で「失敗」と出てくるのですが、それを再開と自分で押さないと、そのままダウンロードしないまま終わってしまうんですね。
パソコンの仕様の問題でしょうか?それでも何とかインストールまでたどり着き、やっと終わりだと一安心しかけた時に...
インストール後再起動するのですが、そうすると下記のエラーメッセージが出ました。「You must specify a machine to start, using the command line.
Usage: VirtualBoxVM --startvm
Starts the VirtualBox virtual machine with the given name or unique identifier (UUID).」いろいろ調べたのですが、解決方法分からず...
ちなみに下記のページに行き着いたのですが、回答を見ても、どうすればいいのか私には分かりませんでした(泣)解決方法
それでも諦めず、検索しまくっていたところ、下記ページを見つけました!!!!
こちらの回答どおり、
VM設定でオーディオを無効にする
ということを行った結果、無事CentOSを使うことができました!!!質問された方、回答された方、ありがとうございます!!!!!!
なぜこの記事を書いたのか
上記の解決に至った記事もCentOSではなくUbuntuを使われているんですよね。
あまり大差無いのかもしれないですけど、これだけ情報が溢れているのに、答えまでたどり着くの難しいなと思いました。こんなに答えにたどり着くまで苦労するんだなということを、初学者の私は初めて体験したので、同じ悩みで苦労されている初学者の方を一人でも救えたらという思いで、この記事を書きました。
先輩方からするとレベル低すぎるかもしれませんが(笑)
もっと成長して、技術をアウトプットしていこうと思います!!!ちなみにこのQiita記事書くのも少し苦労しました(笑)
文字サイズを変える方法ありますよね?
普通に検索しても出てこないのは私だけでしょうか?
文字サイズを変えるというのは次の課題にしようと思います...
- 投稿日:2020-10-16T09:08:40+09:00
イメージマウント時NBD socketのセッティングが失敗
事象
イメージマウント時にNBD socketのセッティングが失敗した旨、メッセージが出力。
[root@XXXX ~]# sudo qemu-nbd -c /dev/sda2 CentOS-7-XXXXXXX.qcow2 qemu-nbd: Failed to set NBD socket qemu-nbd: Disconnect client, due to: Failed to read request: Unexpected end-of-file before all bytes were read [root@XXXX ~]#原因
イメージのマウント前にカーネルモジュールの読み込みが必要。
※参照URL↓
https://docs.openstack.org/ja/image-guide/modify-images.html解決策
以下のコマンドでモジュールを読み込み
[root@XXXX ~]# modprobe nbd max_part=16