gpt4 book ai didi

ajax - Elasticsearch 在使用 NGINX 和 UWSGI 返回结果时非常不可靠

转载 作者:行者123 更新时间:2023-12-02 23:32:15 27 4
gpt4 key购买 nike

总结 :我有一个网站,可以通过 Flask 和 Elasticsearch 进行搜索。当我直接运行 flask 时,这在我的本地机器和服务器(Vultr 液滴)上完美运行。但是,当我通过 Nginx 和 uWSGI 运行网站时,它突然变得不可靠,返回一些结果,但没有返回其他结果。我不知道如何解决这个问题,可以使用一些建议或指针!

我将尝试提供尽可能多的关于我的设置的信息:

Elasticsearch

服务器运行状况:

   {
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 1,
"active_shards" : 1,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}

这是带有 info from my index 的 pastebin

Javascript、AJAX 和 Flask

当用户开始输入时,jQuery 自动完成会发出一个 AJAX 请求,该请求会被转发到 elasticsearch(通过 Flask),在那里运行查询。结果返回到 javascript 并添加到 HTML。

我怀疑这里有问题,因为在我使用 Nginx 之前它可以正常工作,但不管这里是信息:
  • This is the javascript that uses jQuery autocomplete and AJAX with GET .
  • 这会调用 views.py class 中的 get_search_results()通过 AJAX 调用
  • 最后 get_search_results() 通过 search_database() function 获取自动完成结果

  • 正常工作

    当我通过调试脚本运行 flask 应用程序时,它可以完美运行:
    #!flask/bin/python
    from app import application
    application.run(host='0.0.0.0', debug=True)

    每当我开始输入自动完成功能时,都会立即工作并返回正确的结果。

    问题

    但是,当我通过 Nginx 将网站作为服务运行时,uWSGI 搜索结果有时有效,但有时无效。一些名字被返回,但大多数没有。部分字符串几乎从不返回。我通过以下方式设置服务器(我基本上遵循 this tutorial ):

    这运行 flask 应用:
    #!flask/bin/python
    from app import application

    if __name__ == "__main__":
    application.run()

    此模块由以下 调用uWSGI .ini 创建一个套接字:
    [uwsgi]
    module = run_wsgi

    master = true
    processes = 5

    socket = transfer_website.sock
    chmod-socket = 660
    vacuum = true

    die-on-term = true

    uWSGI 通过 使用此 .ini 启动 Upstart 脚本 :
    description "uWSGI server instance configured to serve Transfer Website"

    start on runlevel [2345]
    stop on runlevel [!2345]

    setuid admin
    setgid www-data

    env PATH=/home/admin/transfer_website/transfer-virt-env/bin
    chdir /home/admin/transfer_website
    exec uwsgi --ini transfer_website.ini

    最后服务器通过 接受请求Nginx 将请求转发到网站套接字。该文件位于/etc/nginx/sites 中(我已经编辑了网站的 IP 地址):
    server {
    listen 80;
    server_name /*my.server.ip.address*/;
    location / {
    include uwsgi_params;
    uwsgi_pass unix:/home/admin/transfer_website/transfer_website.sock;
    }
    }

    我检查了 elasticsearch 日志,似乎根本没有与此问题相关的任何内容。我的猜测是问题出在转发和 AJAX 调用中,但我不知道如何调试它。

    抱歉,如果这篇文章含糊不清,或者我留下了我们的重要信息,我很乐意提供。

    最佳答案

    好吧,我终于解决了。

    首先,我通过查看 chrome 检查 -> 网络选项卡来隔离问题。未返回的结果产生 500 错误。

    经过一些快速的谷歌搜索,我然后 found a way调试和记录 uwsgi 运行 flask 应用程序(以及 500 错误)。我将以下行添加到我的 uwsgi .ini 文件中:

    #location of log files
    logto = file_name.log

    这会将 Flask 应用程序的所有输出记录到此日志文件中。

    但是我仍然没有收到错误,而是应用程序似乎忽略了它并继续。 This was ultimately fixed通过设置 PROPAGATE_EXCEPTIONSTrue在我的配置文件中。

    如果 Debug = False为了不使服务器崩溃,异常不会传播。因此必须明确设置以强制错误显示在日志中。

    结果我遇到了一些愚蠢的错误,我尝试打印一个由于编码问题而导致 unidecode 错误的字符串。为什么这在本地版本上不是问题我永远不会知道

    关于ajax - Elasticsearch 在使用 NGINX 和 UWSGI 返回结果时非常不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109860/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com