在Apache服务器/CentosOS 8上运行的Flask应用程序无法连接到Mongo DB Atlas

jgwigjjp  于 2022-11-08  发布在  Apache
关注(0)|答案(1)|浏览(118)

背景
我开发了一个python flask应用程序,该应用程序使用ArcGIS API for JavaScript显示地理空间数据,并通过ArcGIS Online帐户查询要素服务。这些查询的结果将保存到MongoDB Atlas集群。
flask应用程序使用mod_wsgi部署到运行Centos 8的Apache服务器上。它当前正在Heroku/gunicorn部署中工作。
下面是Flask应用程序的app.py代码:

from flask import Flask, render_template, request
from data.database import global_init
from data.database import Query
from data.update import update
from whitenoise import WhiteNoise

app = Flask(__name__)
app.wsgi_app = WhiteNoise(app.wsgi_app)
my_static_folders = (
    './static/css/',
    './static/images/',
    './static/js/',
    './static/layers/'
)
for static in my_static_folders:
    app.wsgi_app.add_files(static)

@app.route("/query", methods=["GET", "POST"])
def query():
    if request.method == 'POST':
        feature = request.json
        feature_name = feature['name']
        feature_region = feature['region']
        feature_query = Query.objects(name=feature_name, region=feature_region)
        if feature_query:
            response = feature_query[0].export()
        else:
            response = ''
        return response

@app.route("/")
def home():
    return render_template("index.html")

if __name__ == "__main__":
    global_init()
    files = ['./static/css/styles.css', './static/js/app.js']
    app.run(debug=True,
            extra_files=files)

下面是wsgi.py文件:


# !/usr/bin/env python

import sys
import site

site.addsitedir('/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages')

sys.path.insert(0, '/var/www/dm.nhmarchive.org/lau-map')

from app import app as application

问题

当应用程序尝试连接到MongoDB Atlas集群以查询/检索数据时会出现此问题。当点击Map上的多边形时,与集群的连接会被拒绝,并在error.log中记录以下错误:

[Thu Oct 21 20:19:46.800129 2021] [wsgi:error] [pid 1430689:tid 139930235827968] [client 99.8.162.56:55543] , referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471649 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665] [2021-10-21 20:20:14,470] ERROR in app: Exception on /query [POST], referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471711 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665] Traceback (most recent call last):, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471715 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471718 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     response = self.full_dispatch_request(), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471721 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471724 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     rv = self.handle_user_exception(e), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471727 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471729 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     reraise(exc_type, exc_value, tb), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471732 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471751 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     raise value, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471757 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471760 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     rv = self.dispatch_request(), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471762 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471765 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     return self.view_functions[rule.endpoint](**req.view_args), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471768 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/app.py", line 51, in query, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471770 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     feature_query = Query.objects(name=feature_name, region=feature_region), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471773 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/mongoengine/queryset/manager.py", line 37, in __get__, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471776 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     queryset = queryset_class(owner, owner._get_collection()), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471778 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/mongoengine/document.py", line 214, in _get_collection, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471786 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     if cls._meta.get("auto_create_index", True) and db.client.is_primary:, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471788 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1031, in is_primary, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471791 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     return self._server_property('is_writable'), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471793 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/pymongo/mongo_client.py", line 856, in _server_property, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471796 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     writable_server_selector), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471798 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/pymongo/topology.py", line 243, in select_server, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471800 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     address)), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471803 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/pymongo/topology.py", line 200, in select_servers, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471805 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     selector, server_timeout, address), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471808 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]   File "/var/www/dm.nhmarchive.org/lau-map/venv/lib/python3.6/site-packages/pymongo/topology.py", line 217, in _select_servers_loop, referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471810 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665]     (self._error_message(selector), timeout, self.description)), referer: http://dm.nhmarchive.org/
[Thu Oct 21 20:20:14.471814 2021] [wsgi:error] [pid 1430925:tid 139930051188480] [client 99.8.162.56:55665] pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 6171cb5aa3baaebd849f82b2, topology_type: Single, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused',)>]>, referer: http://dm.nhmarchive.org/

app.py尝试执行查询时,与MongoDB Atlas cluser的连接似乎被拒绝。下面是用于与database.py中的数据库示例建立连接的代码:

import mongoengine
...
from mongoengine import connect
from dotenv import load_dotenv

# Connects to remote Atlas database

def global_init():
    load_dotenv()
    DB_URI = os.getenv('DB_URI')
    connect(alias='laumap', host=DB_URI)

故障排除

1.将服务器的IP地址添加到Atlas的“IP访问列表”
虽然我把0.0.0.0/0作为IP地址列出(理论上应该允许所有地址,以我的理解),但我把服务器的IP地址添加到列表中,这仍然不起作用。
1.正在将pymongo kwargs添加到MongoEngine connect()
python anywhere上部署Atlas的 flask 应用程序上也出现了类似的问题。他们建议在连接到数据库时添加以下kwargs:

connect(alias='laumap', host=DB_URI, connect=False, maxPoolSize=1)

这似乎也不起作用。
1.添加HTTP方法替代
这是根据官方Flask documentation完成的:

class HTTPMethodOverrideMiddleware(object):
   allowed_methods = frozenset([
       'GET',
 'HEAD',
       'POST',
       'DELETE',
       'PUT',
 'PATCH',
       'OPTIONS'
   ])
   bodyless_methods = frozenset(['GET', 'HEAD', 'OPTIONS', 'DELETE'])

   def __init__(self, app):
       self.app = app

   def __call__(self, environ, start_response):
       method = environ.get('HTTP_X_HTTP_METHOD_OVERRIDE', '').upper()
       if method in self.allowed_methods:
           environ['REQUEST_METHOD'] = method
       if method in self.bodyless_methods:
           environ['CONTENT_LENGTH'] = '0'
       return self.app(environ, start_response)

  app = Flask(__name__)
  app.wsgi_app = HTTPMethodOverrideMiddleware(app.wsgi_app)

我没有在Flask中设置HTTP头的经验,所以我不确定上面的配置是否正确。但是,就目前而言,它没有改变记录的错误。
1.在python交互式会话中测试.env DB_URI变量
作为一个健全的检查,我确保了.env文件中DB_URI的格式是正确的。下面是服务器上python交互式shell中使用的代码:

>>> import mongoengine
 >>> from dotenv import load_dotenv
 >>> load_dotenv()
 True
 >>> import os
 >>> DB_URI = os.getenv('DB_URI')
 >>> mongoengine.connect(alias='laumap', host=DB_URI)
 MongoClient(host=['lau-shard-00-00.sybdh.mongodb.net:27017', 'lau-shard-00- 
 01.sybdh.mongodb.net:27017', 'lau-shard-00-02.sybdh.mongodb.net:27017'], 
 document_class=dict, tz_aware=False, connect=True, retrywrites=True, w='majority', 
 authsource='admin', replicaset='atlas-xvjuv5-shard-0', ssl=True, 
 read_preference=Primary())

1.正在检查SE Linux布尔值
根据this stack overflow post,我尝试将以下值设置为true:

httpd_can_network_connect --> off
httpd_can_network_connect_db --> off

问题

为什么我的flask应用程序无法正确连接到我的MongoDB Atlas集群,而在我的Heroku部署中,以及当我在Apache/CentOS 8服务器上运行flask run时,它却可以正确连接到我的MongoDB Atlas集群?

CentOS 8中是否有一些安全设置需要正确配置,或者Flask应用程序或wsgi脚本中是否有一些内容需要更改?

cld4siwp

cld4siwp1#

从错误信息(最后一行)中可以看出,它不是在尝试连接atlas,而是在尝试连接localhost(如果没有指定主机,则为默认值)。
查看代码,您是否100%确定DB_URI环境变量设置正确?可能需要添加一些日志记录来确认。

相关问题