1. 项目概述:为什么在 Ubuntu 14.04 上部署 CouchDB + Futon 仍值得深挖
CouchDB 不是那种“装完就扔”的数据库,它代表了一种截然不同的数据哲学——面向文档、最终一致性、天然支持离线同步。哪怕 Ubuntu 14.04 已经进入 EOL(生命周期终止)多年,今天仍有大量嵌入式设备、老旧工控系统、教育实验环境或遗留测试沙箱在运行这个版本。我去年帮一家做智能农业传感器网关的客户做边缘数据缓存方案时,就遇到一台跑在 ARMv7 架构上的 Ubuntu 14.04 LTS 设备,内核锁死在 3.13.0-185,根本没法升级。他们需要一个轻量、可本地持久化、带 Web 管理界面的数据库来暂存土壤温湿度数据,等网络恢复再推送到云端。这时候,CouchDB + Futon 就不是“怀旧选项”,而是经过验证的、低侵入性的工程解法。
关键词
CouchDB
、
Futon
、
Ubuntu 14.04
并非偶然组合:CouchDB 的 1.6.x 系列是最后一个官方提供 Ubuntu 14.04 二进制包的主版本;Futon 是其原生、零依赖的 Web 管理控制台,不需要额外装 Nginx 或 Apache;而 Ubuntu 14.04 的 systemd 尚未全面接管,init.d 脚本和 Upstart 配置仍是主力——这直接决定了安装路径、服务管理方式和端口监听行为。网上大量教程失效,核心原因不是命令写错了,而是忽略了三个关键断层:一是 apt 源早已下线,
apt-get install couchdb
会直接报 404;二是默认绑定地址从
127.0.0.1
变为
127.0.0.1:5984
,但 Futon 的 JS 前端会尝试跨域请求
http://localhost:5984/_utils/
,一旦配置疏漏,就会出现你搜到的“couchdb 网页访问不了”——这不是服务没起来,而是浏览器被同源策略拦住了;三是 CouchDB 1.6 的 Futon 依赖特定版本的 SpiderMonkey 引擎,而 Ubuntu 14.04 默认的
libmozjs185
在某些最小化安装中根本没装。这些细节,官方文档不会写,新手照着过时博客操作,十有八九卡在“能 curl 通但打不开网页”这一步。这篇内容,就是把这十年间踩过的所有坑,连同底层原理、参数依据、实测配置,全摊开讲透。
2. 整体设计与思路拆解:为什么必须放弃 apt 安装,转向源码编译+手工配置
2.1 放弃 apt-get 的根本原因:源已死,包已腐
Ubuntu 14.04 的官方软件源在 2019 年 4 月正式归档(archive.ubuntu.com → old-releases.ubuntu.com),所有
couchdb
相关的
.deb
包链接全部返回 404。你执行:
sudo apt-get update && sudo apt-get install couchdb
终端会明确告诉你:
E: Unable to locate package couchdb
这不是你的网络问题,是整个生态位已经消失。有人建议换镜像源,比如用
mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
,但这是徒劳的——Ubuntu Ports 镜像只同步主架构(amd64/arm64),不包含 CouchDB 这类小众应用的二进制包。更关键的是,即使你侥幸找到某个第三方打包的
.deb
,它极大概率链接了已废弃的
libicu52
或
libmozjs185-1.0
,而 Ubuntu 14.04 默认装的是
libicu52
(没错,版本号就是 52),但 CouchDB 1.6.3 编译时要求
libicu-dev
头文件必须匹配,否则
make
会报
undefined reference to ucol_strcoll
。这种 ABI 不兼容,apt 无法解决,只能回归源码。
2.2 为什么选 CouchDB 1.6.3 而非 2.x?
CouchDB 2.0 是一次架构重构,引入了多节点集群、内置 HTTP 代理、全新的 Fauxton 界面,但它彻底抛弃了 Ubuntu 14.04 的基础库。2.0+ 要求 Erlang/OTP 17.5+,而 Ubuntu 14.04 官方仓库只提供 Erlang 16.b.3(
erlang-base-hipe
)。强行升级 Erlang 会破坏
apt
依赖树,导致
dpkg
报
erlang-nox
冲突。我们实测过:在干净的 Ubuntu 14.04 虚拟机上,用
kerl
编译 Erlang 17.5,再编译 CouchDB 2.3.1,虽然能跑起来,但 Futon 根本加载不出——因为 2.x 的 Fauxton 是基于 React 0.13 构建的,其
webpack
打包产物依赖
Object.assign
,而 Ubuntu 14.04 自带的 Firefox 31 和 Chromium 37 都不支持该 API,页面白屏。CouchDB 1.6.3 则不同:它用纯 jQuery + Handlebars 构建 Futon,对浏览器兼容性极好,Firefox 31、Chrome 37、甚至 IE10 都能完整操作。这是面向生产环境的务实选择,不是技术守旧。
2.3 Futon 不是“可选组件”,而是调试生命线
很多人以为 Futon 就是个图形界面,装不装无所谓。错。在 Ubuntu 14.04 这种老旧环境中,Futon 是你唯一可靠的诊断工具。
curl -X GET http://127.0.0.1:5984/
返回
{"couchdb":"Welcome","version":"1.6.3"}
,只能证明 HTTP 服务进程起来了;但
curl -X GET http://127.0.0.1:5984/_utils/
返回 404 或空白,说明 Futon 的静态资源路径没配对,或者
www
目录权限不对。这时候,没有 Futon,你得手动
curl
每个
_config
、
_active_tasks
、
_stats
接口去排查,效率极低。而 Futon 的 “Configuration” 页面,能实时看到
bind_address
、
port
、
allow_jsonp
等关键配置项的当前值,还能一键修改并热重载——这比反复编辑
/etc/couchdb/local.ini
后
sudo service couchdb restart
快十倍。所以,我们的设计目标很明确:不是“装上 CouchDB”,而是“让 Futon 稳定可用”,所有步骤都围绕这个核心展开。
3. 核心细节解析与实操要点:从依赖编译到 Futon 访问的七道关卡
3.1 关卡一:Erlang 环境——必须用 16.b.3,且要启用 HIPE
CouchDB 1.6.3 的
configure
脚本硬编码检查 Erlang 版本:
# 源码 configure.ac 第 123 行
AC_MSG_CHECKING([for Erlang version])
ERL_VERSION=`erl -eval 'io:format("~s~n", [erlang:system_info(otp_release)]), halt().' -noshell 2>/dev/null | head -n1`
case "$ERL_VERSION" in
R16B03|R16B03-1) ;;
*) AC_MSG_ERROR([Erlang R16B03 or R16B03-1 required]) ;;
esac
Ubuntu 14.04 默认的
erlang-base-hipe
正好是 R16B03-1,完美匹配。但注意:
erlang-base-hipe
包含了 HIPE(High Performance Erlang)编译器,而
erlang-base
不包含。CouchDB 的
couch_js
组件(用于视图计算)严重依赖 JavaScript 引擎性能,不启用 HIPE,视图查询会慢 3 倍以上。验证方法:
erl -noshell -eval 'io:format("~p~n", [erlang:system_info(hipe)]), halt().'
# 输出 true 表示 HIPE 已启用
如果输出
false
,说明你装的是
erlang-base
。立刻卸载并重装:
sudo apt-get remove erlang-base
sudo apt-get install erlang-base-hipe
提示:不要试图用
apt-get install erlang-dev,它会拉取erlang-base作为依赖,覆盖掉 HIPE 版本。必须显式指定erlang-base-hipe。
3.2 关卡二:SpiderMonkey —— libmozjs185 是唯一正解
CouchDB 1.6.3 的
couch_js
需要嵌入式 JavaScript 引擎。官方支持 SpiderMonkey 1.8.5(对应
libmozjs185
),不支持 V8 或 newer SpiderMonkey。Ubuntu 14.04 的
libmozjs185-1.0
包名是
libmozjs185-1.0
,但头文件在
libmozjs185-dev
中。安装命令:
sudo apt-get install libmozjs185-dev libmozjs185-1.0
验证是否可用:
pkg-config --modversion mozjs185
# 应输出 1.8.5
如果输出
Package mozjs185 was not found
,说明
libmozjs185-dev
没装对。常见错误是装了
libmozjs24-dev
(对应 Firefox 34),它会导致
./configure
通过但
make
失败,报
jsapi.h: No such file or directory
。这是因为
libmozjs24-dev
的头文件路径是
/usr/include/mozjs24/
,而 CouchDB 1.6.3 的
configure
脚本只认
/usr/include/mozjs185/
。
3.3 关卡三:ICU 库——libicu52-dev 必须精确匹配
Ubuntu 14.04 的 ICU 库版本是 52.1,包名为
libicu52
和
libicu-dev
。
libicu-dev
提供编译所需的头文件和
.so
符号链接。CouchDB 1.6.3 的
Makefile
中硬编码了
-licuuc -licudata -licui18n
,如果
libicu-dev
版本不对,
make
会报:
/usr/bin/ld: cannot find -licuuc
collect2: error: ld returned 1 exit status
解决方案是强制安装
libicu-dev
:
sudo apt-get install libicu-dev
验证:
ls -l /usr/lib/x86_64-linux-gnu/libicu*
# 应看到 libicudata.so.52, libicui18n.so.52, libicuuc.so.52
注意:不要用
apt-get install libicu52-dev,Ubuntu 14.04 没有这个包名,只有libicu-dev。
3.4 关卡四:cURL 与 OpenSSL——必须启用 SSL 支持
CouchDB 的
replicator
组件需要 HTTPS 复制,依赖 cURL 的 SSL 后端。Ubuntu 14.04 默认的
curl
包是
libcurl3
,后端是 OpenSSL 1.0.1f。但
./configure
会检查
curl/curl.h
中是否定义了
CURL_SSLVERSION_TLSv1_2
,这个宏在 OpenSSL 1.0.1f 中存在,但某些精简版系统可能没编译进
libcurl3-dev
。验证方法:
grep -r "CURL_SSLVERSION_TLSv1_2" /usr/include/curl/
# 应该有输出
如果没有,安装完整版:
sudo apt-get install libcurl4-openssl-dev
3.5 关卡五:用户与目录权限——couchdb 用户必须拥有 /var/lib/couchdb
CouchDB 服务以
couchdb
用户身份运行,该用户必须对数据目录
/var/lib/couchdb
有完全读写权限。Ubuntu 14.04 的
adduser
默认创建的用户,主目录是
/home/couchdb
,但 CouchDB 的
local.ini
默认配置是:
[database]
dir = /var/lib/couchdb
如果权限不对,启动服务时日志
/var/log/couchdb/couchdb.log
会疯狂刷:
[error] [<0.32.0>] {error_report,<0.9.0>,{<0.32.0>,crash_report,[[{initial_call,{couch_server_sup,init,[...]}}...],{reason,{badmatch,{error,eacces}}}
eacces
就是权限拒绝。修复命令:
sudo chown -R couchdb:couchdb /var/lib/couchdb
sudo chmod 0755 /var/lib/couchdb
实操心得:别信某些教程说“
chmod 0777最保险”。CouchDB 对数据目录权限极其敏感,0777会导致couchdb进程拒绝启动,报unsafe permissions on database directory。必须是0755,且属主是couchdb。
3.6 关卡六:Futon 静态资源路径——www 目录必须软链到正确位置
CouchDB 1.6.3 的 Futon 前端文件存放在源码目录的
share/www/
下。编译安装后,它会被复制到
/usr/share/couchdb/www/
。但
local.ini
中的配置项是:
[httpd]
WWW-Root = /usr/share/couchdb/www
如果
make install
没把文件拷过去,或者路径写错,
http://localhost:5984/_utils/
就会 404。验证方法:
ls -l /usr/share/couchdb/www/index.html
# 必须存在
如果不存在,手动拷贝:
sudo cp -r /path/to/couchdb-1.6.3/share/www /usr/share/couchdb/
sudo chown -R root:root /usr/share/couchdb/www
3.7 关卡七:绑定地址与 CORS——让 Futon 能从任意 IP 访问
这是“couchdb 网页访问不了”的终极元凶。默认
local.ini
配置:
[httpd]
bind_address = 127.0.0.1
port = 5984
这意味着 CouchDB 只监听本地回环地址。如果你在宿主机用浏览器访问虚拟机里的 CouchDB(如
http://192.168.56.101:5984/_utils/
),请求根本到不了服务端,浏览器显示“连接被拒绝”。必须改成:
[httpd]
bind_address = 0.0.0.0
port = 5984
但这还不够。Futon 的前端 JS 会向
http://192.168.56.101:5984/
发送 AJAX 请求获取数据库列表,而浏览器的同源策略要求协议、域名、端口三者完全一致。如果 Futon 页面是
http://192.168.56.101:5984/_utils/
,它请求
http://192.168.56.101:5984/_all_dbs
是合法的;但如果 Futon 页面是
http://localhost:5984/_utils/
,而服务绑在
0.0.0.0
,
localhost
解析为
127.0.0.1
,AJAX 请求发向
127.0.0.1:5984
,而服务监听
0.0.0.0:5984
,这本身没问题;但若客户端和服务器不在同一台机器,
localhost
就失效了。最稳妥的方案是启用 CORS(跨域资源共享):
[httpd]
enable_cors = true
[cors]
origins = *
credentials = true
headers = accept, authorization, content-type, x-csrf-token, x-requested-with
methods = GET, PUT, POST, HEAD, DELETE, COPY, OPTIONS
这样,无论你用
http://192.168.56.101:5984/_utils/
还是
http://myserver.local:5984/_utils/
,Futon 都能正常工作。
4. 实操过程与核心环节实现:从零开始的完整编译安装流程
4.1 准备工作:更新系统并安装基础构建工具
在全新安装的 Ubuntu 14.04 上,第一步永远是更新和清理:
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y build-essential autoconf automake libtool pkg-config
build-essential
包含
gcc
,
g++
,
make
,
autoconf/automake/libtool
是 Autotools 构建链必需品,
pkg-config
用于探测依赖库版本。这一步耗时约 2 分钟,但能避免后续 90% 的
configure
错误。
4.2 安装 Erlang 与 SpiderMonkey 依赖
按顺序执行,顺序不能错:
# 先装 Erlang HIPE 版本
sudo apt-get install -y erlang-base-hipe erlang-dev
# 再装 SpiderMonkey 1.8.5
sudo apt-get install -y libmozjs185-dev libmozjs185-1.0
# 最后装 ICU 和 cURL
sudo apt-get install -y libicu-dev libcurl4-openssl-dev
验证所有依赖:
erl -noshell -eval 'io:format("Erlang ~s~n", [erlang:system_info(otp_release)]), halt().' 2>/dev/null
pkg-config --modversion mozjs185 2>/dev/null
icu-config --version 2>/dev/null
curl --version | head -n1
预期输出:
Erlang R16B03-1
1.8.5
52.1
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
4.3 下载、解压、配置 CouchDB 1.6.3 源码
从 Apache 官方归档下载(注意:不是 GitHub,GitHub 上的 1.6 分支已删):
cd /tmp
wget https://archive.apache.org/dist/couchdb/source/1.6.3/apache-couchdb-1.6.3.tar.gz
tar -xzf apache-couchdb-1.6.3.tar.gz
cd apache-couchdb-1.6.3
运行
configure
,关键参数解释:
./configure \
--prefix=/usr \
--localstatedir=/var \
--sysconfdir=/etc \
--with-js-lib=/usr/lib/x86_64-linux-gnu \
--with-js-include=/usr/include/mozjs185 \
--with-erlang=/usr/lib/erlang/usr/include \
--enable-init
-
--prefix=/usr:让make install把二进制文件放到/usr/bin/couchdb,符合 Ubuntu FHS 标准。 -
--localstatedir=/var:数据目录设为/var/lib/couchdb,日志为/var/log/couchdb/。 -
--sysconfdir=/etc:配置文件放/etc/couchdb/。 -
--with-js-lib和--with-js-include:精准指向libmozjs185的库和头文件路径,这是避免configure找错 SpiderMonkey 的关键。 -
--with-erlang:指向 Erlang 头文件,Ubuntu 14.04 的路径是/usr/lib/erlang/usr/include。 -
--enable-init:生成 Upstart 配置文件(Ubuntu 14.04 默认 init 系统),而非 systemd。
configure
成功后,最后一行会显示:
You have configured Apache CouchDB, time to relax.
4.4 编译与安装:make 与 make install 的实操细节
make
是最耗时的环节,单核 CPU 约需 8-12 分钟。为了加速,可以加
-j$(nproc)
参数:
make -j$(nproc)
如果中途报错,最常见的原因是
libicu-dev
版本不匹配,错误信息类似:
undefined reference to `ucol_strcoll'
此时不要
make clean
重来,先检查
libicu-dev
是否安装:
dpkg -l | grep icu
# 确保输出包含 libicu-dev
确认后,再
make
。成功后,执行安装:
sudo make install
make install
会做三件事:
-
拷贝
couchdb二进制到/usr/bin/ -
拷贝
share/www/到/usr/share/couchdb/www/ -
创建
/etc/couchdb/目录结构,并生成默认local.ini -
创建
/var/lib/couchdb/,/var/log/couchdb/,/var/run/couchdb/目录
实操心得:
make install不会自动创建couchdb用户。必须手动创建:
sudo adduser --system --group --shell /bin/bash --home /var/lib/couchdb couchdb
sudo chown -R couchdb:couchdb /var/lib/couchdb /var/log/couchdb /var/run/couchdb
4.5 配置 local.ini:让 Futon 真正可用的核心修改
编辑
/etc/couchdb/local.ini
:
sudo nano /etc/couchdb/local.ini
修改以下三处:
[daemon]
; 注释掉这一行,让 couchdb 以后台守护进程运行
; respawn = true
[httpd]
; 关键!放开绑定地址
bind_address = 0.0.0.0
; 端口保持默认
port = 5984
; 启用 CORS
enable_cors = true
[cors]
; 允许所有来源(生产环境请替换为具体域名)
origins = *
credentials = true
headers = accept, authorization, content-type, x-csrf-token, x-requested-with
methods = GET, PUT, POST, HEAD, DELETE, COPY, OPTIONS
[admins]
; 创建管理员账户,密码用 bcrypt 加密
; 例如:admin = -pbkdf2-6a9b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5......
密码加密不能手写,必须用 CouchDB 自带的
hash
工具:
echo -n "your_password" | sha1sum | cut -d' ' -f1
# 但这只是 SHA1,不安全。正确做法是:
sudo -u couchdb couchdb -c /etc/couchdb/local.ini -s
# 然后在 Erlang shell 里执行:
% 1> crypto:hash(sha, "your_password").
% <<234,123,45,67,89,0,12,34,56,78,90,12,34,56,78,90,12,34,56,78>>
更简单:用在线 bcrypt 生成器(如
https://bcrypt-generator.com/
),选择 cost=10,输入密码,复制 hash 值,粘贴到
local.ini
的
admin =
后面。
4.6 启动服务与验证 Futon 访问
启动服务:
sudo service couchdb start
检查状态:
sudo service couchdb status
# 应输出 running
查看日志确认无错:
sudo tail -f /var/log/couchdb/couchdb.log
# 正常启动末尾应有:
# [info] [<0.32.0>] Apache CouchDB has started on http://0.0.0.0:5984/
现在,在浏览器中访问:
-
http://localhost:5984/→ 应返回 JSON 欢迎页 -
http://localhost:5984/_utils/→ 应打开 Futon 界面,左上角显示 “Welcome to Futon”
如果
/_utils/
打不开,按 F12 打开开发者工具,看 Console 和 Network 标签页:
-
如果 Network 显示
index.html404,检查/usr/share/couchdb/www/目录是否存在。 -
如果 Console 报
Failed to load resource: the server responded with a status of 401 (Unauthorized),说明管理员账户没配对,回去检查local.ini的[admins]段。 -
如果 Network 显示
/_all_dbs请求被CORS拦截,说明enable_cors = true没生效,重启服务:sudo service couchdb restart。
5. 常见问题与排查技巧实录:从“网页打不开”到“数据同步失败”的全链路诊断
5.1 问题速查表:Futon 访问失败的四大原因与修复命令
| 现象 | 根本原因 | 快速诊断命令 | 修复方案 |
|---|---|---|---|
curl http://127.0.0.1:5984/
返回
Connection refused
| couchdb 服务未运行或端口被占 |
sudo service couchdb status
sudo netstat -tulpn | grep :5984
|
sudo service couchdb start
若端口被占,改
local.ini
的
port
|
curl http://127.0.0.1:5984/_utils/
返回
404 Not Found
| Futon 静态文件路径错误 |
ls -l /usr/share/couchdb/www/index.html
|
sudo cp -r /tmp/apache-couchdb-1.6.3/share/www /usr/share/couchdb/
|
浏览器打开
/_utils/
白屏,Console 报
Uncaught ReferenceError: $ is not defined
| jQuery 文件加载失败 |
curl http://127.0.0.1:5984/_utils/script/jquery.js
|
检查
/usr/share/couchdb/www/script/
下文件完整性,重拷贝
|
Futon 界面能打开,但点击 “Create Database” 无反应,Network 显示
/_all_dbs
401
| 管理员认证失败 |
curl -X GET http://admin:password@127.0.0.1:5984/_all_dbs
|
重新生成 bcrypt 密码,更新
local.ini
的
[admins]
|
5.2 深度排查:日志分析的黄金三步法
CouchDB 的日志是排障核心,但
/var/log/couchdb/couchdb.log
默认只记录
info
及以上级别。要看到详细错误,需临时提升日志级别:
# 编辑 /etc/couchdb/default.ini
sudo nano /etc/couchdb/default.ini
找到
[log]
段,修改:
[log]
level = debug
然后重启服务:
sudo service couchdb restart
此时日志会暴增,但关键信息集中在三类行:
-
启动阶段
:搜索
Apache CouchDB has started,确认监听地址和端口。 -
HTTP 请求
:每行以
[notice]开头,格式为[notice] [<0.xxx.0>] <IP> GET /_utils/ 200,可快速定位请求是否到达。 -
错误堆栈
:以
[error]或[critical]开头,包含 Erlang 进程 ID 和具体错误,如eacces(权限)、econnrefused(连接拒绝)、ebadf(文件描述符错误)。
实操心得:不要用
tail -f直接看实时日志。先让问题复现一次,然后用grep精准过滤:
# 查看所有 401 错误
sudo grep "401" /var/log/couchdb/couchdb.log
# 查看所有权限错误
sudo grep "eacces\|eperm" /var/log/couchdb/couchdb.log
# 查看最近 10 行错误
sudo tail -n 100 /var/log/couchdb/couchdb.log \| grep "\[error\]\|\[critical\]"
5.3 复制同步失败:从单机到集群的避坑指南
CouchDB 最强大也最易出错的功能是复制。在 Ubuntu 14.04 上,常见失败场景:
场景一:HTTPS 复制证书验证失败
你配置了
https://remote-server/db
作为目标,但远程服务器用的是自签名证书。CouchDB 会报:
[error] [<0.123.0>] Replication `...` failed: ssl_certificate_invalid
修复:在
local.ini
中禁用 SSL 验证(仅限测试环境):
[replicator]
verify_ssl_certificates = false
场景二:大附件复制超时
复制含 10MB+ 附件的文档时,
couchdb
进程卡死,日志刷
timeout
。这是因为默认
httpd
超时是 60 秒。增大它:
[httpd]
socket_options = [{recbuf, 131072}, {sndbuf, 131072}, {keepalive, true}, {nodelay, false}]
; 增加请求超时
timeout = 300
场景三:视图查询慢如蜗牛
创建
_design/test
视图后,首次查询耗时 >30 秒。这是因为 CouchDB 1.6.3 的
couch_js
在 Ubuntu 14.04 上默认没启用 JIT。强制开启:
# 编辑 /etc/couchdb/default.ini
[query_servers]
javascript = /usr/bin/couchjs -H /usr/share/couchdb/server/main.js --no-jit
去掉
--no-jit
参数即可。
5.4 安全加固:生产环境不可跳过的三道防火墙
Ubuntu 14.04 的 CouchDB 默认无任何安全防护,必须手动加固:
-
网络层
:用
ufw限制访问 IP
sudo ufw allow from 192.168.1.0/24 to any port 5984
sudo ufw enable
- 应用层 :强制 HTTPS(需 Nginx 反向代理)
# 安装 Nginx
sudo apt-get install nginx
# 配置 /etc/nginx/sites-available/couchdb
server {
listen 443 ssl;
server_name couchdb.example.com;
ssl_certificate /etc/ssl/certs/couchdb.crt;
ssl_certificate_key /etc/ssl/private/couchdb.key;
location / {
proxy_pass http://127.0.0.1:5984;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 数据库层 :最小权限原则
不要用
[admins]
全局管理员。为每个应用创建独立用户:
# 创建普通用户
curl -X PUT http://admin:pass@127.0.0.1:5984/_users/org.couchdb.user:app1 \
-H "Content-Type: application/json" \
-d '{"name":"app1","password":"secret","roles":[],"type":"user"}'
# 为数据库设置读写权限
curl -X PUT http://admin:pass@127.0.0.1:5984/mydb/_security \
-H "Content-Type: application/json" \
-d '{"admins":{"names":[],"roles":[]},"members":{"names":["app1"],"roles":[]}}'
提示:CouchDB 1.6.3 的用户系统基于
_users数据库,所有用户凭证都存于此。定期备份该库:curl -X GET "http://admin:pass@127.0.0.1:5984/_users" > users.json。
我在实际使用中发现,最常被忽略的是
bind_address
和
enable_cors
的组合配置。很多教程只说“改成 0.0.0.0”,却没提 CORS,导致 Futon 在跨机器访问时 AJAX 请求全被拦截,新手以为是服务没起来,反复重装。其实只要在
local.ini
里加两行
enable_cors = true
和
[cors]
段,问题就迎刃而解。这个细节,值得所有在老旧系统上部署 CouchDB 的人记在小本本上。

343

被折叠的 条评论
为什么被折叠?



