Swiftfire 是一个 Web 服务器,允许从使用 Swift 编写的例程中注入 HTML 代码。
Swiftfire Web 服务器可以通过使用 Swift 编写的函数和服务进行扩展。这些服务用于处理 HTTP 请求,函数用于处理请求的页面或文件,从而准备响应。这使得创建完全只用 HTML、CSS 和 Swift 编写的整个网站成为可能。不需要其他语言、框架或外部服务,除了 HTTPS 的 openSSL 之外。
要将 Swiftfire 用作最终用户,您需要一台能够运行至少 MacOS 10.12 的 MacOS 电脑。
要开发 Swiftfire 扩展,您还需要 Xcode。
也可以在 Linux (Mint 19.3) 上构建和运行,使用从 swift.org 下载的 Swift Ubuntu 18.04。
访问 Swiftfire 主页 http://swiftfire.nl 以获取所有可用文档。
注意:在当前版本 1.x 中,Swiftfire 仍处于试验阶段。它可以工作,但是由于这种构建网站的方式仍然是新的,因此可以预期,随着我们获得经验,需要进行重大更改。因此,如果您正在关注,您应该预期新版本将需要一些重编码,包括您可能正在创建的任何网站。当我们相对确定不再需要进行重大重编码时,将发布 2.0 版本。
这是 Swiftfire 如何使用 Swift 代码来创建网站的一个非常高级的概述。
在 Swiftfire 下托管的每个域都实现一个服务堆栈。默认情况下,该堆栈实现一个静态网站。
对于到达服务器的每个(有效且被接受的)请求,Swiftfire 找到要执行的服务堆栈,并逐个执行这些服务。
您可以添加自己的服务来修改或扩展默认行为。
但是,您更可能想要创建自己的函数。
函数可用于将 HTML 代码注入到其他“静态”网页中,赋予它们动态特性。
堆栈中的一项服务从磁盘检索请求的页面,并验证是否必须对其进行解析。如果必须对其进行解析,它会扫描页面中的“函数”。找到的任何函数都会被执行,并且执行结果会被注入到页面中函数的确切位置。该函数本身会被删除。
函数 ".nofPageHits()" 的示例。
在 HTML 代码中,我们将按如下方式调用该函数
<p>This page has been accessed .nofPageHits() times</p>
然后 Swiftfire 会将其转换为
<p>This page has been accessed 59440 times</p>
或者任何其他数字。
最好的部分是,您可以自己定义和编写这些函数。
甚至可以创建循环并使用条件表达式
<p>Your name is: .if($account, equal, nil) unknown .else() .show($account.name) .end()</p>
您可以自己决定要在 Swift 中执行多少操作。 例如,您可以决定让整个登陆页面由一个函数创建。 为此,只需让 index.sf.html 仅包含: .buildLandingPage()
。 当然,您必须实现以名称 buildLandingPage
注册的函数。
它很快。 当然,根据服务和函数的数量和复杂性,此处展示的 Swiftfire 非常快。 在我们的服务器(一台 Mac mini)上,静态页面通常在不到 2 毫秒的时间内提供。 添加函数和服务肯定会增加这个数字。 尽管如此,由于函数调用和服务引用的是编译后的代码,而不是解释执行的代码,因此 Swiftfire 的速度预计会高于解释器解决方案。
哦,它也支持 PHP...
Swiftfire 是一个没有界面的 Web 服务器应用程序。 但是,它带有一个可用于管理目的的网站。 首次启动服务器时,对服务器侦听端口的任何请求都会导致显示一个登陆页面,该页面要求用户创建一个管理员帐户以及安装管理站点的目录。
设置完成后,访问任何托管域并在 URL 后面附加:'/serveradmin'。 这将返回服务器管理员网站。 请注意,登录的安全性仅取决于协议。 仅当从专用 LAN 内部访问时才使用 HTTP。
创建域时,可以在“domain-url/setup”访问域设置页面。
使用 git clone 下载项目
$ git clone https://github.com/Balancingrock/Swiftfire.git
然后切换到包含项目的目录
$ cd Swiftfire
然后构建项目,但首先使构建脚本可执行
$ chmod +x *.sh
$ ./sf-build.sh
这应该构建项目而不会出错。
如果目标 macOS 早于 10.14.4,则还需要安装 Swift 5 Runtime Support for Command Line Tools。 这会将一组库安装到 /usr/lib/swift
中,其中包括 libswiftCoreFoundation.dyLib
。 当您在启动 Swiftfire 时收到一条错误消息,抱怨缺少此库时,请安装 Swift 5 运行时。
我们可以在这里停止,但是...该项目需要 openSSL。 尽管为了方便起见提供了 openSSL 的预编译版本,但您不应信任此版本用于实际操作。 请务必从 openSSL.org 上的原始来源下载并安装 openSSL
有关安装 openSSL 的说明,请参见子项目 SecureSockets。
虽然仍然可以在 MacOS 10.12 上部署 Swiftfire,但由于必须对 openSSL 源代码进行修补,因此不再建议这样做。 如果硬件无法运行高于 10.12 的任何 macOS,请考虑切换到 Linux Mint 19.3。
首先按照上述说明的步骤操作。 完全执行相同的步骤,但是这次无需构建项目。 而是生成 xcode 项目
$ swift package generate-xcodeproj
打开生成的 Xcode 项目,更新目标的构建设置 Search Paths
$(SRCROOT)/openssl/<<openssl-to-be-used>>/include
添加到构建设置 Search Paths -> Header Search Paths
。$(SRCROOT)/openssl/<<openssl-to-be-used>>/lib
添加到构建设置 Search Paths -> Library Search Paths
。-lssl
和 -lcrypto
添加到构建设置 Linking -> Other Linker Flags
Linking -> Other Linker Flags
中删除构建设置 -lssl -lcrypto
<<openssl-to-be-used>>
当然必须替换为您选择的 openSSL 版本/编译。 请参见 openssl 目录中的 README 文件。
首次启动 Swiftfire 时,必须进行一些配置。 您可能希望通过将存储库中包含的 sfadmin
和 demo
目录复制到其他位置来为此做好准备。 尽管它们可以保留在项目内部,但是将这两个网站放置在不同的位置可以减少出错的可能性,因此潜在的更改不会影响操作场景。
在默认配置中,Swiftfire 将在端口 6678 上侦听传入的连接。 任何不存在域的连接尝试都将导致返回一个原始页面,除了 sfadmin
目录的位置之外,还必须在此页面中设置管理员 ID 和密码。
完成此操作后,可以通过以管理员身份登录并使用管理页面来自定义 Swiftfire。
请注意,首次启动后,Swiftfire 会在 ~/Library/Application Support/Swiftfire/<<instance-root>>
位置存储和期望信息。 对设置的更改会立即存储。 可以使用 <<instance-root>>
来允许并行运行 Swiftfire 的多个实例。
一些日志是 *.txt 格式的,设置是 *.json 格式的(为此,我们推荐我们的 proJSON 应用程序),访问者统计信息是 *.brbon 格式的。 目前没有可用的应用程序。 但是,可以在 github 上找到 BRBON 规范,包括 BRBON API。 如何使访问者统计信息可用是一个讨论的主题。
您当然可以更改任何您想要的内容,但是当前源代码布局的选择是有原因的。 尽管此布局是相当新的(因此可能需要更改),但我们希望您只需要添加到 Custom
、Functions
和 Services
模块即可。 尽管您应该保持其当前内容不受影响,因为管理服务器帐户的正确功能取决于它们。
服务器管理站点的源是使用 Jekyll 生成的。 如果必须进行更改,则需要安装 Jekyll 和主题 Classic-Jekyll-Theme。 有关 Jekyll 的更多信息,请参见 jekyllrb.com/,有关 Classic-Jekyll-Theme 的更多信息,请参见 balancingrock.github.io/classic-jekyll-theme
有一个 Swiftfire-Jekyll-Theme 可以快速设置一个(博客)网站,其中包括处理用户评论。 Swiftfire 1.3.2 与 Swiftfire-Jekyll-Theme 0.2.0 匹配。
名称 | 目的 | Github | 参考 |
---|---|---|---|
Ascii | Ascii 字符定义 | 链接 | 链接 |
BRBON | 内存存储管理器,快速访问和加载/存储 | 链接 | 链接 |
BRUtils | 通用定义 | 链接 | 链接 |
Html | 使创建 HTML 代码更容易 | 链接 | 链接 |
Http | HTTP 消息的 API | 链接 | 链接 |
KeyedCache | 通用字典式缓存 | 链接 | 链接 |
SecureSockets | 实现 SSL 的网络实用程序(包括 COpenSSL) | 链接 | 链接 |
SwifterLog | 通用日志记录实用程序 | 链接 | 链接 |
SwifterSockets | 基于 POSIX 的网络接口 | 链接 | 链接 |
VJson | JSON 解释器/生成器 | 链接 | 链接 |
Custom | Swiftfire 中的常见定义 | 链接 | 链接 |
Admin | Swiftfire 中的管理员代码 | 链接 | 链接 |
Core | Swiftfire 中的核心代码 | 链接 | 链接 |
Functions | Swiftfire 中的预定义函数 | 链接 | 链接 |
Services | Swiftfire 中的预定义服务 | 链接 | 链接 |
Swiftfire | Swiftfire 的主要操作 | 链接 | 链接 |
demo
站点,用于展示功能并作为用户网站模板移除了较旧的历史记录条目