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
- 创建一个 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
- 调整 Apache 以获得高性能
- 内容:
- 创建一个特殊用户,并创建一个用于镜像的目录
- 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
- 使用锁定来执行 cronjob,因为它可能需要很长时间运行,并且新的作业最终可能会堆积起来。使用 withlock 包装器脚本最简单的方法来运行 cronjob 并处理锁定。可通过软件包获得
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" 将显示用于分析的各种性能数据。
- 有很多方法可以配置和使用邮件系统。我的做法是
- apachestats - 创建可视化服务器负载图
- a2enmod status
- 将 127.0.0.1 添加到 /etc/apache2/mod_status.conf
- 将 APACHE_EXTENDED_STATUS="on" 设置在 /etc/sysconfig/apache2 中
- 安装 apachestats 软件包 https://software.opensuse.net.cn/search?q=apachestats
- 图表将在 http://your_mirror/apachestats/
需要注意的事项
如果镜像从我们的 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 下运行。否则,您可能会公开提供仍处于“暂存”状态(即不应公开)的内容。
资源保护
如果您的镜像非常受欢迎,可能会发生这种情况:它会收到来自下载客户端的大量流量,这些客户端打开过多的连接。有些下载客户端会同时打开连接以获取更多带宽。这本身并不是一件坏事,但是如果它们打开过多的连接(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 页面上的说明 在 镜像页面 上列出它。
参见
- 从旧 wiki Mirror Setup Howto 转移