我正在运行一个网站应用程序,并且正在使用Flask来使用mongoengine查询mongodb数据库。当应用程序尝试查询数据库时出现错误。
我在其中一个容器中安装了mongodb,并且可以成功连接到它。
mongodb: 2019-09-06T03:45:11.801+0000 I NETWORK [conn1] received client metadata from 172.20.0.3:43918 conn1: { driver: { name: "PyMongo", version: "3.9.0" }, os: { type: "Linux", name: "Linux", architecture: "x86_64", version: "3.10.0-957.27.2.el7.x86_64" }, platform: "CPython 3.7.2.final.0" }
Docker安装
version: "3.7"
services:
portfolio:
build: ./portfolio
container_name: portfolio
restart: always
environment:
- APP_NAME=portfolio
expose:
- 8080
links:
- mongodb
admin:
build: ./admin
container_name: admin
restart: always
environment:
- APP_NAME=admin
expose:
- 8089
links:
- mongodb
mongodb:
image: mongo
container_name: mongodb
ports:
- "27017:27017"
nginx:
build: ./nginx
depends_on:
- portfolio
- admin
container_name: nginx
restart: always
ports:
- "80:80"
Python设置:
from flask import Flask
from mongoengine import connect
app = Flask(__name__)
connect('spees_db', host='mongodb://mongodb:27017/spees_db')
当我这样做时发生错误
email_ex = User.objects(email=email).first()
错误堆栈:
nginx | 102.140.206.140 - - [06/Sep/2019:03:53:09 +0000] "GET /register HTTP/1.1" 200 4145 "http://admin.shemoirere.com/login?next=%2F" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" "-"
[pid: 13|app: 0|req: 4/5] 102.140.206.140 () {44 vars in 967 bytes} [Fri Sep 6 03:53:09 2019] GET /register => generated 4145 bytes in 10 msecs (HTTP/1.1 200) 4 headers in 192 bytes (1 switches on core 1)
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "./admin/views.py", line 37, in do_register
email_ex = User.objects(email=email).first()
File "/usr/local/lib/python3.7/site-packages/mongoengine/queryset/manager.py", line 37, in __get__
queryset = queryset_class(owner, owner._get_collection())
File "/usr/local/lib/python3.7/site-packages/mongoengine/document.py", line 207, in _get_collection
db.client.is_primary:
File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 1006, in is_primary
return self._server_property('is_writable')
File "/usr/local/lib/python3.7/site-packages/pymongo/mongo_client.py", line 831, in _server_property
writable_server_selector)
File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 231, in select_server
nginx | 2019/09/06 03:53:50 [error] 6#6: *5 upstream prematurely closed connection while reading response header from upstream, client: 102.140.206.140, server: admin.shemoirere.com, request: "POST /register HTTP/1.1", upstream: "uwsgi://172.20.0.4:8089", host: "admin.shemoirere.com", referrer: "http://admin.shemoirere.com/register"
nginx | 102.140.206.140 - - [06/Sep/2019:03:53:50 +0000] "POST /register HTTP/1.1" 502 559 "http://admin.shemoirere.com/register" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" "-"
address))
File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 189, in select_servers
selector, server_timeout, address)
File "/usr/local/lib/python3.7/site-packages/pymongo/topology.py", line 205, in _select_servers_loop
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No servers found yet
最佳答案
我和您的仓库一起玩,弄清楚了您的问题。这是您的wsgi配置-
[uwsgi]
wsgi-file = run.py
可通话=应用
socket =:8089
流程= 4
线程= 2
大师=真
chmod-socket = 660
真空=真
按期死亡=正确
问题出在processes
参数中。 uwsgi启动一个主进程,然后使用fork()生成工作程序。您在初次启动时正在执行connect
-因此,连接在您的主进程中仍然存在,而您的 child 却得到了错误的副本。当连接发生时,您实际上可以看到mongo上的日志...仅1个! pymongo特别指出fork()与连接不安全。
最简单的解决方法是在该wsgi文件的末尾添加lazy-apps = true
。系统将按预期工作。您还可以设置您的应用程序,以避免在第一次需要它之前实际调用connect
(可能是在第一个请求钩子(Hook)之前?)
https://api.mongodb.com/python/3.9.0/faq.html#is-pymongo-fork-safe