我正在使用 uWSGI 和 nginx 在 CentOS 服务器上运行 Python Pyramid 应用程序。我使用 SQLAlchemy 作为 ORM,使用 MySQLdb 作为 API,使用 MySQL 作为数据库。该网站还没有上线,所以唯一的流量是我和公司的其他一些员工。我们购买了一些数据来填充数据库,因此最大(也是最常查询)的表是 ~150,000 行。
昨天我快速连续打开了网站的四个新标签,我收到了几个 502 Bad Gateway 错误。我查看了 uWSGI 日志,发现以下内容:
sqlalchemy.exc.OperationalError: (OperationalError) (2006, 'MySQL server has gone away') 'SELECT ge...
Run Code Online (Sandbox Code Playgroud)
重要说明: 此错误不是由 MySQL 的 wait_timeout 引起的。去过也做过。
我想知道这个问题是否是由同时提供并发请求引起的。我让自己成为一个穷人的负载测试员:
for i in {1..10}; do (curl -o /dev/null http://domain.com &); done;
Run Code Online (Sandbox Code Playgroud)
果然,在这十个请求中,至少有一个会抛出 2006 错误,通常更多。有时错误会变得更奇怪,例如:
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'table.id'"
Run Code Online (Sandbox Code Playgroud)
当该列绝对存在并且在所有其他相同请求上工作正常时。或者,这个:
sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been …
Run Code Online (Sandbox Code Playgroud) 我编写了一个快速的 Python 服务器来提供重新采样的图像。例如,一个 URL 可能看起来像http://images.domain.com/resample/100x100/9f362e1994264321.jpg
. 由于重采样图像很昂贵,因此需要一个缓存层。似乎 nginx 反向代理将是一个不错的选择,这里和这里似乎是开始的好地方。
然而,有一个问题。有数百万个图像,因此通过将其存储http://images.domain.com/resample/100x100/9f362e1994264321.jpg
在文件系统中/home/nginx/cache/resample/100x100/9f362e1994264321.jpg
(或类似的东西),最终cache/resample/100x100/
会在其中包含数百万个文件,这将使文件查找效率非常低。
我在存储原始图像的同时通过将它们分布在许多子目录中来处理这个问题,例如9f/36/9f362e1994264321.jpg
. 但是,我不确定如何使用 nginx 做同样的事情。我可以更改 URL 来做同样的事情,如果这是唯一的解决方案,我会这样做,但我宁愿保持 URL 尽可能漂亮。
我可以用 nginx 做到这一点吗?如果没有 nginx,我可以做其他事情吗,比如清漆?