Назад | Перейти на главную страницу

Сбой сервера (ошибка 500) неоднократно (запуск nginx + gunicorn на экземпляре EC2)

Хорошо, я действительно не понимаю, что здесь происходит. Мой сервер работал около месяца, и все было хорошо. Сервер получал очень мало трафика (около 50-100 запросов в день), поэтому я решил, что это должно быть наименьшей из моих проблем. Затем однажды я заметил, что сервер выдает внутреннюю ошибку 500. Я только что перезапустил Gunicorn и Nginx, и все было хорошо. Теперь, примерно через неделю, та же проблема. Я не понимаю, что происходит.

Для некоторого контекста я запускаю приложение Python с использованием Gunicorn с сокетом, переданным Nginx. В рамках своего приложения я инициализировал соединение с базой данных, используя pymysql в качестве глобального, чтобы избежать повторного открытия соединения с базой данных для каждого запроса (я знаю, что это не проблема для нескольких десятков пользователей в день, но я пытаюсь сделать это решение обобщить на гораздо больший объем).

Это результат последних успешных зарегистрированных сообщений Gunicorn, а также первое сообщение об ошибке (которое затем в значительной степени повторяется для каждого последующего запроса). Кажется, что происходит то, что переменная подключения к базе данных каким-то образом удаляется, но я не понимаю, почему и почему это происходит время от времени.

[] (sys) Ready to run...
[2020-03-31 19:21:03 +0000] [8162] [INFO] Starting gunicorn 20.0.4
[2020-03-31 19:21:03 +0000] [8162] [INFO] Listening at: unix:APP_NAME.sock (8162)
[2020-03-31 19:21:03 +0000] [8162] [INFO] Using worker: sync
[2020-03-31 19:21:03 +0000] [8166] [INFO] Booting worker with pid: 8166
[2020-03-31 19:21:03 +0000] [8167] [INFO] Booting worker with pid: 8167
[2020-03-31 19:21:03 +0000] [8169] [INFO] Booting worker with pid: 8169
[2020-04-12 04:16:06 +0000] [8169] [INFO] Worker exiting (pid: 8169)
Loaded
[2020-04-12 04:16:06 +0000] [8167] [INFO] Worker exiting (pid: 8167)
Loaded
[2020-04-12 04:16:06 +0000] [8166] [INFO] Worker exiting (pid: 8166)
Loaded
[2020-04-12 04:16:06 +0000] [8162] [INFO] Handling signal: term
[2020-04-12 04:16:06 +0000] [8162] [INFO] Shutting down: Master    
[] (sys) Starting
[] (sys) Ready to run...
[2020-04-12 04:16:14 +0000] [29732] [INFO] Starting gunicorn 20.0.4
[2020-04-12 04:16:14 +0000] [29732] [INFO] Listening at: unix:APP_NAME.sock (29732)
[2020-04-12 04:16:14 +0000] [29732] [INFO] Using worker: sync
[2020-04-12 04:16:14 +0000] [29736] [INFO] Booting worker with pid: 29736
[2020-04-12 04:16:14 +0000] [29737] [INFO] Booting worker with pid: 29737
[2020-04-12 04:16:14 +0000] [29738] [INFO] Booting worker with pid: 29738
[2020-04-19 00:41:18,150] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/ec2-user/APP_NAME/APP_NAME.py", line 26, in main_page
    add_record("index")
  File "/home/ec2-user/APP_NAME/APP_NAME.py", line 48, in add_record
    db.conn.cursor().execute(qstr)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/connections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_result
    result.read()
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/connections.py", line 1075, in read
    first_packet = self.connection._read_packet()
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/connections.py", line 657, in _read_packet
    packet_header = self._read_bytes(4)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/connections.py", line 707, in _read_bytes
    CR.CR_SERVER_LOST, "Lost connection to MySQL server during query")
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')
[2020-04-19 00:41:18,882] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/ec2-user/APP_NAME/APP_NAME.py", line 26, in main_page
    add_record("index")
  File "/home/ec2-user/APP_NAME/APP_NAME.py", line 48, in add_record
    db.conn.cursor().execute(qstr)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/connections.py", line 516, in query
    self._execute_command(COMMAND.COM_QUERY, sql)
  File "/home/ec2-user/APP_NAME/lib64/python3.6/site-packages/pymysql/connections.py", line 750, in _execute_command
    raise err.InterfaceError("(0, '')")
pymysql.err.InterfaceError: (0, '')
[2020-04-19 04:15:22,832] ERROR in app: Exception on / [GET]

И это соответствующий код Python:

from flask import Flask, redirect, render_template, url_for, request
import pymysql
from datetime import datetime
import os, random
app = Flask(__name__)
db = None

class db_connector():
    def __init__(self):
        self.conn = pymysql.connect(<redacted>)

db = db_connector()

@app.route('/')
@app.route('/index.html')
def main_page():
    add_record("index")
    return render_template("index.html")

def add_record(page_name):
   ip = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
   dtstr = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S")
   qstr = "<SQL insert string redacted>"
   db.conn.cursor().execute(qstr)