2 个不稳定版本
0.4.0 | 2022年11月23日 |
---|---|
0.2.0 | 2022年6月3日 |
在 #cgi 中排名第 9
51KB
1K SLoC
内容
描述
Agis 将是一个用 Rust 编写的 斯巴达协议 服务器。它目前正在积极开发中,但尚未可用。
构建
Agis 用 Rust 编写,需要 Cargo 构建工具。
# Build a release binary
cargo build --release
特性
- 多线程工作池
- 静态文件
- 虚拟主机(基于名称)
- CGI
- CGI 脚本别名
- 重定向
- 别名
- 索引
配置
配置文件是 Ron 格式,如果您熟悉任何具有括号的编程语言(如 C),应该很容易理解。在 conf/config.ron
中有一个带有许多注释的示例配置文件。此文件可以复制到 /etc/agis/config.ron
并根据您的实际需求进行编辑。
字段(全局)
- 地址
- ip - 绑定的 IP 地址
- 端口 - 要监听的端口。斯巴达指定端口 300,除非您有特定的用途,否则请不要更改。
- address1 - 可选的第二个 IP 地址,例如同时运行 ipv4 和 ipv6 时非常有用。如果不需要,可以完全省略。
- ip - 如上所述
- 端口 - 如上所述
- 用户 - 服务器将运行的用户。Agis 必须以 root 权限启动,以便绑定到低端口之一,但一旦初始化,它将立即降级权限。
- 组 - 服务器将运行的组。
- 线程 - 要启动以处理请求的线程数。您不太可能有足够的流量来证明增加此值的必要性。
- access_log - 如果设置为
None
,则访问将记录到 stdout。如果设置为Some(path)
,则访问将记录到该文件。 - error_log - 请参阅 access_log 的详细信息。错误记录到 stderr 或文件。
- vhosts - 一个或多个基于名称的虚拟主机。
字段(每个 Vhost)
每个 vhost 都通过一个键来查找,该键是它将服务的域名。
- 名称 - 要为其提供服务请求的域名。
- root - 服务器文件的根目录路径。
- 目录 - 路径特定的指令。
指令
每个指令都通过一个键来查找,该键是它应用的路径。
- Allow(bool) - 是否允许访问此路径。如果没有设置,则允许服务器根目录下所有文档树中的文件访问。如果设置为false,则不允许此路径下的所有文件访问。
- Alias(path) - 从不同的路径提供此路径请求的文件。服务器对此进行透明处理,对客户端来说不可见。
- 重定向 - 对此特定路径的任何请求都会被发送到新的位置的重定向,由客户端处理。
- Cgi - 此目录下的任何请求都会传递给该目录直接子目录下的cgi程序。如果Cgi指令给定路径'/cgi-bin/',并且客户端请求'/cgi-bin/foo/bar/baz.gmi?fizzbuzz=true',则位于'/server-root/cgi-bin/foo'的程序将被运行,其余路径和查询作为环境变量传递。此实现是CGI 1.1的一个子集,去除了特定的http环境变量。
- ScriptAlias(path) - 此路径下的任何请求都将通过指定的CGI程序进行解释。该路径作为绝对路径给出,去除了服务器根路径。因此,如果服务器根路径是
/srv/spartan
,而CGI程序位于/srv/spartan/cgi-bin/hello
,则路径为/cgi-bin/hello
。
默认配置以用户'agis'和组'agis'的身份运行服务器。您需要在您的系统上创建该用户和组,否则Agis将无法运行。
useradd -r -s /sbin/nologin agis
运行
如果您使用Systemd init的Linux系统,conf/子目录中包含一个单元文件。它可以复制到/etc/systemd/system,然后像任何其他服务一样启动和停止。
如果您使用的是不使用systemd的Linux系统或bsd,应该可以很容易地编写自己的init脚本。默认的配置文件位置是/etc/agis/config.ron
,但可以通过命令行上的-c
或--config
标志进行覆盖。目前这仅是支持的命令行选项,使得启动非常简单。
CGI
CGI程序可以用任何语言编写,并通过环境变量接收输入。程序输出应以其MIME类型以纯文本形式呈现,后跟一个回车符和换行符,然后是可以通过一系列u8字节表示的数据。这可以是纯文本,但不必是。
CGI环境变量
Var | 含义 |
---|---|
DOCUMENT_ROOT | 您的服务器根目录 |
QUERY_STRING | 查询字符串 |
REMOTE_ADDR | 客户端的IP地址 |
REQUEST_URI | 请求文档或CGI的解释路径名(相对于文档根) |
SCRIPT_FILENAME | 当前CGI的完整路径名 |
SCRIPT_NAME | 当前CGI的解释路径名(相对于文档根) |
SERVER_NAME | 您的服务器的完全限定域名(例如 www.cgi101.com) |
SERVER_PORT | 服务器监听的端口号 |
SERVER_SOFTWARE | 您使用的服务器软件 |
REQUEST_BODY | 包含上传到服务器的任何内容的临时文件的路径 |
ScriptAlias
ScriptAlias指令允许将请求传递到CGI程序,而不需要在URL中显示cgi-bin目录或程序名称。这样,可以提供动态内容,而不向客户端透露正在运行CGI程序或该程序的性质。如果,例如,使用php脚本并希望不轻易让潜在的攻击者知道这一点,这可能是所希望的。
依赖关系
~8-17MB
~233K SLoC