尝试在本地 ip 连接 apache solr 时,Solrium 得到 "Permission Denied"
Solarium gets "Permission Denied" when trying to connect apache solr at local ip
我在与 apache solr (5.2.1) 相同的物理服务器上有一个 drupal 8 站点。 Drupal 8 使用 search_api_solr contrib 模块,它使用 Solarium(由 composer 安装)通过 http api 与 solr 服务器通信。
我已经成功安装了solr并创建了一个核心。我可以在 linux 命令行上使用 cUrl 查询核心,使用各种 linux 用户。
我可以在浏览器中访问 solr 管理屏幕(通过具有 192.168 ip 或域名解析的 vpn)并查看我在 cli 上创建的核心。
但是,drupal solr 模块无法连接到 solr 服务器核心,如果我使用 drupal 模块创建索引,它会抛出 php 错误:
[错误] 未捕获 PHP 异常 Solarium\Exception\HttpException:"Solr HTTP error: HTTP request failed, Failed to connect to 127.0.0.1: Permission denied" 在 modules/search_api_solr/vendor/solarium/solarium/library/Solarium/Core/Client/Adapter/Curl。php 第 248 行
我的url是这样的:http://127.0.0.1:8983/solr/mycore
我得到同样的错误
http://192.168.254.78:8983/solr/mycore
或
http://127.0.0.1:8080/solr/mycore << 不同端口!
为什么 Solarium 不能将 http 发送到本地 ip?
注意8080上没有监听,所以我怀疑这个http失败与solr服务器无关。
问题原来是这台 CentOS6 机器上的 SELinux 不允许 apache 与端口 8983 通信。
# setenforce 0
我们的错误消失了。
# setenforce 1
错误又回来了
检查/var/log/audit.log.
这是我们看到的:
type=AVC msg=audit(1457115397.149:224568): avc: denied { name_connect } for pid=4029 comm="httpd" dest=8983 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
通知上下文是 httpd_t (apache)
而tcontext是port_t(一个端口)
现在apache默认只能监听http_port_t
端口
SO -- 我们检查是否需要端口“8983”
但首先我们需要"semanage",它由
提供
yum 安装 policycoreutils-python
现在检查现有 http_port_r 的:
# semanage port -l | grep 'http_port_t'
http_port_t TCP 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t TCP 5988
现在让我们添加 8983
# semanage port -a -t http_port_t -p tcp 8983
然后再次检查 -- 是的 8983 在那里
# semanage port -l | grep 'http_port_t'
http_port_t TCP 8983, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t TCP 5988
SELinux 强制执行没有更多错误
我在与 apache solr (5.2.1) 相同的物理服务器上有一个 drupal 8 站点。 Drupal 8 使用 search_api_solr contrib 模块,它使用 Solarium(由 composer 安装)通过 http api 与 solr 服务器通信。
我已经成功安装了solr并创建了一个核心。我可以在 linux 命令行上使用 cUrl 查询核心,使用各种 linux 用户。
我可以在浏览器中访问 solr 管理屏幕(通过具有 192.168 ip 或域名解析的 vpn)并查看我在 cli 上创建的核心。
但是,drupal solr 模块无法连接到 solr 服务器核心,如果我使用 drupal 模块创建索引,它会抛出 php 错误:
[错误] 未捕获 PHP 异常 Solarium\Exception\HttpException:"Solr HTTP error: HTTP request failed, Failed to connect to 127.0.0.1: Permission denied" 在 modules/search_api_solr/vendor/solarium/solarium/library/Solarium/Core/Client/Adapter/Curl。php 第 248 行
我的url是这样的:http://127.0.0.1:8983/solr/mycore
我得到同样的错误http://192.168.254.78:8983/solr/mycore
或
http://127.0.0.1:8080/solr/mycore << 不同端口!
为什么 Solarium 不能将 http 发送到本地 ip?
注意8080上没有监听,所以我怀疑这个http失败与solr服务器无关。
问题原来是这台 CentOS6 机器上的 SELinux 不允许 apache 与端口 8983 通信。
# setenforce 0
我们的错误消失了。
# setenforce 1
错误又回来了
检查/var/log/audit.log.
这是我们看到的:
type=AVC msg=audit(1457115397.149:224568): avc: denied { name_connect } for pid=4029 comm="httpd" dest=8983 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
通知上下文是 httpd_t (apache) 而tcontext是port_t(一个端口)
现在apache默认只能监听http_port_t
端口SO -- 我们检查是否需要端口“8983”
但首先我们需要"semanage",它由
提供yum 安装 policycoreutils-python
现在检查现有 http_port_r 的:
# semanage port -l | grep 'http_port_t'
http_port_t TCP 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t TCP 5988
现在让我们添加 8983
# semanage port -a -t http_port_t -p tcp 8983
然后再次检查 -- 是的 8983 在那里
# semanage port -l | grep 'http_port_t'
http_port_t TCP 8983, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t TCP 5988
SELinux 强制执行没有更多错误