跳过导航链接 | |
退出打印视图 | |
复制和创建 Oracle Solaris 11.1 软件包系统信息库 Oracle Solaris 11.1 Information Library (简体中文) |
本节讨论如何在 Apache Web 服务器实例后运行 depot 服务器来获得以下优势:
通过内容高速缓存和负载平衡来提高性能。
允许在一个域名下托管多个系统信息库。
将 depot 服务器设置在高速缓存代理后所需的配置极少。除了下文将讨论的目录属性文件和系统信息库搜索结果,提供的所有文件均是唯一的,因此可放心地无限期放入高速缓存(如果需要这样做)。另外,所有 depot 响应均包含相应的 HTTP 标头,从而确保高速缓存中的文件不会因错误而变为过时文件。
有关将 Apache 配置为高速缓存代理的更多信息,请参见 Apache Caching Guide(高速缓存指南)。
使用 CacheRoot 指令指定用于包含缓存文件的目录。请确保 Apache 进程可写入指定的目录。即使 Apache 无法写入此目录,也不会显式输出错误消息。
CacheRoot /tank/proxycache
Apache 允许为特定目录启用高速缓存。您可能希望系统信息库服务器将服务器上的所有内容都放入高速缓存,如以下指令中所示。
CacheEnable disk /
使用 CacheMaxFileSize 指令设置要缓存的文件的最大大小。Apache 的缺省值 1 MB 对于大多数系统信息库来说可能太小。以下指令将缓存文件的最大大小设置为 1 GB。
CacheMaxFileSize 1000000000
调整盘上高速缓存的目录结构,以便获得与底层文件系统相适应的最佳性能。在 ZFS 数据集中,多个目录级别对性能的影响超过一个目录中有大量文件的影响。因此,请将目录级别配置为一,并在每个目录中包含大量文件。使用 CacheDirLevels 和 CacheDirLength 指令控制目录结构。将 CacheDirLevels 设置为 1。将 CacheDirLength 设置为一个合适的值,该值可以使目录数与每个目录中的文件数达到良好的平衡。下面设置的值 2 将生成 4096 个目录。有关更多信息,请参见 Apache Disk-based Caching(基于磁盘的高速缓存)文档。
CacheDirLevels 1 CacheDirLength 2
系统信息库目录属性文件 (catalog.attrs) 包含系统信息库目录的当前状态。此文件可能大到有必要放入高速缓存。但是,如果后端系统信息库的目录发生更改,此文件将过时。您可以使用以下两种方法之一来解决此问题。
不缓存此文件。如果系统信息库服务器在高带宽环境(在此环境中无需考虑流量增加)中运行,则此解决方法最有效。以下截取了 httpd.conf 文件的部分内容,其中显示了如何指定不缓存 catalog.attrs 文件:
<LocationMatch ".*/catalog.attrs"> Header set Cache-Control no-cache </LocationMatch>
每次更新后端系统信息库的目录时在高速缓存中删改此文件。
搜索软件包系统信息库时会根据请求生成定制响应。因此,搜索结果不是很适合放入高速缓存。depot 服务器会设置相应的 HTTP 标头,以确保搜索结果在高速缓存中不会过时。但是,预计通过高速缓存节省的带宽很少。以下截取了 httpd.conf 文件的部分内容,其中显示了如何指定不缓存搜索结果。
<LocationMatch ".*/search/\d/.*"> Header set Cache-Control no-cache </LocationMatch>
使用 pkg(5) depot 服务器,您可以轻松地将本地网络中或 Internet 上的系统信息库变为可供访问。但是,depot 服务器不支持在一个域名或复杂前缀下提供多个系统信息库。要在一个域名下托管多个系统信息库,请在 Web 代理后运行 depot 服务器。在 Web 代理后运行 depot 服务器还可以提高服务器的性能,即在多个 depot 服务器上启用负载平衡和启用内容高速缓存。
本节中的示例将 Apache Web 服务器用作代理软件。Oracle Solaris 11.1 OS 包含位于 web/server/apache-22 软件包中的 Apache Web 服务器和位于 /etc/apache2/2.2 中的基本 httpd.conf 文件。通过启用 svc:/network/http:apache22 服务可激活 Apache Web 服务器。有关其他信息,请参见 Apache HTTP 服务器 2.2 文档。
这些示例中所示的原则可应用于任何代理服务器软件。
以下设置会影响性能和安全。
HTTP 客户机可以通知服务器它们接受在 HTTP 请求中传递压缩数据。启用 Apache DEFLATE 过滤器可以大幅度减少元数据(如目录和清单)的线上传输大小。元数据(如目录和清单)通常可以压缩 90%。
AddOutputFilterByType DEFLATE text/html application/javascript text/css text/plain
软件包可能包含用于 URL 的编码正斜杠。要确保这些正斜杠不被解释为目录分隔符,请将 Apache 设置为不对这类斜杠解码。
AllowEncodedSlashes NoDecode
注 - 省略此设置会对搜索功能产生非常不利的影响。
增大 MaxKeepAliveRequests 值可允许客户机在不关闭连接的情况下发出更多的通过管道传输的请求。Apache 的缺省值 100 过小。
MaxKeepAliveRequests 10000
该代理超时值设置 Apache 等待后端 depot 响应的时间长度。对于大多数操作而言,30 秒已足够。返回大量结果的搜索所花费的时间会长得多。您可能需要增大超时值来满足此类搜索。
ProxyTimeout 30
请确保前向代理已禁用。
ProxyRequests Off
本节说明有多个系统信息库的设置、非负载平衡设置和负载平衡设置。
本示例显示非负载平衡 depot 服务器的基本配置。本示例将 http://pkg.example.com/myrepo 连接到 internal.example.com:10000。
如果需要设置此示例中未介绍的其他属性,其说明请参见使用多个 Depot 服务器实例提供多个系统信息库。
您应使用 pkg/proxy_base 设置来配置 depot 服务器,在该设置中指定用于访问 depot 服务器的 URL。使用以下命令设置 pkg/proxy_base:
$ svccfg -s pkg/server add repo $ svccfg -s pkg/server:repo "setprop pkg/proxy_base = astring: http://pkg.example.com/myrepo" $ svcadm refresh pkg/server:repo $ svcadm enable pkg/server:repo
pkg(5) 客户机在执行网络操作时会打开 20 个到 depot 服务器的并行连接。请确保在任何给定时间,depot 线程的数目与预期的服务器连接数匹配。使用以下命令设置每个 depot 服务器的线程数目:
$ svccfg -s pkg/server:repo "setprop pkg/threads = 200" $ svcadm refresh pkg/server:repo $ svcadm restart pkg/server:repo
使用 nocanon 可隐藏 URL 规范。此设置对于正常运行搜索很重要。另外,将后端连接的数目限制为 depot 服务器提供的线程的数目。以下截取了 httpd.conf 文件的部分内容,其中显示了如何代理一个 depot 服务器:
Redirect /myrepo http://pkg.example.com/myrepo/ ProxyPass /myrepo/ http://internal.example.com:10000/ nocanon max=200
在代理后运行 depot 服务器的最重要原因是可以在具有不同前缀的一个域名下轻松运行多个系统信息库。带有前缀的简单代理配置中的示例可以轻松扩展为支持多个系统信息库。
在本示例中,一个域名的三个不同前缀连接到三个不同的软件包系统信息库:
http://pkg.example.com/repo_one 连接到 internal.example.com:10000
http://pkg.example.com/repo_two 连接到 internal.example.com:20000
http://pkg.example.com/xyz/repo_three 连接到 internal.example.com:30000
pkg(5) depot 服务器采用 SMF 管理的服务。因此,要在同一个主机上运行多个 depot 服务器,只需要创建一个新的服务实例:
$ svccfg -s pkg/server add repo1 $ svccfg -s pkg/server:repo1 setprop pkg/property=value $ ...
和前一个示例一样,每个 depot 服务器运行 200 个线程。
Redirect /repo_one http://pkg.example.com/repo_one/ ProxyPass /repo_one/ http://internal.example.com:10000/ nocanon max=200 Redirect /repo_two http://pkg.example.com/repo_two/ ProxyPass /repo_two/ http://internal.example.com:20000/ nocanon max=200 Redirect /xyz/repo_three http://pkg.example.com/xyz/repo_three/ ProxyPass /xyz/repo_three/ http://internal.example.com:30000/ nocanon max=200
您可能希望在 Apache 负载平衡器后运行 depot 服务器。该示例将 http://pkg.example.com/myrepo 连接到 internal1.example.com:10000 和 internal2.example.com:10000。
使用相应的 proxy_base 设置配置 depot 服务器,如带有前缀的简单代理配置中所示。
将后端连接的数目限定为每个 depot 服务器运行的线程数目除以负载平衡器设置中的 depot 数目所得的值。如果不这样,Apache 打开的 depot 连接数目会超过可用连接数目,因此连接将被停止,从而降低性能。使用 max= 参数指定到每个 depot 的最大并行连接数目。以下示例中有两个 depot,每个 depot 运行 200 个线程。有关如何设置 depot 线程数目的示例,请参见带有前缀的简单代理配置。
<Proxy balancer://pkg-example-com-myrepo> # depot on internal1 BalancerMember http://internal1.example.com:10000 retry=5 max=100 # depot on internal2 BalancerMember http://internal2.example.com:10000 retry=5 max=100 </Proxy> Redirect /myrepo http://pkg.example.com/myrepo/ ProxyPass /myrepo/ balancer://pkg-example-com-myrepo/ nocanon
以下示例显示了一个同时采用负载平衡和非负载平衡 depot 服务器设置的系统信息库服务器,并给出了需要添加到 httpd.conf 文件的所有指令。
在本示例中,一个域名的两个不同前缀连接到三个不同的软件包系统信息库:
http://pkg.example.com/repo_one 连接到 internal1.example.com:10000 和 internal2.example.com:10000
http://pkg.example.com/repo_two 连接到 internal1.example.com:20000
AddOutputFilterByType DEFLATE text/html application/javascript text/css text/plain AllowEncodedSlashes NoDecode MaxKeepAliveRequests 10000 ProxyTimeout 30 ProxyRequests Off <Proxy balancer://pkg-example-com-repo_one> # depot on internal1 BalancerMember http://internal1.example.com:10000 retry=5 max=100 # depot on internal2 BalancerMember http://internal2.example.com:10000 retry=5 max=100 </Proxy> Redirect /repo_one http://pkg.example.com/repo_one/ ProxyPass /repo_one/ balancer://pkg-example-com-repo_one/ nocanon Redirect /repo_two http://pkg.example.com/repo_two/ ProxyPass /repo_two/ http://internal.example.com:20000/ nocanon max=200