openwrt - uhttpd¶
uhttpd概述¶
uHTTPd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器,目的是成为优秀稳定 的、适合嵌入式设备的轻量级任务的 HTTP 服务器,并且和 OpenWrt 的配置框架 (UCI) 整合。它是管理 OpenWrt 的默认的 Web 服务器,还提供了常规 Web 服务器所有的 功能 。
- uHTTPd**支持TSL(SSL)、CGI和 Lua**,是单线程运行但支持多个实例,例如多个监听端口,每一个都有自己的根目录和其他特性。
- 使用**TLS(HTTPS 支持)时需要安装uhttpd-mod-tls模块**
- 与其他很多 Web 服务器相比, uHTTPd 支持进程内执行 Lua,可以提高 Lua CGI 脚本的执行效率。需要注意的是,LuCI,虽然依赖于 Lua,默认并不是以此方式配置的。
安装¶
- uHTTPd是OpenWrt 的标准HTTP服务器,但是它默认并不会安装在OpenWrt发行版的系统文件中。因为默认的发行版并不包含 Web 用户管理界面,通常 uHTTPd 会作为 Web 接口 LuCI 的依赖模块自动安装
- 如果需要**单独安装**,可以通过以下命令来实现:
配置¶
UCI配置文件是
/etc/config/uhttpd
。uHTTPd的配置和OpenWrt用户接口系统UCI完全集成在一起。 uHTTPd也提供一个初始化脚本/etc/init.d/uhttpd
来启动或停止服务,或者在系统启动时自动启动。
/etc/config/uhttpd
配置文件定义了uhttpd与cert两个部分。uhttpd部分包含常规服务器设置,而cert的部分定义SSL证书的默认值。
名 称 | 类 型 | 必须 | 默认 | 描述 |
---|---|---|---|---|
listen_http | 地址端口列表 | yes(若没设置listen_https) | 无 | 定义服务器的 IP 和端口。指所监听的非加密的地址和端口。如 果仅给出端口号,将同时服务于 IPv4 和 IPv6 请求。使用 0.0.0.0:80 仅绑定在 IPv4 接口,使用[::]:80 仅绑定 IPv6 |
listen_https | 地址端口列表 | yes(若没设置listen_http) | 无 | 指定用于监听加密 HTTPS 访问的端口和地址。格式与 listen_http 相同 |
home | 目录路径 | yes | /www | 定义服务器的文档根目录 |
cert | 文件路径 | yes(若设置listen_https) | /etc/uhttpd.crt | 用于 HTTPS 连接的 ASN.1/DER 证书。在提供 HTTS 连接时必须 提供 |
key | 文件路径 | yes(若设置listen_https) | /etc/uhttpd.key | 用于 HTTPS 连接的 ASN.1/DER 私钥。在提供 HTTPS 连接时必 须提供 |
cgi_prefix | 字符串 | no | /cgi-bin | 定义 CGI 脚本的相对于根目录的前缀。如果没有该选项,CGI 功能将不支持 |
lua_prefix | 字符串 | no | 无 | 定义用于将请求分派到 Lua 解释器的前缀,相对于文档根目录。如果缺少此选项,则禁用 Lua 支持 |
lua_handler | 文件路径 | yes(若设置lua_prefix) | 无 | 用于在服务器启动时初始化 Lua 运行时的 Lua 处理程序脚本 |
script_timeout | 整型数字 | no | 60 | Lua 或 CGI 请求的最大等待时间秒值。如果没有输出产生,则超 时后执行就结束了 |
network_timeout | 整型数字 | no | 30 | 网络活动的最大等待时间,如果指定的秒数内没有网络活动发 生,则程序终止,连接关闭 |
realm | 字符串 | no | 无 | 基本认证的域值,默认为主机名,是当客户端进行基本认证的提 示内容 |
config | 文件路径 | no | 用于基本认证的配置文件 | |
index_file | 文件名 | no | index.html , index.htm, default.html , default.htm | 用于目录的索引文件 |
index_page | 文件名 | no | index.html | 用于目录的索引文件,去取代 index_file |
error_page | 字符串 | no | 无 | 处理404请求的文件或CGI脚本的虚拟URL。必须以“/”开头 |
no_symlinks | 布尔型 | no | 0 | 不创建符号链接 |
no_dirlists | 布尔型 | no | 0 | 不生成目录列表 |
rfc1918_filter | 布尔型 | no | 1 | 拒绝来自 RFC1918 IP 地址的指向服务器公共 IP 的请求。这是 DNS 重新绑定对策 |
http_keepalive | 整型数字 | no | 20 | 连接重用(有点bug) |
tcp_keepalive | 整型数字 | no | 无 | tcp 心跳检测时间间隔,发现对端已不存在时则关闭连接。设置 为 0 则关闭 tcp 心跳检测 |
max_requests | 整型数字 | no | 无 | 最大的并行请求数,如果大于这个值,后续的请求将进入排队队 列中 |
max_connections | 整型数字 | no | 100 | 最大并发连接数。如果超过此数量,进一步的 TCP 连接尝试将排队,直到活动连接数再次降至限制以下。 |
ubus_prefix | 字符串 | no | 无 | 通过 JSON-RPC handler 的 UBUS的前缀,例如/ubus。如果没有指定,那么UBUS就不会被启用 |
ubus_socket | 文件路径 | no | 无 | 覆盖 ubus 套接字路径 |
ubus_noauth | 布尔型 | no | 0 | 不对UBUS会话api的JSON-RPC请求进行认证 |
ubus_cors | 布尔型 | no | 0 | 在 JSON-RPC api 上启用 CORS HTTP 标头 |
示例¶
配置文件中必须包含文档根目录(home)和HTTP监听端口。 如最小配置文件:
多实例配置,每一个uhttpd 部分必须以不同的方式命名。
#多端口多实例
config 'uhttpd' 'main'
option 'listen_http' '80'
option 'home' '/wwww'
config 'uhttpd' 'other'
option 'listen_http' '8080'
option 'home' '/www'
HTTPS 启用与证书设置¶
-
uhttpd 使用 HTTPS/TLS,需要添加加密库。例如
libuhttpd-mbedtls,libuhttpd-openssl 或 libuhttpd-wolfssl
。 -
在 uhttpd 部分需要定义 listen_https 等选项。
-
uhttpd 需要 X.509 证书和私钥。
- 可以手动创建并将
server.crt,server.key
复制到配置中指定的位置。 - 可以安装
luci-ssl
数据包,会使用px5g
脚本生成证书。使用此实用程序,init 脚本将在服务器首次启动时(通过重新启动或手动重启)生成适当的自签名证书和密钥文件。
cert 部分配置参数:
名 称 | 类型 | 必须 | 默认 | 描述 |
---|---|---|---|---|
days | 整型数字 | no | 730 | 生成的证书的有效期(以天为单位) |
bits | 整型数字 | no | 2048 | 生成的 RSA 密钥的大小(以位为单位) |
country | 字符串 | no | ZZ | 证书颁发者的ISO国家代码 |
state | 字符串 | no | Somewhere | 证书颁发者的状态 |
locatio | 字符串 | no | Unknown | 证书颁发者的位置/城市 |
commonname | 字符串 | no | OpenWrt | 证书涵盖的通用名称 |
key_type | 字符串 | no | rsa | 私钥类型 rsa 或 ec。 |
ec_curve | 字符串 | no | P-256 | 用于指定使用的椭圆曲线。当key_type设置为ECDSA时有效。P-256 或 P-384 |
RSA是一种传统的非对称加密算法,而ECDSA则是一种基于椭圆曲线的非对称加密算法。ECDSA使用椭圆曲线进行密钥生成和签名验证,不同的椭圆曲线参数会影响加密强度和性能。常见的椭圆曲线包括secp256r1和secp384r1等。
示例:
config uhttpd main
option home /www
list listen_http 0.0.0.0:80
list listen_https 0.0.0.0:443
option redirect_https 1
option cert /etc/ssl/uhttpd/server.crt
option key /etc/ssl/uhttpd/server.key
基本认证¶
出于向后兼容的考虑,uhttpd使用旧的Busybox httpd配置文件
/etc/httpd.conf
来定义认证区域以及相关的用户名和密码。该配置文件不是UCI格式的,通常由webif (X-Wrt)等外部包提供或生成。
身份验证领域的定义格式为 prefix:username:password
,每行有一个条目,后面跟着换行符。
- prefix 是域覆盖的URL部分,例如
/cgi-bin/
用于请求任何CGI程序的基本认证 。 - username指定客户端登录时使用的用户名 。
- password定义身份验证所需的秘密密码。
密码可以是明文格式,crypt(1) MD5编码,也可以是\(p\)user的形式,其中user指的是/etc/shadow或/etc/passwd中的帐户,
也可以使用 uhttpd -m
将纯文本密码转换为MD5编码:
添加LUCI支持¶
同时支持 luci 与 thingooweb¶
单端口设置示例 单端口只支持一个 cgi-bin 目录,子目录中脚本会变为静态访问。 需要将两个 web 资源的 cgi文件混合放在 /cgi-bin 。
config uhttpd main
option home /www
list listen_http 0.0.0.0:80
list listen_https 0.0.0.0:443
option index_page yancy-index.html
option redirect_https 1
option cert /etc/ssl/uhttpd/server.crt
option key /etc/ssl/uhttpd/server.key
# ln -s / /www/root 可以通过web访问网关文件
config uhttpd root
option home /www/root
目录结构如下:
ls /www/
# luci 原生资源
cgi-bin/
luci-static/
index.html
# yancy web资源
yancy-index.html
yancy/
# 可以通过脚本用yancy-index.html覆盖index.html并增加"/cgi-bin/luci"链接
双端口设置示例
config uhttpd main
option home /yancy
list listen_http 0.0.0.0:80
list listen_https 0.0.0.0:443
option redirect_https 1
option cert /etc/ssl/uhttpd/server.crt
option key /etc/ssl/uhttpd/server.key
config uhttpd other
option home /www
list listen_http 0.0.0.0:8080
list listen_https 0.0.0.0:1443
option redirect_https 1
option cert /etc/ssl/uhttpd/server.crt
option key /etc/ssl/uhttpd/server.key