我正在尝试在我的 CentOS 7 服务器上设置 CouchDB 2.0 实例。我已将其安装并作为 systemd 服务运行,当我使用 127.0.0.1 或 0.0.0.0 从服务器访问它时,它会以友好的 hello world 消息响应
$ curl 127.0.0.1:5984
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache
Software Foundation"}}
$ curl 0.0.0.0:5984
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache
Software Foundation"}}
在我的 local.ini 文件中,我将 bind_address 配置为 0.0.0.0
[httpd]
bind_address = 0.0.0.0
我的理解是,如果我有这个绑定地址,我就可以从防火墙中打开的任何 IP 地址连接到端口 5984
我正在使用firewalld作为我的防火墙,并且我已将其配置为打开端口5984,通过列出公共区域的配置来确认此配置:
$ sudo firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: couchdb2 dhcpv6-client http https ssh
ports: 443/tcp 5984/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
我还在 /etc/firewalld/services/couchdb2.xml 中使用 XML 创建了一个名为 couchdb2 的服务:
<service>
<short>couchdb2</short>
<description>CouchDB 2.0 Instance</description>
<port protocol="tcp" port="5984"/>
</service>
据我所知,现在我应该能够在 5984 上接收连接
但是当我从笔记本电脑上卷曲时,我的连接被拒绝:
$ curl my-server:5984 --verbose
* Rebuilt URL to: my-server:5984/
* Trying <my-ip>...
* connect to <my-ip> port 5984 failed: Connection refused
* Failed to connect to my-server port 5984: Connection refused
* Closing connection 0
当我通过 127.0.0.1 或 0.0.0.0 本地连接到 couchdb 实例时,我可以在我的 couchdb 日志中看到 200 响应:
$ sudo journalctl -u couchdb2
...
[notice] 2017-06-06T00:35:01.159244Z couchdb@localhost <0.3328.0>
222d655c69 0.0.0.0:5984 127.0.0.1 undefined GET / 200 ok 28
[notice] 2017-06-06T00:37:21.819298Z couchdb@localhost <0.5598.0>
2f8986d14b 127.0.0.1:5984 127.0.0.1 undefined GET / 200 ok 1
但是当我从笔记本电脑上退出时,couchdb 日志中没有显示任何有关“连接被拒绝”的错误信息。这说明问题可能出在防火墙上而不是 CouchDB 上,但我对此不太确定。“连接被拒绝”总是防火墙的问题吗?如果 CouchDB 实例出现问题,我会收到其他错误吗?
我尝试通过查看防火墙日志来自己回答这个问题。我通过编辑 /etc/sysconfig/firewalld 中的 FIREWALLD_ARGS 来打开日志记录
FIREWALLD_ARGS=--debug=10
我重新启动了firewalld并确认它在调试级别10运行:
$ sudo systemctl status firewalld
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled;
vendor preset: enabled)
Active: active (running) since Tue 2017-06-13 16:41:26 EDT; 28min ago
Docs: man:firewalld(1)
Main PID: 25209 (firewalld)
CGroup: /system.slice/firewalld.service
└─25209 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid --debug=10
然后我再次从笔记本电脑上 curl,收到连接被拒绝错误,并查看日志:
$ tail -n 64 /var/log/firewalld
2017-06-13 16:41:26 DEBUG1: config.ZoneAdded('trusted')
2017-06-13 16:41:26 DEBUG1:
config.zone.8.GetAll('org.fedoraproject.FirewallD1.config.zone')
2017-06-13 16:41:26 DEBUG1: config.ZoneAdded('work')
2017-06-13 16:41:26
DEBUG1:config.GetAll('org.fedoraproject.FirewallD1.config')
这些是防火墙重新启动时的配置消息。没有记录任何有关拒绝连接的信息。我不确定防火墙是否会记录通过 5984 传递到 CouchDB 的连接。也许它传递到了 CouchDB,这是 CouchDB 的问题?
据我所知,CouchDB 和防火墙都配置正确,但其工作方式与我预期的不同。如果您能提供任何帮助,我将不胜感激,无论您是否知道问题所在,或者您是否能帮助我判断问题是否与 CouchDB 或防火墙有关。
答案1
(这应该更适合作为评论,但我仍然不允许发表评论)
/etc/firewalld/services/
我从来没有像您一样使用过文件,但我的印象是您需要制作firewalld
核心才能实际使用它们。
基于此安装脚本,这些firewalld命令应该会永久启用端口。你可以试试这个吗?
# get a list of active zones.. you might have more.
firewall-cmd --get-active-zones
# firewalld command to allow this port open to dmz
firewall-cmd --zone=public --add-port=5984/tcp --permanent
# Restart the firewalld service
firewall-cmd --reload
然后重新启动 Couchdb 守护进程,例如
/usr/local/etc/rc.d/couchdb start
希望能帮助到你!
答案2
事实证明这是 CouchDB 2.0 的问题。问题实际上出在文档上: http://docs.couchdb.org/en/2.0.0/config/http.html 描述如何向所有主机开放 CouchDB。您可以配置:
[httpd]
bind_address = 0.0.0.0
问题是自 CouchDB 1.6.1 以来文档一直没有更新,而且它们没有错误。现在适当的配置是:
[chttpd]
bind_address = 0.0.0.0