🔗 在系统上运行多个 Squid 实例
在系统上运行多个 Squid 实例并不难,但它需要管理员确保它们不会相互干扰,并且知道如何识别对方以避免转发循环(或被错误检测到的转发循环)。
🔗 SMP 启用的 Squid
Squid-3.5 提供了 -n 命令行选项,用于为启动的每个 Squid 实例配置一个唯一的服务名称。SMP 感知进程的每组进程将仅与其他使用相同服务名称的进程进行交互。服务名称始终存在,当命令行中缺少 -n 选项时,将使用默认服务名称 squid。
服务名称只能包含 ASCII 字母数字值(a-z、A-Z、0-9)。
当使用非默认服务名称运行 squid 时,所有其他命令行选项都需要使用 -n 服务名称来定位正在控制的服务。这包括 -z 选项,因为某些缓存类型需要 SMP 感知处理。
即使在使用服务名称的情况下,下面概述的配置指令仍然需要配置唯一值。
宏 ${service_name} 已添加到 squid.conf 处理中。它会扩展为解析配置文件进程的服务名称。
🔗 相关的 squid.conf 指令
- visible_hostname:为了方便故障排除,您可能希望保持此设置的唯一性。
- unique_hostname:如果您不更改 visible_hostname 并希望您的缓存协同工作,请至少更改此设置以正确检测转发循环。
-
http_port:各种 squid 要么运行在不同的端口上,要么运行在不同的 IP 地址上。后一种情况下的语法是
192.0.2.1:3128和192.0.2.2:3128。域名可以代替 IP 地址使用,但请注意,每个实例使用的域名解析到不同的 IP。 - icp_port、snmp_port:与 http_port 相同。如果您不需要 ICP 和 SNMP,请从配置文件中删除。
- access_log、cache_log:您希望为不同的 squid 实例拥有不同的日志文件。Squid 即使所有实例都记录到同一个文件也**可能**工作,但结果可能会混乱不堪。
-
pid_filename:此文件**必须**对每个实例都不同。Squid 使用它来检测正在运行的实例并发送各种内部消息(例如
squid -k reconfigure)。 >
Squid-4 及更高版本默认使用 ${service_name},因此不再需要配置。 - cache_dir:确保不存在重叠的目录。Squid 在访问它们时不会进行协调,并且在它们的“游乐场”之间移动东西是**一件坏事 TM**。
- include:为了减少复制错误,将共享的配置部分(ACL 定义等)分解到单独的文件中,然后通过 include 指令将它们放在每个 squid.conf 中的正确位置。
🔗 技巧
此部分不适用于 SMP Squid。
我在一台机器上管理多个运行的 squid 时发现的最简单的方法是
- 为每个实例创建一个配置文件
-
为每个实例编写一个小型 shell 脚本(命名为
squid-something),其中包含exec /usr/local/sbin/squid -f /usr/local/etc/squid-something.conf $@(当然,可能需要应用相关的路径更改)。
- 然后像对待单个安装的 squid 设置一样运行它们。
🔗 使用 iptables 在单个端口后进行负载均衡
作者:Felipe Damasio, Eric Dumazet, Jan Engelhardt
操作理论是:它将新的 HTTP 连接放入 extrachain 链。在那里,它为每个连接标记一个顺序号。此标记稍后由 PREROUTING 链检查,并根据标记转发到 squid 端口。
因此,第一个连接将被发送到端口 3127,第二个到 3128,第三个到 3129,第四个回到 3127(通过端口循环实现均匀分布)。
在 netfilter-devel 上开发的完整讨论串在这里:http://marc.info/?l=netfilter-devel&m=127483388828088&w=2
(请注意换行,iptables 规则是单行)。
N=3
first_squid_port=3127
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -N extrachain
iptables -t mangle -A PREROUTING -p tcp --dport 80 -m conntrack --ctstate NEW -j extrachain
for i in `seq 0 $((N-1))`; do
iptables -t mangle -A extrachain -m statistic --mode nth --every $N --packet $i -j CONNMARK --set-mark $i
done
for i in `seq 0 $((N-1))`; do
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -m connmark --mark $i -j TPROXY --tproxy-mark 0x1/0x1 --on-port $((i+first_squid_port))
done ```
类别: 知识库
导航: 站点搜索、站点页面、类别、🔼 向上