LoginSignup
0
0

SadServersの解説: #4~#6

Posted at

4. "Manhattan": can't write data into database.

問題

PostgreSQLにデータを挿入できないという不具合を解消せよという問題.

回答

とりあえず問題文に書かれているコマンドを打ってデータの挿入をしようとしてみると, PostgreSQLに接続できなかったというエラーが返ってくる.

sudo -u postgres psql -c "insert into persons(name) values ('jane smith');" -d dt

問題文によると, systemdにpostgresqlという名前でサービスが登録されているとのことなので, systemctlでPostgreSQLを起動する.

sudo systemctl start postgresql

ステータスを確認すると, exitしていることが確認できる.

sudo systemctl status postgresql

不具合を詳細に知るために, PostgreSQLのログファイルを見に行く.
一般的にのログファイルは/var/logにあるため, /var/logに対してlsをするとpostgresqlというディレクトリがあることが確認できる. /var/log/postgresqlに対してlsをすると, ログファイルを発見できる.

ls /var/log/postgresql

ログファイルをcatするとエラーの本文があって, ディスクの空き容量がなくてpostmaster.pidファイルを作れなかったということがわかる.

cat /var/log/postgresql/postgresql-14-main.log

問題文によると, PostgreSQLが使っているディスクは, /etc/postgresql/14/main/postgresqlconfdata_directoryに記述されているとのことなので, catして中身を見るとデータの/opt/pgdata/mainだと確認できる.

cat /etc/postgresql/14/main/postgresql.conf

dfをしてファイルシステムの全ディスクの使用状況を確認すると, /opt/pgdataがマウントされている/dev/nvmeOn1の容量が100%であるとわかる. /opt/pgdataの中身を整理したいと考える.

df /

duをしてファイルサイズを確認すると, /opt/pgdata/file1.bkが極端にディスク容量を占めていることがわかる.

du -a /opt/pgdata

.bkはバックアップファイルだと考えられるので, rmで削除する.

rm -rf /opt/pgdata/file1.bk

再度systemctlでPostgreSQLを起動する. 起動できたら最初と同じようにインサートしてみる.
ちゃんとレスポンスが帰って来てたらOK.

sudo systemctl start postgresql

5. "Tokyo": can't serve web file

問題

80番ポートで動いているWebサーバがあり, /var/www/html/index.htmlを表示してくれるはずだが, curlをしてもレスポンスが返ってこない. これを解決せよという問題.

回答

まず実際にcurlをしてみると, レスポンスが返ってこないことがわかる.

curl 127.0.0.1:80

lsofをするとポートでちゃんとリッスンをしてくれていることがわかる.

lsof -i :80

リッスンはできているのにレスポンスが帰ってこないということは, プロセスではなくネットワークの問題かと予想して, ファイアウォールのルール一覧を確認する.

iptables -L

tcpでの80番ポートへの通信がブロックされていたので, このルールを削除する.

iptables -D INPUT -p tcp --dport 80 -j DROP

再度curlすると今度は403が返ってくるので, apacheが提供してくれているファイルに対する読み取り権限を確認する.

ls -l /var/www/html/index.html

ファイル所有者以外は何の権限も持っていなかったので, chmodで読み取り権限を付与してあげる. curlしたらちゃんとレスポンスが帰ってきてたらOK.

sudo chmod 644 /var/www/html/index.html

6. "Cape Town": Borked Nginx

問題

nginxで立てたWebサーバにcurlをするとエラーが出るので, これを解消せよという問題

回答

実際にcurlすると接続できないというエラーが出ることがわかる

curl -I http://127.0.0.1:80

systemctlでステータスを確認すると, 設定ファイルでとあるエラーが起きていることがわかる. (ファイル名は途中で途切れているからlsとかで確認する)

sudo systemctl status nginx

該当ファイルを見に行くと, 先頭に余分な;が入っているので, これを取ってあげる

sudo vi /etc/nginx/sites-enabled/default

systemdに変更を取り込ませて, nginxを起動する.
再度curlで確認すると, 500が返ってくることがわかる.

sudo systemctl daemon-reload
sudo systemctl start nginx

journalctlかcatでログを見ると, too many open filesがあり, これが原因だと思われる.

sudo journalctl -u nginx
cat /var/log/nginx/error.log

nginxの設定に問題があると想定して, nginxの設定ファイルのパスを取得する.

sudo nginx -t

設定ファイルの中身を確認すると, nginx.confにはファイル上限について言及されていなかかったことがわかる.

sudo vi /etc/nginx/nginx.conf

次にsystemd側で問題があると考え, nginxユニットの設定ファイルを見に行くと(このパスはsystemctl statusで取得済み), 明らかにファイル上限を設定してる項目を発見できるので, この行を削除する.

sudo vi /etc/systemd/system/nginx.service

ユニットの設定ファイルを変更したらsystemdに設定を取り込ませて, nginxも再起動する. curlしてちゃんとレスポンスが帰ってきたらOK.

sudo systemctl daemon-reload
sudo sysytemctl restart nginx
0
0
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
0
0