一次排查伺服器端介面報500錯誤的經歷
1 出現問題情景
該問題來自我實習期間完成的一個部落格後端系統,具體如下:
· 當我辛辛苦苦在編輯器裡完成文章格式修改(字數較多,一般大於3000字;字數較少時不會出現問題),以及相關目錄和標籤的選定,點選提交按鈕打算提交到部落格系統時發現:文章無法提交成功。或者修改文章,重新編輯文章時(PS:編輯後,字數較多,一般大於3000字),提交文章也出現類似問題。
然後,檢視介面呼叫返回值發現:
釋出文章介面和修改文章介面報伺服器500錯誤。
2 排查問題
(1)首先,去伺服器端檢視uwsgi配置的報錯資訊:裡面只給出了具體介面報500錯誤資訊,沒有具體錯誤原因顯示;
(2)然後,去伺服器端檢視nginx的報錯資訊:裡面也只給出了具體介面報500錯誤資訊,沒有具體錯誤原因顯示;
(3)到了現在,就感覺很納悶了。於是,我跑到本地測試相關介面,發現所有介面功能正常使用,沒有什麼報錯資訊提示。到了這一步,可以排除程式碼實現邏輯是沒有問題,那麼問題就應該出現在測試伺服器環境的伺服器部署問題,而且問題可能就出現在資料庫配置部署。
(4)最後,按照(3)的想法,到測試環境開啟部落格系統後端服務的shell環境,執行具體釋出和更新文章的介面方法,直接對後端資料進行新增和更新操作,於是發現以下報錯:
django.db.utils.OperationalError: (1153, Got a packet bigger than 'max_allowed_packet' bytes)
問題果然是出現在資料庫層調用出現的問題。依據問題可知:由於資料寫入量太大,超出mysql資料庫最大單個數據儲存位元組大小,從而導致資料無法寫入或者更新。
3 解決辦法
在測試伺服器,使用root賬號許可權,修改最大位元組數,步驟程式碼如下:
─[[email protected]] - [/etc/mysql] - [Fri Jul 27, 10:30]└─[$] mysql -u root -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 128557Server version: 5.7.20-0ubuntu0.16.04.1-log (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql set global net_buffer_length=1000000;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql set global max_allowed_packet=1000000000;
Query OK, 0 rows affected, 1 warning (0.00 sec)
修改成功後,重新呼叫部落格系統釋出文章和修改文章介面,發現問題得到解決。
4 寫在最後
剛開始遇到這個問題時,發現伺服器500錯誤,排查了好久一直找不到具體報錯原因,也無法作出具體解決方案。於是,到網上查看了一下介面報500伺服器內部錯誤出現的一般原因,發現:
一般出現500伺服器內部錯誤,極可能是呼叫資料庫進行資料查詢、更新、修改或者刪除時出現了邏輯錯誤或者相關錯誤,也就是資料庫層調用出現了錯誤。
出現後,排查日誌和介面返回錯誤提示,可能是找不到報錯資訊,所以最好的方法就是去手動在相應環境下執行一下資料庫層呼叫方法,排查一下具體問題。