Django アプリで 502 エラー
VPS でホストしている Django アプリの挙動がおかしくなりました。
トップページには問題なくアクセス出来るものの、ログインをしようとすると「502 Bad Gateway」のエラーが発生。
どれか一つのアプリではなく、同じサーバーでホストしている複数のアプリで同じ挙動(トップページは表示されるがログイン機能で 502 エラー)が出たので調べました。
サーバーの容量が限界に近い
Ubuntu にログインした所、下記の様に表示されました。
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-137-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Thu Mar 30 17:12:11 JST 2023 System load: 0.02 Processes: 142 Usage of /: 95.0% of 94.40GB Users logged in: 0 Memory usage: 35% IPv4 address for ens3: 133.125.39.81 Swap usage: 28% => / is using 95.0% of 94.40GB
「Usage of /: 95.0% of 94.40GB」との表示で、どうやら容量の 95.0 % を使ってしまっているらしい。
原因はログファイルの肥大化
「sudo du -sh /* | sort -hr」でルートディレクトリ直下をチェック。
$ sudo du -sh /* | sort -hr du: cannot access '/proc/905133/task/905133/fd/4': No such file or directory du: cannot access '/proc/905133/task/905133/fdinfo/4': No such file or directory du: cannot access '/proc/905133/fd/3': No such file or directory du: cannot access '/proc/905133/fdinfo/3': No such file or directory 85G /var 4.2G /usr 701M /home 306M /boot 7.9M /root 6.6M /etc 728K /run 56K /tmp 16K /lost+found 8.0K /srv 4.0K /opt 4.0K /mnt 4.0K /media 4.0K /cdrom 0 /sys 0 /sbin 0 /proc 0 /libx32 0 /lib64 0 /lib32 0 /lib 0 /dev 0 /bin
なるほど「/var」で 85 GB も使っていると。
$ sudo du -sh /var/* | sort -hr 81G /var/log 2.7G /var/lib 1.3G /var/www 103M /var/cache 2.4M /var/spool 2.1M /var/backups 36K /var/tmp 4.0K /var/opt 4.0K /var/mail 4.0K /var/local 4.0K /var/crash 0 /var/run 0 /var/lock
「/var/log」で 81 GB か。
$ sudo du -sh /var/log/* | sort -hr 45G /var/log/syslog 31G /var/log/syslog.1 4.1G /var/log/journal 325M /var/log/syslog.2.gz 193M /var/log/syslog.5.gz 190M /var/log/syslog.6.gz 188M /var/log/syslog.7.gz 164M /var/log/syslog.4.gz 159M /var/log/syslog.3.gz 126M /var/log/btmp 122M /var/log/btmp.1 104M /var/log/nginx 27M /var/log/auth.log.1 21M /var/log/auth.log 2.7M /var/log/auth.log.4.gz 2.1M /var/log/auth.log.3.gz 2.0M /var/log/auth.log.2.gz 1.4M /var/log/mail.log.1 1.3M /var/log/mail.log 776K /var/log/vsftpd.log
「/var/log/syslog」と「/var/log/syslog.1」が大きい。
けどこれって定期的に gz に圧縮されているのか?
ログファイルの容量を下げてみる
とりあえず「sudo logrotate -f /etc/logrotate.conf」を実行し、logrotate を強制的に実行してみました。
$ sudo logrotate -f /etc/logrotate.conf error: destination /var/log/mysql/error.log.1.gz already exists, renaming to /var/log/mysql/error.log.1.gz-2023040500.backup
上記の様にエラーメッセージは出たものの、「syslog.1.gz-2023031800.backup」が作成され、サーバーにログインし直すと容量に空きができました。
「Usage of /: 30.9% of 94.40GB」となっています。
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-137-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Wed Apr 5 07:34:52 JST 2023 System load: 0.3 Processes: 140 Usage of /: 30.9% of 94.40GB Users logged in: 0 Memory usage: 46% IPv4 address for ens3: 133.125.39.81 Swap usage: 22%
Django アプリ復活で解決
ログイン機能が 502 エラーを返していた状況はなくなり、問題なく動く様になりました。
原因は Django のコードに print 文がコメントアウトされずに残っていて、自然言語処理に関する冗長なログがそのまま Gunicorn 経由で出力されていたためでした。