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

Elasticsearch very unreliable in returning results with NGINX and UWSGI

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

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

弹性搜索

服务器运行状况:

   {
      "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 之前它工作得很好,但不管这里是信息:

工作正常

当我通过我的调试脚本 运行 我的 Flask 应用程序时,它完美运行:

#!flask/bin/python
from app import application
application.run(host='0.0.0.0', debug=True)

每当我开始输入时,自动完成功能都会立即运行,returns 会得到正确的结果。

问题

然而,当我 运行 网站作为服务通过 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 通过 upstart 脚本:

使用此 .ini 启动
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 调用的某个地方,但我不知道如何调试它。

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

好吧我终于解决了

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

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

#location of log files
logto = file_name.log

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

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

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

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