我正在运行一个网站应用程序,并且正在使用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

09-11 19:12
查看更多