![使用 lighttpd 通过 URL 提供端口服务](https://linux22.com/image/759717/%E4%BD%BF%E7%94%A8%20lighttpd%20%E9%80%9A%E8%BF%87%20URL%20%E6%8F%90%E4%BE%9B%E7%AB%AF%E5%8F%A3%E6%9C%8D%E5%8A%A1.png)
设置和目标
我在 Raspberry Pi 上运行 Lighttpd 服务器(版本:lighttpd/1.4.53 (ssl))。此服务器最初由pi 孔,我开始使用它来管理我的网络。我已经成功将它关联http://raspi.home
到我的树莓派 IP。
该设备已经运行了多项服务,例如R-shiny 服务器在端口 3838 上家庭助理安装在端口 8123 上,这样我就可以分别通过http://raspi.home:3838/
和访问http://raspi.home:8123
。
我的目标是现在能够通过用户友好的地址访问我的服务,例如 http://raspi.home/shiny
(端口 3838)和http://raspi.home/homeassistant
(端口 8123)。
由于 lighttpd 服务器是为 pi-hole 配置的,因此/var/www/html/
只包含两个文件夹:“pihole”和“admin”。我可以通过 pi-hole 访问管理面板,http://raspi.home/admin
虽然http://raspi.home/pihole
可以访问,但用处不大。
我的目标是使浏览http://raspi.home/shiny/...
服务http://raspi.home:3838/...
(对于 homeassistant 来说也是一样)。
迄今进展
我正在修改/etc/lighttpd/external.conf
,它添加了/etc/lighttpd/lighttpd.conf
(代码这里)。我尝试了各种方法,但是 lighttpd conf 文件对我来说相当混乱,我不知道应该把什么放在根级别,还是放在$HTTP["url"]
.
到目前为止最有效的是添加带有服务器定义的 URL 映射:
$HTTP["url"] =~ "^/shiny" {
proxy.header = (
"map-urlpath" => ( "/shiny" => "/" ),
"upgrade" => "enable"
)
proxy.server = ( "" => ( ( "host" => "localhost", "port" => 3838) ) )
}
不幸的是,这也改变了所有相对 URL,因此http://raspi.home/shiny/index.html
搜索的是中的任何图像http://raspi.home/images/image.png
,而不是http://raspi.home/shiny/images/image.png
。因此,找不到任何资源。
如果我删除该条件,映射将是全局的,因此应用程序可以使用,但由于所有内容都已映射,因此所有其他站点现在都无法使用。这在这个错误但我无法使提供的解决方案发挥作用。
我尝试过"map-urlpath" => ( "/shiny(.*)$" => "/$1" )
但意外地抛出了 404 错误(无论有没有条件)。
资源
以下是更多可能相关/有用的资源:
- 通过 Lighttpd 将 URL 代理到不同的端口
- Lighttpd 代理通过端口重定向
- https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModProxy
- https://redmine.lighttpd.net/boards/2/topics/1946(重定向有效)
- 在传递给代理 Lighttpd 之前重写 URL
- https://redmine.lighttpd.net/boards/2/topics/8322
它们对我来说不起作用,要么是因为我没有把代码放在正确的位置,要么是因为不适合我的情况,谁知道呢......
答案1
$HTTP["url"] =~ "^/shiny" {
proxy.server = ( "" => ( ( "host" => "192.168.1.138", "port" => 3838 ) ) )
}
删除proxy.header
直到您更好地理解它能做什么和不能做什么。
https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModProxy
proxy.header
"map-urlpath"
会修改 HTTP 标头的请求行,但 lighttpd 不会重写响应主体,因此您的 R-shiny 服务器必须了解它根植于 /shiny/。我还没有查看 R-shiny 是否可行。
另一种方法是创建 DNS 名称 shiny.raspi.home 和 homeassistant.raspi.home,然后可以配置 lighttpd 进行反向代理
$HTTP["host"] =~ "shiny.raspi.home" {
proxy.server = ( "" => ( ( "host" => "192.168.1.138", "port" => 3838 ) ) )
}
请注意,我在上面的例子里更改了目标"port"
,因为我猜测这是你希望 lighttpd 将请求反向代理到的反向代理目标主机和端口http://shiny.raspi.home/