【问题标题】:Elasticsearch very unreliable in returning results with NGINX and UWSGIElasticsearch 在使用 NGINX 和 UWSGI 返回结果时非常不可靠
【发布时间】:2016-05-08 16:24:54
【问题描述】:

总结我有一个网站,可以通过 Flask 和 Elasticsearch 进行搜索。当我直接运行烧瓶时,这在我的本地机器和服务器(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/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 由 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 调用的某个地方,但我不知道如何调试。

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

【问题讨论】:

    标签: ajax nginx elasticsearch flask uwsgi


    【解决方案1】:

    好吧,我终于解决了。

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

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

    #location of log files
    logto = file_name.log
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2016-01-29
      • 2017-05-08
      相关资源
      最近更新 更多