人,讨厌的不是强权,而是自己没有得到强权。

高考成绩下来了,与我而言可能并不能去自己非常想去的学校,于是抱怨社会,为什么大家都认同985/211,而不认同双非?

其实说自己在翻找去年的学校录取分数表时,尝试“捡漏”,这何尝不是一种歧视呢?

拿着重点学校的名字,哈,我多么强大,去看不起对方的时候,有曾想过自己也会成为“被看不起的”那一方呢?

所以啊,人,要学会遇到强者,能安然面对,面对弱者,能保持敬畏之心。

这也算是这次高考给我带来的一个深刻的教训吧。

人文社科类学科其实是蛮重要的,不仅仅体现在成绩,而且体现在人的文化修养上。

每次想到一些头疼的事情,总是想,如果多读一点书,是不是现在心态就会稍微好一点呢?

CDN是一种多播

之前在接触到多播这个概念的时候一直在想这么美好的东西为什么不在互联网上使用,后来想了想,现在一直在说的 CDN 不就是做到这一点了嘛,减少骨干网络上重复数据的传输,在近用户端复制成多份分发。

今天看到腾讯云的这个演讲,同时也印证了这个观点:腾讯云PCDN:从P2P到万物互联框架

另外,P2P真的是一个很有趣的东西,与人斗,其乐无穷~

永远不要对他人的不幸落井下石,因为你无法确保你自己不会遇到类似情况。

什么是 Web 2.0 ?

Web 本质就是一个传递信息的工具,Web 有着用于传递信息的方法 HTTP,Web 有着用于表示信息的方法 HTML,那 Web 2.0 到底特殊在哪里?

我的理解, Web 2.0 将如何传递信息以及如何表达信息与用户的使用做了隔离,也就是说,在Web 2.0 时代,用户没有必要去考虑如何做出一个美观的网页,如何将自己的信息一直放在网上,如何用flash嵌入自己的视频作品,他只需要去做的是写一段文字,或者上传一些视频,其余的内容由计算机城区去帮忙处理。

Web 2.0 使得互联网的分工进行了细化,界面的美观设计有专业的设计师去处理,信息的保存有专门的运维去处理,解决各种疑难问题有程序员去做等等。

Web 2.0 其实就是应用程序这个概念的互联网延伸。

Web 2.0 的特性导致为了完成上述事宜,以及某些决策人员恬不知耻的产品“护城墙”战略,导致了互联网的中心化,从互联网变成了互联树,让用户的信息成为了一些公司的摇钱树,以及让控制信息的传播成为了[censered]。

将程序与数据分开吧!去掉那些本来就没有必要存在的中心化节点吧!还网络一个自由、开放的世界吧!

#拥抱IPFS ~~hashtag…~~

什么是邮件列表(Mailing List)?

这是一个对知乎问题的回答,什么是邮件列表(mailing list)?

简单的来说就是一组接收者的集合,他可以表示为一个邮箱地址,你向这个地址发送邮件,这个地址会帮你转发给其他用户。本质上就是一对多发信。

相对于抄送、秘抄需要将每个收信者写到邮件头中,这个列表是可以动态变化的,新的接收者可以通过网页或者其他方式告诉邮件列表自己愿意接收向这个邮件列表发送的邮件,同理也可以退出。

请区别各大邮件商提供的服务,如QQ的群邮件以及所谓订阅列表,邮件列表是平台无关的,邮件列表服务商不一定必须与发送者接收者同在一个服务商下,而且邮件列表应该使用的是通用的邮箱地址标识符(如me@example.com),不应该用QQ号什么的作为标识。

邮件列表可以用来做消息订阅,也可以用来做社区。具体例子就是你收到的各种推广信息从一种程度上可以认为是一种邮件列表。另外国外的较大型开源社区一般使用邮件列表作为其沟通的工具。

邮件列表相对于bbs等网上论坛,发信较为麻烦,实时性不高(分钟级,相比于IM即时通讯的秒级),学习成本比较高,又因为其去中心化的特点(每个人都可以作为邮件列表),较难审查(不是不行,邮件列表不是审查安全的信息交流工具),在国内一直没有推广开来(国内的公共邮件列表服务商少的可怜啊)。

其实邮件列表还是蛮有价值的,他不绑定任何一个平台,这意味着,你只要有一个有一定信誉的邮件服务商账户,你可以向世界上任何地方任何服务商的人们构建一个群组。不像微信,你不可以跟QQ用户组群。而且正因为邮件发送有一定门槛,人们一般会倾向于使用正式文体,讨论文体的效率会稍微高那么一丢丢。

OpenWrt 使用自带的 Dnsmasq 屏蔽网站(设置解析)

有些时候,我们可能希望屏蔽一个网站(例如:屏蔽小米广告),或者为特定的网站设置一个解析(例如:自己网站发布前在本地进行测试)。OpenWrt 提供了一个比本地 Host 强大许多的解析工具 Dnsmasq ,相比于本地 Host,他支持通配,并且可以解析特殊类型的记录。

网上有教程,需要安装 adblock 什么的,但其实就是一行(准确的来说是三行)命令的事情(luci 上没有提供修改的位置,所以不能在网页上解决)。

# 设置 example.com 域名 a 类型记录为 192.168.0.1
uci add_list dhcp.@dnsmasq[0].address="/example.com/192.168.0.1"
# 屏蔽 ad.mi.com 域名的 a 类型解析
# uci add_list dhcp.@dnsmasq[0].address="/ad.mi.com/"
# 生效配置(写入到 /etc/config/dhcp )
uci commit dhcp
# 重启服务
service dnsmasq restart

Ref

Mojang在发布bedrock_server的同时附带上了pdb调试符号文件。

重点是这文件还蛮大的。整个端是100MB,这个调试文件60MB。

不过感觉Mojang这么做大概是故意的,Minecraft是一个商业软件,发不了源代码,但是Minecraft需要社区要做插件,Mojang又懒得做API。

那我给你们调试文件,你们自己反编译去吧。

计划通!

Minecraft Sponge 服务端 Universal Market 插件踩坑记录及修复汉化版本下载

Minecraft 原版玩腻了(龙终于打过了),想玩 Minecraft MOD ,于是乎我装了工业 2 模组。正想着联机,从 mcbbs 里找了半天,感觉靠谱的就没有几个。自己玩又太孤独,那就来搭建一个服吧。这是前言,具体细节不多讲了,总之坑很多,不过好在有前辈们的教程(比如 http://www.mcbbs.net/thread-786074-1-1.html ),路走的还算顺利。本着为人民服务的精神,在这里选取一个坑,总结一下过程,来帮助后来的小伙伴们。

简要介绍

Universal Market 是一个寄售市场,有着类似箱子的界面。

MCBBS 转载贴: http://www.mcbbs.net/thread-792152-1-1.html
Github 原始项目: https://github.com/Xwaffle1/UniversalMarket

下载

20190628 更新:修复了热加载不管用的问题,修复了空手将空气添加到市场的bug

UniversalMarket-1.12.2-v1.3-Bug_fix_and_chinese_translation_by_yys_and_Tollainmear_and_lookas2001.jar

UniversalMarket-master-Bug_fix_and_chinese_translation-source.7z

由于这个项目的各种提示文本是内置在代码里的,所以汉化需要重新编译,上面有项目源代码文件,如果不放心的话,可以按照下方的编译过程自己手动编译。汉化部分采用 Tollainmear 提供的翻译。

出现问题

我搭建的服务器版本为 Minecraft 1.12.2 , Forge 1.12.2-14.23.5.2825 , SpongeForge 1.12.2-2825-7.1.6 。在安装了 1.3 版本的 Universal Market 插件( https://github.com/Xwaffle1/UniversalMarket/releases/tag/1.3 )后发现无法正常进入商店,控制台报错如下:

[xx:xx:xx] [Server thread/ERROR] [Sponge]: Error occurred while executing command 'um' for source EntityPlayerMP['lookas2001'/248, l='world', x=302.00, y=64.00, z=229.00]: There's no NBT Data set in the provided container
org.spongepowered.api.data.persistence.InvalidDataException: There's no NBT Data set in the provided container
    at net.minecraft.item.ItemStack.setRawData(ItemStack.java:2534) ~[aip.class:?]
    at com.xwaffle.universalmarket.utils.ItemBuilder.<init>(ItemBuilder.java:38) ~[ItemBuilder.class:?]
    at com.xwaffle.universalmarket.utils.ItemBuilder.<init>(ItemBuilder.java:31) ~[ItemBuilder.class:?]
    at com.xwaffle.universalmarket.market.Market.openMarket(Market.java:247) ~[Market.class:?]
    at com.xwaffle.universalmarket.market.Market.openMarket(Market.java:167) ~[Market.class:?]
    at com.xwaffle.universalmarket.commands.MarketCommand.process(MarketCommand.java:45) ~[MarketCommand.class:?]
    at org.spongepowered.api.command.dispatcher.SimpleDispatcher.process(SimpleDispatcher.java:340) ~[SimpleDispatcher.class:1.12.2-2825-7.1.6]
    at org.spongepowered.common.command.SpongeCommandManager.process(SpongeCommandManager.java:337) [SpongeCommandManager.class:1.12.2-2825-7.1.6]
    at net.minecraft.command.ServerCommandManager.func_71556_a(SourceFile:1156) [dh.class:?]
    at net.minecraft.network.NetHandlerPlayServer.func_147361_d(NetHandlerPlayServer.java:960) [pa.class:?]
    at net.minecraft.network.NetHandlerPlayServer.func_147354_a(NetHandlerPlayServer.java:939) [pa.class:?]
    at net.minecraft.network.play.client.CPacketChatMessage.func_148833_a(SourceFile:37) [la.class:?]
    at net.minecraft.network.play.client.CPacketChatMessage.func_148833_a(SourceFile:9) [la.class:?]
    at org.spongepowered.common.event.tracking.phase.packet.PacketPhaseUtil.onProcessPacket(PacketPhaseUtil.java:193) [PacketPhaseUtil.class:1.12.2-2825-7.1.6]
    at net.minecraft.network.PacketThreadUtil$1.redirect$onProcessPacket$zlk000(SourceFile:539) [hv$1.class:?]
    at net.minecraft.network.PacketThreadUtil$1.run(SourceFile:13) [hv$1.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_74]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_74]
    at net.minecraft.util.Util.func_181617_a(SourceFile:46) [h.class:?]
    at org.spongepowered.common.SpongeImplHooks.onUtilRunTask(SpongeImplHooks.java:307) [SpongeImplHooks.class:1.12.2-2825-7.1.6]
    at net.minecraft.server.MinecraftServer.redirect$onRun$zjo000(MinecraftServer.java:3970) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:723) [MinecraftServer.class:?]
    at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:397) [nz.class:?]
    at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:668) [MinecraftServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) [MinecraftServer.class:?]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_74]

这时候我有点慌了,因为我之前没有系统的接触过 Java ,只在研究锐捷网络 ESS/SMP 产品授权验证以及 Moegirl Android App 的时候稍微有所了解。

定位和解决

直接上搜索引擎,没找到…

由于这个项目是开源的(Open Source 大法好!),我们可以将代码下载下来慢慢研究。

后来又到原始项目里找 issue 找到了这个 https://github.com/Xwaffle1/UniversalMarket/issues/20 ,通过一些方式联系上了一个已经对前面一个版本的 jar 打完补丁的 dalao Alone,感谢其作品在我没有思路时候对我的启发。

好在有 trace ,我们可以看到最后一个关于这个插件的错误发生在 com.xwaffle.universalmarket.utils.ItemBuilder.<init>(ItemBuilder.java:38) ~[ItemBuilder.class:?] 这里:

我们把 setRawData 这个函数扔到 Sponge Forum 上搜索一下 https://forums.spongepowered.org/t/set-get-modify-subid-of-itemstack/19048/9 ,发现这个函数与在物品上设置一些属性有关,是一个比较 hacky 的做法。

将这段代码对应的函数在项目全局搜索一下:

发现这段代码只跟 Market.java 这个文件相关,打开,查找调用地方。

我们发现实际通过 meta 变量传入设置了 UnsafeDamage (损坏值)的调用点只在这里:

加载了好使的插件后,可以发现这个是支付确认界面的确定按钮。

故推测,这可能是作者想要做的一个类似进度条相关的功能,但是最后可能因为各种原因最后咕咕咕了(人类的本质)。

那就直接把这一行以及相关的两行(即出现 bug 这一行的上面两行)移除掉试一试。

拦路虎——编译

Minecraft 使用 Java 8 作为其运行环境,相应的,其周围 Mod 开发都是在 Java 8 基础上进行的,推荐使用 Java 8 来进行接下来的工作。

我本地用的电脑是 MacBook 开发环境为 MacOS,相对 Windows 系统,在命令行上更加强大一些,周围配套设施也多一些。个人开发的话,平常使用 brew 作为包管理,安装软件快捷迅速。但是 Brew 默认不提供 Java 8 (大概是过时了?),而去 Oracle 官网上下载又是不可能的(下载居然还需要登录),在 StackOverflow 上有这么一个回答 https://stackoverflow.com/a/55774255 ,解决了 Java 8 安装的问题。

看到这个项目使用了 gradle 作为其依赖管理(或者讲构建工具?),依照这我之前用 composer ,npm 的经验,我寻思着应该需要用 brew 安装一下。事实上是不需要的,安装了反而多余。brew 上的 gradle 版本太高,并且项目本身提供了一个包管理命令,即 gradlew 。运行一下会在项目目录以及用户目录生成相应的文件。

于是乎,./gradlew 一下,在下载完必要的文件后,给出了一个提示,按照这个提示,我应该运行 ./gradlew tasks。运行之,找到好像是构建的选项 ./gradlew build 。运行之,傻眼,提示错误:

:compileJava
/xxxxxx/UniversalMarket-master/build/sources/main/java/com/xwaffle/universalmarket/market/Market.java:30: 错误: 程序包org.spongepowered.common.item.inventory.adapter.impl.slots不存在
import org.spongepowered.common.item.inventory.adapter.impl.slots.SlotAdapter;
                                                                 ^
/xxxxxx/UniversalMarket-master/build/sources/main/java/com/xwaffle/universalmarket/market/Market.java:31: 错误: 程序包org.spongepowered.common.item.inventory.query.operation不存在
import org.spongepowered.common.item.inventory.query.operation.InventoryPropertyQueryOperation;
                                                              ^
/xxxxxx/UniversalMarket-master/build/sources/main/java/com/xwaffle/universalmarket/market/Market.java:32: 错误: 程序包org.spongepowered.common.item.inventory.util不存在
import org.spongepowered.common.item.inventory.util.ItemStackUtil;
                                                   ^
/xxxxxx/UniversalMarket-master/build/sources/main/java/com/xwaffle/universalmarket/market/MarketItem.java:10: 错误: 程序包org.spongepowered.common.item.inventory.util不存在
import org.spongepowered.common.item.inventory.util.ItemStackUtil;
                                                   ^
/xxxxxx/UniversalMarket-master/build/sources/main/java/com/xwaffle/universalmarket/utils/ItemBuilder.java:11: 错误: 程序包org.spongepowered.common.item.inventory.util不存在
import org.spongepowered.common.item.inventory.util.ItemStackUtil;
                                                   ^
注: Writing plugin metadata to file:/xxxxxx/UniversalMarket-master/build/classes/main/mcmod.info
5 个错误
:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

翻找 Sponge 文档,看到官方给出的例子都是基于 IDE 的,但是由于我的 MacBook 空间不够,最后在另外一台电脑上(Windows)安装了Intellij IDEA Community ,然后使用 IDE 提供的构建按钮,又花费了很长的一段时间下载,最后提示了两个错误 “PKIX path building failed” 和 “unable to find valid certification path to requested target” (在 Windows 上使用命令构建不会出现这个问题,但是仍然会出现上述在 MacOS 已经出现的错误),看来不是 IDE 的问题,返回我的 MacBook 。

在前一个步骤中,我观察到了一个事情,为什么其他引入不会出现问题,而这些引入会出现问题,我发现这些包都是以 org.spongepowered.common.xxxx 开头。之前有查看过 build.gradle 这个文件,明明有通过 compile 'org.spongepowered:spongeapi:7.0.0' 引入 SpongeAPI 。在是 IDE 的问题排查完后,我决定去看看 Java 编译器到底在引入一些什么东西。

由于之前有过 gradle 相关的经历,知道 gradle 会在用户目录生成文件夹 ~/.gradle ,去之,然后搜索之 find . | grep sponge 。搜索结果中有一个 ./caches/modules-2/files-2.1/org.spongepowered/spongeapi/7.0.0/ada1f9981de3459b182ee16d6408173ef33a8943/spongeapi-7.0.0.jar 这一看就是 api 对应的包嘛。

解压之(反编译就不用了):

自闭了

哪来的 common 啊!!

回到 build.gradle 目光下移一行,compile files('libs/spongeforge-1.12.2-2555-7.1.0-BETA-2837.jar') 在结合 SpongeCommon 项目的描述,这作者 tm 直接把 SpongeForge 的发布版本当做依赖了啊!而且源代码还把这个目录给删了!!!结合利用偏门 API 的事情来看(Sponge 不推荐插件作者绕过 Sponge 等行为,这个插件作者直接引入了 net.minecraft.nbt.NBTTagCompound),怪不得这个作者在发布 MOD 没在 Ore 上发啊(可能也跟 Sponge 没提供一些 API 有关)。

下载了现在最新的稳定版本 SpongeForge (spongeforge-1.12.2-2825-7.1.6.jar)(老的不想往后翻了),创建 libs 目录扔进去。然后修改一下 build.gradle 里对应的文件名(保持匹配)。再运行一下 ./gradlew build

小宝贝,终于看见你了:

最后经过测试,工作完美。

OpenWrt 上通过 WebDAV 共享文件

lookas2001 版权所有,本作品采用知识共享署名 4.0 国际许可协议进行许可,转载使用的时候请注明作者以及来源。

OpenWrt ( https://openwrt.org/ ) 是一个蛮强大的路由器固件,通过安装软件包可以实现很多功能。WebDAV ( http://www.webdav.org/ ) 是一个对 HTTP 的拓展,可用于共享文件。于是乎,我们可以尝试在 OpenWrt 上安装相应的软件包,让设备支持 WebDAV。

相比于 SMB, AFP,在实际测试中,WebDAV 的速度比较占优势。这点可能得益于 WebDAV 是基于 HTTP 的,HTTP 服务端可能有一些黑科技在降低占用的时候提高速度(也有可能是接下来的步骤中的 WebDAV 是基于 http 而不是 https 的原因)。

另外写这一篇文章的原因是 SMB 和 AFP 已经有了比较完善的教程,比如这两篇文章 https://openwrt.org/docs/guide-user/services/nas/samba_configuration https://openwrt.org/docs/guide-user/services/nas/netatalk_configuration 但是 WebDAV 在文档方面就比较缺乏。

Lighttpd ( https://www.lighttpd.net/ ) 是一个轻量级的,但是功能较为完备的 HTTP 服务端,观察到他提供了 WebDAV mod ,故可用其来实现 WebDAV 服务器。

安装 Lighttpd 以及 WebDAV Auth 模块

opkg update 来更新本地的软件包信息。

通过 opkg install lighttpd lighttpd-mod-webdav lighttpd-mod-auth lighttpd-mod-authn_file 可将所依赖的软件包一键装齐。

如果出现了下载速度慢或者下载遇到困难,可以手动到 http://downloads.openwrt.org 上下载对应的包然后安装,或者设置一下网络代理(这不属于这篇文章的谈论范围,需要你自己想办法啦)。

配置 Lighttpd

不像 SMB 提供了 uci 统一配置的接口,Lighttpd 需要在 /etc/lighttpd 下修改。

通过 vi /etc/lighttpd/lighttpd.conf 打开 lighttpd 的主配置文件。

可通过 cp /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.bak 设置一个备份,便于配置出错的时候还原。

这是一份配置过的配置文件:

server.document-root        = "/mnt"
server.upload-dirs          = ( "/tmp" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "http"
server.groupname            = "www-data"

index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm",
                              )

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

### Options that are useful but not always necessary:
#server.chroot               = "/"
server.port                 = 81
#server.bind                 = "localhost"
#server.tag                  = "lighttpd"
server.errorlog-use-syslog  = "enable"
#server.network-backend      = "writev"

### Use IPv6 if available
#include_shell "/usr/share/lighttpd/use-ipv6.pl"

dir-listing.encoding        = "utf-8"
server.dir-listing          = "enable"

include "/etc/lighttpd/mime.conf"
include "/etc/lighttpd/conf.d/*.conf"

lighttpd 配置文件中注释是通过在行前加入“#”来实现的。

这里修改了几点:

server.document-root = "/mnt" ,即将文档根目录设置为 /mnt ,我为路由器添加了两个硬盘,分别挂载在 /mnt/sda1 和 /mnt/sdb1 下,这个存放位置不是固定的,可以根据你自己的喜好调整。

server.port = 81 ,即后面我们用来访问的端口,80 端口已经被系统自带的 uHTTPd 占用了,这里设置另外一个防止冲突。

server.errorlog-use-syslog = "enable" ,这个选项可以将错误日志输出到 syslog ,便于我们在 web 控制台查看错误。

server.dir-listing = "enable" , dir-listing.encoding = "utf-8" ,这两个选项可以启用列出文件功能,并且防止文件名乱码。

配置 WebDAV 模块

通过 vi /etc/lighttpd/conf.d/30-webdav.conf 打开 lighttpd 的主配置文件。

这是一份配置过的配置文件:

#######################################################################
##
##  WebDAV Module
## ---------------
##
## See https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModWebDAV
##
server.modules += ( "mod_webdav" )

#$HTTP["url"] =~ "^/dav($|/)" {
  ##
  ## enable webdav for this location
  ##
  webdav.activate = "enable"

  ##
  ## By default the webdav url is writable.
  ## Uncomment the following line if you want to make it readonly.
  ##
  webdav.is-readonly = "enable"

  ##
  ## Log the XML Request bodies for debugging
  ##
  #webdav.log-xml = "disable"

  ##
  ##
  ##
  webdav.sqlite-db-name = "/tmp/lighttpd-webdav.db"
#}
##
#######################################################################

这里修改了几点:

注释掉了 $HTTP["url"] =~ "^/dav($|/)" { , } 两行,这里安装 Lighttpd 的目的就是为了 WebDAV ,注释掉这两行可以将整个网站都设置为 WebDAV 。

webdav.activate = "enable" ,为整个站点启用了 WebDAV 。

webdav.is-readonly = "enable" ,设置运行模式是只读模式,这里设置 disable 可以禁用只读(即可写可读)。

"/mnt/sda1/.lighttpd-webdav.db" ,这里需要为 WebDAV 模块设置一个数据库存储位置,位置建议选择在硬盘上,这个数据库文件需要存储的除了锁定还有一些属性,如果存储在易丢失的地方(如 /tmp )会导致数据丢失,存储上除硬盘以外的位置会缩短闪存寿命(闪存有擦除上限),请注意,Lighttpd 需要对存储位置的目录有写入的权限,可用 chmod a+w xxx,来授予权限。

Ref

  • OpenWrt 论坛上的内容 https://forum.openwrt.org/t/webdav-configuration-essense-with-lighttpd-on-openwrt/25357
  • Lighttpd 提供的文档 https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModWebDAV

配置 Auth 模块

这块的配置是用于提升你的文件安全性的,但并不是必须的,而且这方面的配置只可提升少许安全性,攻击者仍然可以在中途截获密码,若想更好的提升安全性,请配置 HTTPS 。

通过 vi /etc/lighttpd/conf.d/20-auth.conf 打开 lighttpd 的主配置文件。

这是一份配置过的配置文件:

#######################################################################
##
##  Authentication Module
## -----------------------
##
## See https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modauth
## for more info.
##
server.modules += ( "mod_auth" )

auth.backend                 = "plain"
auth.backend.plain.userfile  = "/etc/lighttpd/lighttpd.user"
#auth.backend.plain.groupfile = "/etc/lighttpd/lighttpd.group"

#auth.backend.ldap.hostname = "localhost"
#auth.backend.ldap.base-dn  = "dc=my-domain,dc=com"
#auth.backend.ldap.filter   = "(uid=$)"

auth.require               = ( "/" =>
                               (
                                 "method"  => "basic",
                                 "realm"   => "Personal File Server",
                                 "require" => "valid-user"
                               ),
                             )

##
#######################################################################

这里修改了几点:

可能是包打包人员的疏忽,原来的配置文件中没有 server.modules += ( "mod_auth" ) 一行,为了启用这个模块,须有手动加上。

auth.backend = "plain" ,设置认证后端为 plain

auth.backend.plain.userfile = "/etc/lighttpd/lighttpd.user" ,设置认证后端存储认证信息的位置。

auth.require = ..... ,取消这里的注释即意味着启用了认证。

"/" ,代表认证的位置,这里是全站。

"method" => "basic" ,认证的类型,这里设置为 basic 是为了更好的客户端兼容性。

"realm" => "Personal File Server" ,即认证时提示的消息,随便设置即可。

通过 touch /etc/lighttpd/lighttpd.user 可以创建我们需要的认证信息文件。

通过 vi /etc/lighttpd/lighttpd.user 编辑认证信息文件。

这是一份样例:

user1:password1
user2:password2

用户名和密码见用 : 隔开,多个用户之间用空行隔开。

Ref

  • Lighttpd 提供的文档 https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modauth