Tracd
Tracd 是一个轻量级的独立 Trac Web 服务器。它可以在多种情况下使用,从测试或开发服务器到作为负载均衡器使用的另一个 Web 服务器后面的多进程设置。
优点
- 更少的依赖:您无需安装 Apache 或任何其他 Web 服务器。
- 快速:应该与 mod_python 版本几乎一样快(比 CGI 快得多),自 0.12 版以来更是如此,因为默认启用了 HTTP/1.1 协议版本。
- 自动重载:对于开发,Tracd 可以用于 auto_reload 模式,当您对代码(在 Trac 本身或插件中)进行更改时,它会自动重启服务器。
缺点
- 功能较少:Tracd 实现了一个非常简单的 Web 服务器,其可配置性或可伸缩性不如 Apache httpd。
- 无原生 HTTPS 支持:可以使用 sslwrap 代替,或者使用 stunnel -- 一个关于如何将 stunnel 与 tracd 结合使用的教程 或带有 mod_proxy 的 Apache。
使用示例
一个项目运行在 8080 端口。(https://:8080/)
$ tracd -p 8080 /path/to/project
严格来说,这将使您的 Trac 对网络上的每个人都可访问,而不是仅限本地主机。要真正限制它,请使用 --hostname
选项。
$ tracd --hostname=localhost -p 8080 /path/to/project
有多个项目。(https://:8080/project1/ 和 https://:8080/project2/)
$ tracd -p 8080 /path/to/project1 /path/to/project2
您不能让不同项目的路径的最后部分相同,因为 Trac 使用该名称来保持不同项目的 URL 唯一。因此,如果您使用 /project1/path/to
和 /project2/path/to
,您将只看到第二个项目。
提供多个项目的另一种方法是使用 -e
选项指定一个父目录,其中每个子目录都是一个 Trac 项目。上面的示例可以改写为:
$ tracd -p 8080 -e /path/to
支持 HTTPS 协议(自 1.3.4 起)。使用 --certfile
和 --keyfile
选项指定 PEM 证书文件和密钥文件的路径。如果您有 组合密钥和证书,则可以只指定 --certfile
选项。
要在 Windows 上退出服务器,请务必使用 CTRL-BREAK
-- 使用 CTRL-C
会在后台留下一个 Python 进程。
安装为 Windows 服务
选项 1
要安装为 Windows 服务,请获取 SRVANY 实用程序并运行
C:\path\to\instsrv.exe tracd C:\path\to\srvany.exe reg add HKLM\SYSTEM\CurrentControlSet\Services\tracd\Parameters /v Application /d "\"C:\path\to\python.exe\" \"C:\path\to\python\scripts\tracd.exe\" <your tracd parameters>" net start tracd
注意:不要直接使用 tracd.exe
。而是直接将 python.exe
作为参数注册 tracd.exe
。如果您使用 tracd.exe
,它将在 SRVANY 不知情的情况下生成 python 进程。此 python 进程将在 net stop tracd
后继续运行。
如果您希望 tracd 在 Windows 启动时自动启动,请执行
sc config tracd start= auto
这里的间距很重要。
服务安装后,运行注册表编辑器可能比使用上面记录的 reg add
命令更简单。导航到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tracd\Parameters
提供了三个(字符串)参数
AppDirectory | C:\Python27\ |
Application | python.exe |
AppParameters | scripts\tracd.exe -p 8080 ... |
请注意,如果 AppDirectory 设置如上,则可执行文件以及脚本名称和参数值的路径是相对于该目录的。这使得更新 Python 变得稍微简单一些,因为更改可以限制在此处的一个点。(对于 .htpasswd 文件的路径也是如此,尽管文档要求 /full/path/to/htpasswd;但是,您可能不希望将该文件存储在 Python 目录下。)
对于 Windows 7 用户,srvany.exe 可能不是一个选项,因此您可以使用 WINSERV 实用程序并运行
"C:\path\to\winserv.exe" install tracd -displayname "tracd" -start auto "C:\path\to\python.exe" c:\path\to\python\scripts\tracd.exe <your tracd parameters>" net start tracd
选项 2
使用 WindowsServiceScript,可在 Trac Hacks 获取。它可安装、删除、启动、停止等您的 Trac 服务。
选项 3
也可以使用 cygwin 的 cygrunsrv.exe
$ cygrunsrv --install tracd --path /cygdrive/c/Python27/Scripts/tracd.exe --args '--port 8000 --env-parent-dir E:\IssueTrackers\Trac\Projects'
$ net start tracd
使用身份验证
Tracd 允许您在不需要 Apache 的情况下运行 Trac,但您可以利用 Apache 的密码工具(htpasswd
和 htdigest
)轻松创建 Tracd 用于身份验证的正确格式的密码文件。(也可以在不使用 htpasswd
或 htdigest
的情况下创建密码文件;请参阅下面的替代方法)
注意:确保将生成的密码文件放在支持亚秒级时间戳的文件系统上,因为 Trac 将监视它们的修改时间,并且在时间戳分辨率过粗的文件系统(如 Linux 上的 ext2
或 ext3
,或 OSX 上的 HFS+)上发生的更改可能会有问题。
Tracd 支持 Basic 和 Digest 身份验证。Digest 被认为更安全。下面的示例使用 Digest;要使用 Basic 身份验证,请在命令行中将 --auth
替换为 --basic-auth
。
使用身份验证的通用格式是
$ tracd -p port --auth="base_project_dir,password_file_path,realm" project_path
其中
- base_project_dir:项目的基础目录,指定如下:
- 当提供多个项目时:相对于
project_path
- 当只提供一个项目时(
-s
):项目目录的名称
- 当提供多个项目时:相对于
不要在这里使用绝对路径,因为这不起作用。注意:即使在 Windows 环境中,此参数也区分大小写。
- password_file_path:密码文件路径
- realm:领域名称(可以是任何内容)
- project_path:项目路径
- 上面命令中的
--auth
表示使用 Digest 身份验证;如果您想使用 Basic 身份验证,请将--auth
替换为--basic-auth
。虽然 Basic 身份验证不需要“领域”,但命令解析器需要,因此需要第二个逗号,然后直接跟一个空领域名称的闭合引号。
示例
$ tracd -p 8080 \ --auth="project1,/path/to/passwordfile,mycompany.com" /path/to/project1
当然,密码文件可以共享,以便它用于多个项目。
$ tracd -p 8080 \ --auth="project1,/path/to/passwordfile,mycompany.com" \ --auth="project2,/path/to/passwordfile,mycompany.com" \ /path/to/project1 /path/to/project2
共享密码文件的另一种方法是为项目名称指定“*”
$ tracd -p 8080 \ --auth="*,/path/to/users.htdigest,mycompany.com" \ /path/to/project1 /path/to/project2
基本授权:使用 .htpasswd 密码文件
本节描述如何将 tracd
与 Apache .htpasswd 文件一起使用。
注意:在 Windows 上,必须安装 passlib 包才能解码某些 htpasswd 格式。只有
SHA-1
密码(自 Trac 1.0 起)无需此模块即可工作。
要创建 .htpasswd 文件,请使用 Apache 的 htpasswd
命令(有关不使用 Apache 创建这些文件的方法,请参阅下文)
$ sudo htpasswd -c /path/to/env/.htpasswd username
然后是其他用户
$ sudo htpasswd /path/to/env/.htpasswd username2
然后运行类似这样的命令来启动 tracd
$ tracd -p 8080 --basic-auth="project,/fullpath/environmentname/.htpasswd,realmname" /path/to/project
例如
$ tracd -p 8080 --basic-auth="project,/srv/tracenv/testenv/.htpasswd,My Test Env" /path/to/project
注意:在某些平台(OpenBSD)上,您可能需要将“-m”作为参数传递给 htpasswd。
摘要认证:使用 .htdigest 密码文件
如果您有可用的 Apache,可以使用 htdigest 命令生成密码文件。输入 'htdigest' 获取一些使用说明,或阅读 Apache 手册中的 此页面 以获取精确说明。系统会提示您为每个创建的用户输入密码。对于密码文件的名称,您可以随意使用,但如果您使用类似 users.htdigest
的名称,它会提醒您文件包含的内容。建议将其放在您的 <projectname>/conf 文件夹中,与 trac.ini 文件一起。
请注意,您可以在没有 --auth
参数的情况下启动 tracd,但如果您单击登录链接,将出现错误。
不使用 Apache 生成密码
基本授权可以通过这个 在线 HTTP 密码生成器 来实现,它也支持 SHA-1
。将生成的密码哈希行复制到您系统上的 .htpasswd 文件中。请注意,Windows Python 缺少“crypt”模块,该模块是 htpasswd 的默认哈希类型。Windows Python 可以很好地解析 MD5 密码哈希,您应该使用 MD5。
Trac 还在 contrib
中提供了 htpasswd
和 htdigest
脚本
$ ./contrib/htpasswd.py -cb htpasswd user1 user1 $ ./contrib/htpasswd.py -b htpasswd user2 user2
$ ./contrib/htdigest.py -cb htdigest trac user1 user1 $ ./contrib/htdigest.py -b htdigest trac user2 user2
使用 md5sum
可以使用 md5sum
工具生成摘要密码文件
user= realm= password= path_to_file= echo ${user}:${realm}:$(printf "${user}:${realm}:${password}" | md5sum - | sed -e 's/\s\+-//') > ${path_to_file}
参考
这是在线帮助,作为提醒(tracd -h
或 tracd --help
)
usage: tracd [-h] [--version] [-e PARENTDIR | -s] [-a DIGESTAUTH | --basic-auth BASICAUTH] [-p PORT] [-b HOSTNAME] [--protocol {http,https,scgi,ajp,fcgi}] [--certfile CERTFILE] [--keyfile KEYFILE] [-q] [--base-path BASE_PATH] [--http10 | --http11] [-r | -d] [--pidfile PIDFILE] [--umask MASK] [--group GROUP] [--user USER] [envs [envs ...]] positional arguments: envs path of the project environment(s) optional arguments: -h, --help show this help message and exit --version show program's version number and exit -e PARENTDIR, --env-parent-dir PARENTDIR parent directory of the project environments -s, --single-env only serve a single project without the project list -a DIGESTAUTH, --auth DIGESTAUTH [projectdir],[htdigest_file],[realm] --basic-auth BASICAUTH [projectdir],[htpasswd_file],[realm] -p PORT, --port PORT the port number to bind to -b HOSTNAME, --hostname HOSTNAME the host name or IP address to bind to --protocol {http,https,scgi,ajp,fcgi} the server protocol (default: http) --certfile CERTFILE PEM certificate file for HTTPS --keyfile KEYFILE PEM key file for HTTPS -q, --unquote unquote PATH_INFO (may be needed when using the ajp protocol) --base-path BASE_PATH the initial portion of the request URL's "path" --http10 use HTTP/1.0 protocol instead of HTTP/1.1 --http11 use HTTP/1.1 protocol (default) -r, --auto-reload restart automatically when sources are modified -d, --daemonize run in the background as a daemon --pidfile PIDFILE file to write pid when daemonizing --umask MASK when daemonizing, file mode creation mask to use, in octal notation (default: 022) --group GROUP the group to run as --user USER the user to run as
使用 -d 选项,这样当您关闭启动 tracd 的终端窗口时,tracd 不会挂起。
提示
提供静态内容
如果 tracd
是项目中唯一使用的 Web 服务器,它也可以用于分发静态内容(tarball、Doxygen 文档等)。
这些静态内容应放在 $TRAC_ENV/htdocs
文件夹中,并通过类似 <project_URL>/chrome/site/...
的 URL 访问。
示例:给定一个 $TRAC_ENV/htdocs/software-0.1.tar.gz
文件,相应的相对 URL 将是 /<project_name>/chrome/site/software-0.1.tar.gz
,这反过来又可以写成 htdocs:software-0.1.tar.gz
(TracLinks 语法)或 [/<project_name>/chrome/site/software-0.1.tar.gz]
(相对链接语法)。
在代理后面使用 tracd
在某些情况下,您可以选择在 Apache 或其他 Web 服务器后面使用 tracd。
在这种情况下,您可能会遇到重定向问题,例如被重定向到主机或协议错误的 URL。在这种情况下(且仅在这种情况下),将 [trac] use_base_url_for_redirect
设置为 true
会有所帮助,因为这将强制 Trac 使用 [trac] base_url
的值进行重定向。
如果您正在使用 AJP 协议连接 tracd
(如果您安装了 flup,这是可能的),那么您可能会遇到双引号问题。考虑添加 --unquote
参数。
另请参阅 TracOnWindowsIisAjp, TracNginxRecipe。
代理后面的 tracd 身份验证
为您的 tracd 实例提供集中式外部身份验证很方便,而不是使用 --basic-auth
。在 #9206 中对此有一些讨论。
以下是基于 Apache 2.2、mod_proxy、mod_authnz_ldap 的配置示例。
首先,我们将 tracd 引入 Apache 的位置命名空间。
<Location /project/proxified> Require ldap-group cn=somegroup, ou=Groups,dc=domain.com Require ldap-user somespecificusertoo ProxyPass https://:8101/project/proxified/ # Turns out we don't really need complicated RewriteRules here at all RequestHeader set REMOTE_USER %{REMOTE_USER}s </Location>
然后我们需要一个单文件插件来识别 HTTP_REMOTE_USER 头作为有效的身份验证源。像 HTTP_FOO_BAR 这样的 HTTP 头在处理过程中将转换为 Foo-Bar。将其命名为类似 remote-user-auth.py 并将其放入 proxified/plugins 目录。
from trac.core import * from trac.config import BoolOption from trac.web.api import IAuthenticator class MyRemoteUserAuthenticator(Component): implements(IAuthenticator) obey_remote_user_header = BoolOption('trac', 'obey_remote_user_header', 'false', """Whether the 'Remote-User:' HTTP header is to be trusted for user logins (''since ??.??').""") def authenticate(self, req): if self.obey_remote_user_header and req.get_header('Remote-User'): return req.get_header('Remote-User') return None
将此新参数添加到您的 TracIni
[trac] ... obey_remote_user_header = true ...
运行 tracd
tracd -p 8101 -s proxified --base-path=/project/proxified
请注意,如果您想为所有项目安装此插件,则必须将其放在您的全局 plugins_dir 中,并在全局 trac.ini 中启用它。
全局配置(例如 /srv/trac/conf/trac.ini
)
[components] remote-user-auth.* = enabled [inherit] plugins_dir = /srv/trac/plugins [trac] obey_remote_user_header = true
环境配置(例如 /srv/trac/envs/myenv
)
[inherit] file = /srv/trac/conf/trac.ini
提供不同于 / 的基本路径
Tracd 支持提供基本 URL 不同于 /<project> 的项目。更改此设置的参数名称是:
$ tracd --base-path=/some/path
另请参阅:TracInstall、TracCgi、TracModPython、TracGuide、将 tracd.exe 作为 Windows 服务运行