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

时间:2016-01-31 03:02:42

标签: ajax nginx elasticsearch flask uwsgi

摘要我有一个网站,通过Flask和Elasticsearch进行搜索搜索。当我直接运行flask时,这在我的本地机器和我的服务器(Vultr droplet)上完美运行。但是,当我通过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之前完美运行,但不管这里是否有信息:

正常工作

当我通过调试脚本运行我的烧瓶应用程序时,它可以完美地运行:

#!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
通过 upstart脚本启动此.ini启动uWSGI:

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调用的某处,但我不知道如何调试它。

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

1 个答案:

答案 0 :(得分:1)

好吧,我终于解决了。

首先,我通过查看chrome inspect来分离问题 - >网络标签。未返回的结果产生500错误。

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

// outside main loop
int enemySlowness = 20;  // adjust this as needed
int enemyMoveTimer = 0;

...
if (++enemyMoveTimer > enemySlowness)
{
    Enemy1Movements(enemy1, l1_map, lastloc);
    enemyMoveTime = 0;
}

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

但是我仍然没有收到错误,而应用程序似乎忽略了它并继续。通过在我的配置文件中将#location of log files logto = file_name.log 设置为PROPAGATE_EXCEPTIONSThis was ultimately fixed

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

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