我正在使用Webmin进行家庭服务器pipe理。
而不是在默认端口( https:// myhost:10000 )上运行它,我想将其托pipe在一个子文件夹( https:// myhost / webmin / )中。 这在使用Apache时运行得非常好(Apacheconfiguration文件附在下面)。 但是,我通常使用lighttpd,而我想用lighttpd做同样的事情(在子文件夹中运行Webmin)。 但是,它不能正常工作。 每当我去https:// myhost / webmin / ,我都会得到这样的信息:
Error - Bad Request This web server is running in SSL mode. Try the URL https://localhost:10000/ instead.
所以我对这个问题进行了更深入的研究。 我不是运行Webmin,而是使用netcat来监听端口10000.当使用lighttpd时,我得到:
myhost@myhost:~$ nc -l 10000 GET /webmin/ HTTP/1.0 Host: myhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate DNT: 1 Cookie: testing=1 Cache-Control: max-age=0 X-Forwarded-For: 192.168.159.1 X-Host: myhost X-Forwarded-Proto: https
而使用Apache时,我得到:
myhost@myhost:~$ nc -l 10000 ÌÈOPù¶°$óI¢ÚH,-ånú? ÆÀ2´ûZÀÀ 98ÀÀ5 À ÀÀ ÀÀ 32EDÀÀ/AÀÀÀ ÀÿD 42 #PuTTYPuTTYPuTTY^C
正如你所看到的,这可能是一个SSL握手。 此时中断netcat也会显示Apache错误消息“原因:在与远程服务器的SSL握手期间出错”,所以我确信SSL握手确实发生在这里。
这意味着Webmin是正确的,它收到的请求不是一个HTTPS,而是一个HTTP请求。
所以问题是,为什么Apache正确使用HTTPS代理,而lighttpd使用HTTP与一些X-Forwarded-Proto代理? 我怎样才能实现与lighttpd类似的SSL代理?
为了logging,我所做的configuration文件的所有更改。 我在/ etc / webmin / config中添加了以下几行:
webprefix=/webmin webprefixnoredir=1 referer=myhost
我已经在lighttpd.conf中添加了lighttpd(它产生了上面的错误):
$HTTP["url"] =~ "^/webmin" { proxy.server = ( "/webmin/" => ( ( "strip-request-uri" => "/webmin", "host" => "127.0.0.1", "port" => 10000, "fix-redirects" => 1 ) ) ) }
我正在使用下面的configuration文件的Apache(这是正确的工作):
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_connect_module modules/mod_proxy_connect.so ProxyPass /webmin/ https://myhost:10000/ ProxyPassReverse /webmin/ https://myhost:10000/ SSLProxyEngine On <Proxy *> allow from all SSLRequireSSL </Proxy> <IfModule mod_ssl.c> <VirtualHost _default_:443> SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key </VirtualHost> </IfModule>
没关系,现在就开始工作吧。
哦,等等,你以为这是全部? 不,同事服务器故障和search引擎用户,这里是如何设置lighttpd与Webmin运行在一个子文件夹的指南。 请享用!
本指南的目标是与Webmin一起设置lighttpd安装,以便可以访问* http:// myhost / webmin上的Webmin界面。
在编写本指南时,当前的Webmin版本是1.580,使用的lighttpd版本是1.4.28。 我假设你已经安装了两个。 名称“myhost”总是表示lighttpd在其上运行的机器的主机名。
就像在Apache官方指南中提到的那样,您必须将以下行添加到/ etc / webmin / config:
webprefix=/webmin webprefixnoredir=1 referer=myhost
是的,你听对了,正如Shane Madden在上面的评论中提到的那样,这不是不安全的,因为沟通是这样的:
client <----SSL----> myhost <--Loopback--> myhost:10000
Webmin将通过环回设备与在myhost上运行的lighttpd实例进行通信,该环回设备位于机器内部,通常只能通过超级用户权限进行访问。 客户端和lighttpd之间的通信仍将使用SSL。
那么以及如何在Webmin中禁用SSL? 只需在/etc/webmin/miniserv.conf中编辑以下行:
ssl=0
将以下行添加到/etc/lighttpd/lighttpd.conf中:
$HTTP["url"] =~ "^/webmin" { magnet.attract-physical-path-to = ( "/var/www/webmin/conf/webmin-rewrite.lua" ) proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => 10000, ) ) ) }
正如你所看到的,我们检查URL是否以“/ webmin”开头,redirect到在127.0.0.1:10000上监听的Webmin实例。 但是,Webmin并不希望在请求URL中包含额外的path“… / webmin”,所以我们必须从URL中删除它。 但是,正如我们在$ HTTP [“url”] – 条件中那样,我们不能使用mod_rewrite提供的任何URL重写技术。 (否则,我们只是简单地说“strip-request-uri”=>“/ webmin”,但是这样做是行不通的,这是lighttpd 1.4的一个已知的,无法解决的问题,另请参阅mod_rewrite文档。使用mod_magnet在LUA脚本中重写URL。
使用以下内容创build/var/www/webmin/conf/webmin-rewrite.lua:
subfolder = "/webmin" n = string.len(subfolder) if string.sub(lighty.env["request.uri"], 1, n) == subfolder then lighty.env["request.uri"] = string.sub(lighty.env["request.uri"], n+1) end
这会从请求URL中去除“/ webmin”前缀。
这已经几乎可行了,但是,Webmin的redirect代码中仍然存在一个bug,在这里也提到了 。 在/usr/share/webmin/miniserv.pl中,更改该行
&write_data("Location: $prot://$host$portstr$in{'page'}\r\n");
至
&write_data("Location: $prot://$host$config{'subfolder_prefix'}$in{'page'}\r\n");
在/etc/webmin/miniserv.conf中,添加以下行:
subfolder_prefix=/webmin
这修复了Webminloginredirect,你就完成了!
从lighttpd版本1.5开始,您可以用mod_proxy_corereplaceLUA脚本,因为它能够重写请求URL。 但是,我没有尝试。
而且,由于没有必要再从外面访问端口10000,我build议阻止它:
iptables -A INPUT -i eth0 -p tcp --dport 10000 -j REJECT --reject-with tcp-reset
但是,根据您的本地configuration,此命令可能会有所不同。