Skip to content

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 Web Server Configuration

安装

  • uHTTPd是OpenWrt 的标准HTTP服务器,但是它默认并不会安装在OpenWrt发行版的系统文件中。因为默认的发行版并不包含 Web 用户管理界面,通常 uHTTPd 会作为 Web 接口 LuCI 的依赖模块自动安装
  • 如果需要**单独安装**,可以通过以下命令来实现:
opkg update
opkg install uhttpd

配置

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监听端口。 如最小配置文件:

config 'uhttpd' 'main'
        option 'listen_http' '80'
        option 'home'        '/www'

多实例配置,每一个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编码:

# uhttpd -m secret
$1$$ysVNzQc4CTMkp5daOdZ.3/

添加LUCI支持

option lua_prefix      "/cgi-bin"
option lua_handler     "/cgi-bin/luci=/usr/lib/lua/luci/sgi/uhttpd.lua"

同时支持 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