2 个不稳定版本

0.4.0 2022年11月23日
0.2.0 2022年6月3日

#cgi 中排名第 9

GPL-3.0-or-later

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