我下载了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]
答案 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/。