SadServersの解説: #4~#6

# 4. "Manhattan": can't write data into database.
## 問題
PostgreSQLにデータを挿入できないという不具合を解消せよという問題. 
    
## 回答
とりあえず問題文に書かれているコマンドを打ってデータの挿入をしようとしてみると, PostgreSQLに接続できなかったというエラーが返ってくる. 
```bash
sudo -u postgres psql -c "insert into persons(name) values ('jane smith');" -d dt
```

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

ステータスを確認すると, `exit`していることが確認できる. 
```bash
sudo systemctl status postgresql
```

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

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

問題文によると, PostgreSQLが使っているディスクは, `/etc/postgresql/14/main/postgresqlconf`の`data_directory`に記述されているとのことなので, `cat`して中身を見るとデータの`/opt/pgdata/main`だと確認できる. 
 ```bash
cat /etc/postgresql/14/main/postgresql.conf
```
    
`df`をしてファイルシステムの全ディスクの使用状況を確認すると, `/opt/pgdata`がマウントされている`/dev/nvmeOn1`の容量が100%であるとわかる. `/opt/pgdata`の中身を整理したいと考える.     
```bash
df /
```

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

.bkはバックアップファイルだと考えられるので, `rm`で削除する. 
```bash
rm -rf /opt/pgdata/file1.bk
```
    
再度`systemctl`でPostgreSQLを起動する. 起動できたら最初と同じようにインサートしてみる.  
ちゃんとレスポンスが帰って来てたらOK. 
```bash
sudo systemctl start postgresql
```
    
# 5. "Tokyo": can't serve web file
## 問題
80番ポートで動いているWebサーバがあり, `/var/www/html/index.html`を表示してくれるはずだが, `curl`をしてもレスポンスが返ってこない. これを解決せよという問題. 
    
## 回答
まず実際にcurlをしてみると, レスポンスが返ってこないことがわかる. 
```bash
curl 127.0.0.1:80
```

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

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

tcpでの80番ポートへの通信がブロックされていたので, このルールを削除する. 
```bash
iptables -D INPUT -p tcp --dport 80 -j DROP
```  
   
再度curlすると今度は403が返ってくるので, apacheが提供してくれているファイルに対する読み取り権限を確認する.  
```bash
ls -l /var/www/html/index.html
```

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

# 6. "Cape Town": Borked Nginx
## 問題
nginxで立てたWebサーバにcurlをするとエラーが出るので, これを解消せよという問題
    
## 回答
実際にcurlすると接続できないというエラーが出ることがわかる
```bash
curl -I http://127.0.0.1:80
 ```

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

該当ファイルを見に行くと, 先頭に余分な;が入っているので, これを取ってあげる
```bash
sudo vi /etc/nginx/sites-enabled/default
```
 
systemdに変更を取り込ませて, nginxを起動する. 
再度curlで確認すると, 500が返ってくることがわかる.   
```bash
sudo systemctl daemon-reload
sudo systemctl start nginx
```
  
journalctlかcatでログを見ると, too many open filesがあり, これが原因だと思われる. 
```bash
sudo journalctl -u nginx
cat /var/log/nginx/error.log
```

nginxの設定に問題があると想定して, nginxの設定ファイルのパスを取得する. 
```bash
sudo nginx -t
```
  
設定ファイルの中身を確認すると, nginx.confにはファイル上限について言及されていなかかったことがわかる.     
```bash
sudo vi /etc/nginx/nginx.conf
```

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

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