摘要:我有一个网站,通过Flask和Elasticsearch进行搜索搜索。当我直接运行flask时,这在我的本地机器和我的服务器(Vultr droplet)上完美运行。但是,当我通过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
}
的pastebin
当用户开始输入时,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调用的某处,但我不知道如何调试它。
很抱歉,如果这篇文章含糊不清或者我留下了重要信息,我很乐意提供。
答案 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_EXCEPTIONS
来This was ultimately fixed。
如果True
,则不会为了不崩溃服务器而传播异常。因此必须明确设置为强制错误显示在日志中。
原来我有一些愚蠢的错误,我尝试打印一个由于编码问题而导致unidecode错误的字符串。为什么这不是我永远不会知道的本地版本的问题