无法在Azure WebApp

时间:2015-10-15 12:08:37

标签: java azure elasticsearch azure-web-sites

我下载了ElasticSearch,运行了bin/elasticsearch.bat,它在我的本地计算机上运行。然后我将elasticsearch文件夹添加到我的存储库并更新了deploymentscript(deploy.cmd),添加了这些行:

echo starting ElasticSearch...
elasticsearch-1.7.2\bin\elasticsearch.bat
echo ElasticSearch started!

将我的存储库推送到我的Azure网站后,日志中会出现此错误:

starting ElasticSearch...
Error occurred during initialization of VM
Error: Could not create the Java Virtual Machine.
Could not reserve enough space for object heap
Error: A fatal exception has occurred. Program will exit.

在我的WebApp配置中打开了Java。那么问题是什么?为什么不能创建Java VM?

编辑:Could not reserve enough space for object heap看起来我的内存较少,但我已经用3.5GB RAM试了一下,也发生了错误 - ElasticSearch在本地机器上只使用155 MB RAM)

EDIT2: 经过一些尝试后,我得到一个新的错误日志:

starting ElasticSearch...
[2015-10-15 12:59:18,879][INFO ][node                     ] [Marsha Rosenberg] version[1.7.2], pid[3728], build[e43676b/2015-09-14T09:49:53Z]
[2015-10-15 12:59:18,879][INFO ][node                     ] [Marsha Rosenberg] initializing ...
[2015-10-15 12:59:19,273][INFO ][plugins                  ] [Marsha Rosenberg] loaded [], sites []
[2015-10-15 12:59:20,692][INFO ][env                      ] [Marsha Rosenberg] using [1] data paths, mounts [[Windows (D:)]], net usable_space [13.5gb], net total_space [32gb], types [NTFS]
[2015-10-15 12:59:28,869][INFO ][node                     ] [Marsha Rosenberg] initialized
[2015-10-15 12:59:28,869][INFO ][node                     ] [Marsha Rosenberg] starting ...
{1.7.2}: Startup Failed ...
- ChannelException[Failed to create a selector.]
    IOException[Unable to establish loopback connection]
        SocketException[Address family not supported by protocol family: bind]

3 个答案:

答案 0 :(得分:1)

我怀疑这是因为尝试发出本地请求而失败。有关Azure Web App沙箱限制的详细信息,请参阅usually

答案 1 :(得分:0)

-Djava.net.preferIPv4Stack=true参数传递给elasticsearch.bat

还要确保JAVA_HOME设置为Java 8而不是Java 7. Azure Web Apps上的路径为D:\Program Files\Java\jdk1.8.0_25

另请注意,如果您在同一个VM上运行多个elasticsearch服务器(在同一个应用服务计划中),则不会全部监听9200。默认情况下,我认为elasticsearch会尝试9200 - 9300的端口,所以请看一下stdout。

您可能想在elasticsearch.yml中禁用群集和自动发现,因为无论如何都无法通过设置

来形成群集
node.local: true
discovery.zen.ping.multicast: false
index.number_of_shards: 1
index.number_of_replicas: 0

这对于测试/开发方案来说可能很好,但对于生产,您应该考虑在自己的虚拟机或虚拟机集群上运行elasticsearch,这些虚拟机或虚拟机集群在自己的VNET中运行,并通过VPN将站点加入到VNET。然后,您将拥有一个完整的弹性搜索集群,该集群受VPN保护,Web应用程序将通过它的私有IP与之通信。

最后,请注意elasticsearch.bat正在阻止。如果您在deploy.cmd中执行此操作,它将永久阻止您的部署。 (好吧不是永远,有一个超时,它最终会杀死弹性搜索)。你想尝试从Kudu Console运行它。基本上转到https://<yourSitenName>.scm.azurewebsites.net/DebugConsole,你将有一个cmd窗口来运行。您可以点击Use old console。新旧控制台之间的区别在于新控制台是交互式的(您会在服务器上看到stdout),但是超时为30分钟,而旧控制台不是交互式的(输出只会显示)一旦命令完成运行),但没有超时。

当elasticsearch服务器正在运行时,打开另一个Kudu控制台实例并运行curl localhost:9200以验证它是否正在运行。

答案 2 :(得分:0)

根据我的经验,使用部署脚本在Azure WebApp上启动ElasticSearch不是一种正确的方法。

在文档https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox中,“网络端点侦听”部分说“通过互联网访问应用程序的唯一方法是通过已公开的HTTP(80)和HTTPS(443)TCP端口;应用程序可能无法在其他端口上侦听来自互联网的数据包。“所以我认为你的问题“无法创建JavaVM”是由于ElasticSearch无法将端口9200绑定为HTTP侦听器。

如果要使用ElasticSearch,则应使用Azure VM或从Azure Marketplace设置Facetflow ElasticSearch。有关Azure VM上的Elastic,请参阅https://azure.microsoft.com/en-us/documentation/templates/elasticsearch/,并参阅https://azure.microsoft.com/en-us/marketplace/partners/facetflow/facetflow/以了解Azure上的Facetflow ElasticSearch。

即使您只想将搜索功能添加到您的webapp中,Azure搜索也是一个不错的选择。关于Azure搜索,请参阅https://azure.microsoft.com/en-us/documentation/services/search/