openSUSE:镜像指南

跳转至: 导航, 搜索
该文档教您如何为 openSUSE 设置镜像服务器。

指南

下面我将列出为 openSUSE 设置镜像服务器的步骤。请随意改进此页面,也可以发送反馈给 ftpadmin at suse.de。

我们假设:该镜像服务器运行的就是 openSUSE,这样指南可以更具体一点。

如果您运行的是一个不同的操作系统,细节上可能有所不同,但希望这份指南依然可以作为一个参考例子。

  • 首先,请确定您能承受 预期的流量,您的服务商不会踢掉你的 VPS。
  • 需安装的软件包:
    • rsync
    • ntp
    • apache2-prefork 或者 apache2-worker
  • 定期升级服务器的安全更新
  • 放火墙:
    • 您要用的话,请打开端口 80 (HTTP) 和 873 (rsync)
  • 常规:
    • 安装 ntp
    • 添加时间服务器的 IP 到 /etc/ntp.conf,并配置启动 (rcntp start; chkconfig -a ntp)
    • 确保主机名和 DNS 解析有效:
      • 检查 /etc/hosts, /etc/HOSTNAME, /etc/resolv.conf
      • 检查 'hostname' 和 'hostname -f' 命令的返回结果是有用的东西。有效的主机名和名称解析是十分重要 。
  • 网络服务器:
    • 假设您的镜像主机名是:mirror.example.com
    • 创建 /etc/apache2/vhosts.d/mirror.example.com.conf
<VirtualHost *:80>
   ServerAdmin admin@example.com
   ServerName mirror.example.com

   DocumentRoot "/srv/pub/opensuse"

   <Directory "/srv/pub/opensuse">
       Options FollowSymLinks Indexes
       IndexOptions FancyIndexing VersionSort NameWidth=* Charset=UTF-8 TrackModified FoldersFirst XHTML
       AllowOverride None
       Order allow,deny
       Allow from all
   </Directory>

   Alias /robots.txt /srv/www/mirror.example.com/robots.txt
   <Directory "/srv/www/mirror.example.com">
       Options None
       Order allow,deny
       Allow from all
   </Directory>

   Include /etc/apache2/conf.d/apachestats.conf

</VirtualHost>
    • 创建一个 robots.txt 来避免网络爬虫:
      • mkdir /srv/www/mirror.example.com
      • 把下面内容放到 /srv/www/mirror.example.com/robots.txt:
User-agent: *
Disallow: *
    • 高性能优化:
      • 调整 /etc/apache2/server-tuning.conf 中的 MPM 参数为您的内存大小。最糟糕的事就是它太大以至于用到了 SWAP,所以 Apache 的最大大小应该和您的内存一致。apache2-worker 的 MPM 可以更好的利用现有内存,然而 apache2-prefork 的 MPP 更容易配置。观察 ps 中的 RSS 列(您可以减去 SHARED),并乘以最大进程编号...
      • 设置一个较低的 KeepAliveTimeout (调低到 3) 在 /etc/apache2/server-tuning.conf 中
    • rcapache2 restart; chkconfig -a apache2


  • 内容:
    • 创建一个特殊用户,和一个文件夹来作为镜像目录:
      • groupadd mirror
      • useradd -m -g mirror -c "Mirror User" -s /bin/bash mirror
      • mkdir /srv/pub/opensuse
      • mkdir /srv/pub/opensuse/update
      • chown -R mirror:mirror /srv/pub/opensuse
    • 选择一个您想要同步的 rsync 模块。它们的具体描述在 rsync 模块。本例中使用 "opensuse-hotstuff-160gb" 模块。
    • 添加一个 cron 任务来同步内容。下例以我们推送最频繁的最多请求文件为例(每六小时,在一小段随机 offset 之后):
1 */6 * * *    mirror   sleep $(($RANDOM/16)); rsync -rlpt rsync.opensuse.org::opensuse-hotstuff-160gb /srv/pub/opensuse/ --delete-after --delete-excluded --max-delete=4000 --timeout=1800 -hi
    • 您可以试试这个命令,然后推送初始同步(当然要看着它啦),像这样:
      • su - mirror
      • rsync -rlpt rsync.opensuse.org::opensuse-hotstuff-160gb /srv/pub/opensuse/ --delete-after --delete-excluded --max-delete=4000 --timeout=1800 -hi
    • 对 cron 任务使用锁闭,因为它将来可能会运行时间过长,以至于新任务卡住。最简单的在锁闭环境运行 cron 任务的方法是使用 withlock,这是一个小封装脚本,可以这么下载:
    • 现在,让 cron 任务在能处理锁闭的封装脚本中运行 rsync:
1 */6 * * *    mirror   sleep $(($RANDOM/16)); /usr/local/bin/withlock /home/mirror/LOCK-opensuse-hotstuff  rsync -rlpt rsync.opensuse.org::opensuse-hotstuff-160gb /srv/pub/opensuse/ --delete-after --delete-excluded --max-delete=4000 --timeout=1800 -hi


  • 通过设置一个 rsync 服务器以给 openSUSE 扫描器 访问权限:
    • (rcrsyncd start; chkconfig -a rsyncd)
    • 添加下面内容到 /etc/rsyncd.conf:
 [opensuse]
         path = /srv/pub/opensuse
         comment = rsync access for openSUSE scanner
         uid = nobody
         # 如果您想要限制 openSUSE 镜像扫描器的访问:
         #hosts allow = 195.135.220.0/22
  • 通知官方 中转器
    • 写信给 admin at opensuse org,注册您的镜像
    • 请确保您的网络服务起是开机的!中转器每隔几分钟就会检查它一下...但直到下一次探测开始,它仍会中转下载者到您的主机上。
  • 额外的,您可以通过配置特定内容的 缓存控制头部 来为用户提升服务质量。想法是使用缓存控制头部来标记元数据文件,声明它们不是来自于之前未检查过新鲜度的中介(代理)缓存。这将极大的降低用户下载文件不一致的风险 (一个文件是来自于缓存的旧文件,里鞥一个来自于原始服务器的新文件)。添加下面内容到您的 Apache 配置 (在一个目录环境之外):
   <LocationMatch "\.(xml|xml\.gz|xml\.asc)">
       Header set Cache-Control "must-revalidate"
       ExpiresActive On
       ExpiresDefault "now"
   </LocationMatch>
    • 此配置需要 mod_headers 和 mod_expires。使用如下命令启用它们:
a2enmod headers
a2enmod expires
rcapache2 restart


  • 监控 和邮件
    • 有很多方法来配置和使用邮件系统,我使用的是:
      • 在 /etc/aliases 中把我自己添加为 root 别名: "root: poeml@example.com"
      • 确保能够发信 (您可能需要配置下中继)。确保您的镜像不接受外部来信,将它们扔到垃圾邮件枢纽中。
      • 让发信人更显式: usermod -c "root at $(hostname)" root
      • 一个非常有用的软件包是 sysstat。安装后,启动它 (rcsysstat start; chkconfig -a sysstat)。"sar -A | less" 命令将显示多种可供分析的性能数据。

需要注意的事情

如果镜像是与我们的测试 rsync 服务器同步的 (stage.opensuse.org),需要注意以下几点:

  • rsync 需要能够尊重目录权限,并能在目标机器上复刻。上面的例子都注意了这点。如果权限没有正确复刻,它将干扰翻牌过程。
  • 总是使用不同于您的网络服务器管理员的用户运行您的镜像脚本。相同的话将会让网络服务器获得所有文件的读取权限,这将干扰翻牌过程。
  • 运行镜像脚本的用户也必须不能是运行 rsync 守护程序的用户。
  • 永远不要使用 root 运行您的网络服务器。它也会干扰翻牌过程。
  • 如果您恰好也运行了一个公共 rsync 服务器,请确保您的 rsync 守护程序是使用一个不同的用户运行的,不能是运行从 openSUSE 拉内容的脚本的用户。否则您将公开分发依然是 预演的 不应该公开的内容。

参考:访问 stage.opensuse.org 的条件

资源保护

如果您的镜像很受欢迎,那么可能产生大量流量,由于打开了太多连接的下载器。有些下载器同时打开很多连接以抓取更多流量。这种事情本身不是错的,但如果它们打开了太多的连接 (20,或甚至大于 100),您就得做点什么了,来保护您的服务器,也保护您提供的资源,不然其他用户就没法访问它了。

您可以使用下面命令查看同时间的连接:

rcapache2 full-server-status | grep ' W ' | sort -k 11

这条命令基本上是获取 Apache 服务器状态输出,然后按 IP 地址排序,让你很清楚的看出某个 IP 开启了多少个连接。

也有一系列 Apache 模块可以做到。别搞混了:在这种场景下您不想要的是连接限制,因为它让客户端停留时间更长,占用服务器插槽更长。我可以推荐两个模块:

mod_limitipconn

来自 http://dominia.org/djao/limitipconn.html。软件包在这儿:http://software.opensuse.org/search?q=apache2-mod_limitipconn

该模块按 IP 限制同一时间的连接。示例配置:

<IfModule mod_limitipconn.c>
    <Directory /srv/pub/opensuse>
        MaxConnPerIP 20
        # 从连接限制中豁免图片通常是不错的想法。
        # 如果您的网页有很多 inline 图片的话。
        # 因为这些页面通常会造成一系列并发图片请求
        NoIPLimit image/*
    </Directory>
</IfModule>

限制不能太小,因为并发连接也意味着使用通用代理的企业用户呀。

mod_ip_count

软件包在这儿: http://software.opensuse.org/search?q=apache2-mod_ip_count_modmemcache. 需要 mod_memcache 于 http://software.opensuse.org/search?q=apache2-mod_memcache 和一个 memcache 守护程序 (http://software.opensuse.org/search?q=memcached)。

该模块按 IP 限制接受新连接的比率。

<IfModule mod_memcache.c>
    MemcacheServer 127.0.0.1:11211 min=0 smax=16 max=32 ttl=600
</IfModule>
<IfModule mod_ip_count.c>
    # Max number of requests before failing
    MemCacheMaxRequests 800
    # Time period in which the requests have to come (seconds)
    MemCacheMaxTime 120
</IfModule>

这个时间窗口必须足够大,这样我们就不会禁止下载一个大目录的客户端,比如 openSUSE 安装客户端会从 12.2RC2/repo/x86_64/ 中下载安装软件包。

使用 'rcmemcached start' 启动 memcache 守护程序,使用 'chkconfig -a memcached' 让它永远启动。

参考