Хорошо, я действительно не понимаю, что здесь происходит. Мой сервер работал около месяца, и все было хорошо. Сервер получал очень мало трафика (около 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)