openSUSE:镜像指南

跳转到:导航搜索
本文档将指导您如何设置 openSUSE 的镜像。

逐步指南

下面,我将列出设置 openSUSE 内容镜像的步骤。欢迎改进此页面,或将反馈邮件发送至 ftpadmin at suse.de。

有一个主要假设:镜像本身运行 openSUSE。这允许我给出具体的指示。

如果您运行不同的操作系统,细节会有所不同,但希望本指南仍然可以作为一个示例!

  • 首先,请确保您能够负担得起预期的流量,并且您的互联网服务提供商不会终止您的合同!
  • 需要安装的软件包
    • rsync
    • chronyd 或 ntp (或 systemd-timesyncd)
    • apache2-prefork 或 apache2-worker 或 nginx (或您想要使用的任何其他 Web 服务器)
  • 确保定期更新机器的安全补丁
  • 防火墙:
    • 如果您使用防火墙,请打开端口 80 (HTTP) 和 873 (rsync)。
  • 通用事项:
    • 将时间服务器的主机名或 IP 地址添加到 /etc/chrony.d/local.conf 或 /etc/ntp.conf,并配置它启动 (systemctl start chronyd|ntpd; systemctl enable chronyd|ntpd)
    • 如果不确定如何配置 NTP 客户端,请遵循 https://doc.opensuse.net.cn/documentation/leap/reference/single-html/book-reference/index.html#cha-ntp 的说明
    • 确保主机名和 DNS 解析是合理的
      • 检查 /etc/hosts、/etc/HOSTNAME、/etc/resolv.conf
      • 检查命令 'hostname' 和 'hostname -f' 是否返回有用的信息。正常工作的主机名和名称解析非常有帮助。
  • Web 服务器:
    • 假设您的镜像主机名是: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
       Require all granted
       # Order allow,deny # prior Leap 15.3 
       # Allow from all # prior Leap 15.3
   </Directory>

   Alias /robots.txt /srv/www/mirror.example.com/robots.txt
   <Directory "/srv/www/mirror.example.com">
       Options None
       Require all granted
       # Order allow,deny # prior Leap 15.3 
       # Allow from all # prior Leap 15.3
   </Directory>

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

</VirtualHost>
    • 对于 nginx,创建 /etc/nginx/nginx.conf
worker_processes  1;
events {
   worker_connections  1024;
   use epoll;
}
http {
   include       mime.types;
   default_type  application/octet-stream;
   gzip           on;
   sendfile       on;
   tcp_nopush     on;
   tcp_nodelay    on;
   keepalive_timeout  65;
   server {
       listen       80;
       server_name  mirror.example.com;
       access_log  /var/log/nginx/access.log;
       location / {
           root   /srv/pub/opensuse/;
           index  index.html index.htm;
           autoindex on;
       }
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   /srv/www/htdocs/;
       }
       location /robots.txt { 
           add_header Content-Type text/plain;
           return 200 "User-agent: *\nDisallow: /\n"; 
       }
   }
}
    • 创建一个 robots.txt 以避免网络爬虫
      • mkdir /srv/www/mirror.example.com
      • 将以下内容放入 /srv/www/mirror.example.com/robots.txt
User-agent: *
Disallow: *
    • 调整 Apache 以获得高性能
      • 调整 /etc/apache2/server-tuning.conf 中的 MPM 特性,使其适合您机器的内存大小。最糟糕的情况是它开始交换,因此 Apache 的最大大小需要适合您拥有的内存。worker MPM 可以更好地利用可用内存,但是 prefork MPM 更易于配置。观察 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" 模块。
    • 添加一个 cronjob 以同步内容。以下是对于最常请求的文件,我们将频繁(每 6 小时,在少量随机偏移后)拉取的示例
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
    • 请注意,此 `rsync` 调用不会导致原子仓库树更新,您的消费者可能会看到过渡错误(FIXME 使用 atomic-rsync 创建改进)
    • 使用锁定来执行 cronjob,因为它可能需要很长时间运行,并且新的作业最终可能会堆积起来。使用 withlock 包装器脚本最简单的方法来运行 cronjob 并处理锁定。可通过软件包获得
      • zypper in withlock
    • 现在,更改 cronjob 以在处理锁定的包装器脚本下运行 rsync
1 */6 * * *    mirror   sleep $(($RANDOM/16)); /usr/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


  • openSUSE 扫描器 提供访问权限,通过设置 rsync 服务器
    • (rcrsyncd start; chkconfig -a rsyncd)
    • 将以下内容添加到 /etc/rsyncd.conf
 [opensuse]
         path = /srv/pub/opensuse
         comment = rsync access for openSUSE scanner
         uid = nobody
         # if you want to limit access to the openSUSE mirror scanner:
         #hosts allow = 195.135.220.0/22


  • 告诉 重定向器
    • 将邮件写给 admin at opensuse org,提供您的详细信息,如 register your mirror 页面上所述
    • 请注意您的 Web 服务器是否正常运行!重定向器将每隔几分钟检查它……但在下一次探测发生之前,它将继续将客户端重定向到您的主机。


  • 为了获得额外的分数,您可以为某些内容配置 缓存控制标头,从而大大提高用户服务的质量。想法是将元数据文件标记为缓存控制标头,指示它们未从中间(代理)缓存提供,而无需在提供之前检查新鲜度。这大大降低了用户看到不一致的风险(一个文件从缓存提供陈旧数据,另一个文件从原始服务器提供新鲜数据)。将此添加到您的 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" 将显示用于分析的各种性能数据。

需要注意的事项

如果镜像从我们的 stage rsync 服务器 (stage.opensuse.org) 同步,则需要注意几点

  • 使用 rsync --delay-updates --delete-delay 以确保一致的仓库
  • 对于大型仓库,--delay-updates 存在问题,因为它无法干净地恢复,并且我们的下载重定向器在 rsync 完成之前看不到文件。在保持仓库一致性的同时,先进行一次或多次运行,不使用 --delay-updates --delete-delay,并使用 --ignore-existing 来获取大部分新文件。
  • rsync 需要以尊重目录权限的方式运行,并在目标机器上重现。上面的示例可以处理它。如果权限没有正确重现,它会干扰 bitflip 发布过程。
  • 始终以与您的 Web 服务器运行的用户 ID 不同的用户 ID 下运行您的镜像脚本。相同的用户 ID 会使所有文件对 Web 服务器可读,从而干扰 bitflip 发布过程。
  • 运行镜像脚本的用户 ID 也需要与运行 rsync 守护进程的用户 ID 不同
  • 切勿以 root 用户身份运行您的 Web 服务器。它也会干扰 bitflip 发布过程。
  • 如果您碰巧也运行公共 rsync 服务器,请确保您的 rsync 守护进程以与从 openSUSE 拉取内容的脚本不同的用户 ID 下运行。否则,您可能会公开提供仍处于“暂存”状态(即不应公开)的内容。

请参阅:访问 stage.opensuse.org 的条件

资源保护

如果您的镜像非常受欢迎,可能会发生这种情况:它会收到来自下载客户端的大量流量,这些客户端打开过多的连接。有些下载客户端会同时打开连接以获取更多带宽。这本身并不是一件坏事,但是如果它们打开过多的连接(20 甚至超过 100),您将不得不采取一些措施来保护您的服务器,并保护您提供的资源,以便它们仍然可供其他合法用户使用。

您可以使用以下命令查看同时连接的数量

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

该命令基本上获取 Apache 服务器状态的输出并按 IP 地址排序,从而轻松查看有多少连接来自何处。

可以使用许多 Apache 模块来实现这一点。不要混淆:在这种情况下,您不希望的是连接节流,因为它会使客户端停留更长时间,并占用服务器插槽更长时间。我推荐两个模块

mod_limitipconn

来自 http://dominia.org/djao/limitipconn.html。软件包在此处:https://software.opensuse.net.cn/search?q=apache2-mod_limitipconn

此模块限制同时处理的连接数,每个 IP 一个。示例配置

<IfModule mod_limitipconn.c>
    <Directory /srv/pub/opensuse>
        MaxConnPerIP 20
        # exempting images from the connection limit is often a good
        # idea if your web page has lots of inline images, since these
        # pages often generate a flurry of concurrent image requests
        NoIPLimit image/*
    </Directory>
</IfModule>

限制不应太小,因为同时连接也可能意味着公司用户通过公共代理访问您的站点。

mod_ip_count

软件包在此处:https://software.opensuse.net.cn/search?q=apache2-mod_ip_count_modmemcache。需要来自 https://software.opensuse.net.cn/search?q=apache2-mod_memcache 的 mod_memcache 和 memcache 守护进程 (https://software.opensuse.net.cn/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 安装客户端,它从 11.0/repo/i586/... 下载软件包

所需的 memcache 守护进程使用 'rcmemcached start' 启动,并配置为使用 'chkconfig -a memcached' 永久启动。

注册您的公共镜像

如果您的镜像公开可用,您可以将其添加到我们的 重定向器数据库,并按照 此 wiki 页面上的说明镜像页面 上列出它。

参见