实战前的叮嘱 写给网络领域新同学的话
你好,我是谢友鹏。
经过前两节课的铺垫,相信你已经对网络的运行原理和架构设计的核心考量有了整体认识。从下一节课开始,每节课都会围绕一个具体的问题展开,深入学习背后的解决方案,并剖析相关的网络原理。许多章节会包含实战环节,让你在实践中加深思考。
这次加餐是为刚刚接触网络领域的同学提供一些实战建议,帮助大家少走弯路,因此它并非课程的正式内容。如果你已有一定的网络实战经验,可以选择跳过这部分内容,直接进入下一节课的学习。
课程实验资料
课程实验资源是托管到Github仓库:geektime-hands-on-network-architecture 的。如果有同学无法访问外网,可以通过 网盘 下载,提取码: 7kp4 。下载解压即可,根目录下的数字编号对应的是课程编号。
实验建议
第一条建议是,在实验过程中,建议使用虚拟机进行操作,主要有两个原因。
一是避免影响本机网络部分实验涉及网络配置,如修改路由或防火墙规则,可能导致本机网络连接异常。使用虚拟机可以有效隔离实验环境,避免影响正常上网。
二是避免实验环境冲突不同章节的实验可能会产生端口或配置上的冲突。例如,某个实验已监听 80 端口,而后续实验可能也需要监听 80 端口,就可能导致新服务启动失败。对于这一问题,我们有两种解决办法。
- 方法 1:在遇到冲突时,手动清理实验环境,如关闭占用端口的进程。可以执行以下命令查看当前占用
80
端口的进程,并选择合适的方法释放端口:
sudo lsof -i:80 # 查看占用 80 端口的进程
sudo kill -9 <PID> # 直接杀死进程
sudo systemctl stop <服务名> # 停止 systemctl 管理的服务
- 方法 2:使用快照或创建新的虚拟机,每个实验使用独立环境,避免干扰。
第二条建议是,实验过程中,确保操作和配置与自己的组网相匹配,特别是涉及 IP 地址、接口名称和文件路径时,需要根据实际环境进行调整。在Linux上可以通过ifconfig查看自己设备的接口名称和IP。
实验特点说明
- 实验难度并非线性递增:课程实验的难度并非严格按照章节顺序递增。例如,第 3-5 章、18 章、21 章涉及组网,可能对新手来说比其他章节更有挑战性。请不要被一开始的难度吓倒,耐心完成后会有更深刻的理解。
- 不同章节的实验相互独立:每个实验都是独立的,某个实验未能完成,并不会影响其他章节的学习。如果短时间内无法解决某个问题,可以先跳过,后续学习深入后再回来解决。遇到暂时无法攻克的难点,可以记下,作为“技术债务”待后续清算。
- 实验内容尽量简化,鼓励拓展:课程中的实验尽量设计得简单易操作,以照顾不同水平的同学。如果有余力,建议在掌握基本原理后尝试拓展,如修改实验参数、优化配置,或者思考在实际生产环境中如何应用。
遇到问题怎么办?
遇到问题是学习过程中不可避免的,希望你能养成主动思考的习惯,并尝试以下方法:
- 查阅第一手资料:你可以开源软件的官方文档,也可以使用
man
命令(如man ip
查看ip
命令的用法)。 - 参考课程 导学|实验说明&学习指南 一节的工具与排查方法。
- 留言交流。
遇到问题无法解决时,建议在评论区发布你的问题,尽可能提供完整的信息(现象、组网情况、已尝试的解决方案等),这样大家更容易帮助你分析问题。
实验涉及开源软件的简单说明
课程实验会涉及到 Nginx、Keepalived、frr、minio、trafficserver、wireguard 等开源软件的使用。为了保证课程逻辑的连贯性,课程一般只会对配置做整体介绍,而不是详细介绍每个字段。遇到不懂的配置,推荐大家优先使用 AI 工具查询。
当然 AI 回答可能存在幻觉,有疑问的地方可以去官网求证。如果你不想阅读英文,网上也可以查到大量的中文资料。同时,鼓励大家在评论区提问和交流。
比如我问ChatGPT以下Nginx配置的含义。
http {
# HTTP 负载均衡
upstream http_backend {
#在这里指定所有下游http服务的ip和端口
server 127.0.0.1:8081 max_fails=3 fail_timeout=10s;
server 127.0.0.1:8082 max_fails=3 fail_timeout=10s;
server 127.0.0.1:8083 max_fails=3 fail_timeout=10s;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://http_backend;
proxy_next_upstream error timeout http_500;
proxy_next_upstream_tries 3;
}
}
}
以下是ChatGPT的回答,我觉得还挺全面易懂的。
这个 Nginx 配置的作用是通过反向代理和负载均衡,将 HTTP 请求分发到后端服务器池(upstream),如果某些后端服务器故障,则自动切换到其他可用的服务器。
配置解析
1. upstream http_backend(定义后端服务器池)
upstream http_backend {
server 127.0.0.1:8081 max_fails=3 fail_timeout=10s;
server 127.0.0.1:8082 max_fails=3 fail_timeout=10s;
server 127.0.0.1:8083 max_fails=3 fail_timeout=10s;
}
upstream http_backend
:定义一个 后端服务器池,命名为 http_backend
。
server 127.0.0.1:8081
:指定一台后端服务器,监听 127.0.0.1:8081
端口。
max_fails=3 fail_timeout=10s
:如果该服务器在 10 秒内失败 3 次(请求失败或超时),则标记为不可用,在 fail_timeout
期间不再向其发送请求。
失败的判定:
- Nginx 在尝试连接后端服务器时,如果返回错误(如超时、连接失败等),计为一次失败。
- 超过
max_fails
设定的次数后,该服务器在fail_timeout
时间内不再被使用。
2. server 监听 HTTP 请求
listen 8080;
:让 Nginx 监听 8080 端口,用于接收客户端请求。
server_name localhost;
:指定服务器名称(主机名匹配规则),这里匹配 localhost
,但由于没有使用 server_name
进行高级匹配,这一项在本地测试时影响不大。
3. location /(反向代理到后端)
location / {
proxy_pass http://http_backend;
proxy_next_upstream error timeout http_500;
proxy_next_upstream_tries 3;
}
location / {}
:匹配所有路径(/
开头的请求)。
proxy_pass http://http_backend;
:
- 将请求转发到 upstream 里的后端服务器(
http_backend
服务器池)。 - 负载均衡策略默认是 轮询(round-robin),即依次请求
127.0.0.1:8081 -> 127.0.0.1:8082 -> 127.0.0.1:8083
依次循环。
4. proxy_next_upstream(失败重试策略)
如果当前请求的后端服务器出现以下问题,则自动切换到下一个可用服务器。
error
:连接错误(如 TCP 连接失败)。timeout
:请求超时。http_500
:后端服务器返回500 Internal Server Error
。
这行命令表示最多尝试 3 次不同的后端服务器。
例如:
- 请求
127.0.0.1:8081
,如果失败(超时或500
错误),切换到127.0.0.1:8082
。 127.0.0.1:8082
也失败,则切换到127.0.0.1:8083
。- 如果
127.0.0.1:8083
仍然失败,返回错误给客户端。
整体流程
- 客户端请求
http://localhost:8080/
,Nginx 监听到请求。 - Nginx 在
http_backend
服务器池里 选择一个后端服务器(默认轮询)。 - 如果当前服务器 失败 3 次(
max_fails=3
),该服务器 10 秒内不再被选用(fail_timeout=10s
)。 - 如果请求的后端服务器发生超时、连接失败、返回
500
错误 ,Nginx 自动切换到下一个可用服务器(最多重试 3 次 )。 - 若所有后端服务器都失败,则返回错误给客户端。
提议
最后,提议大家积极留言分享自己的实验经验。无论是成功的实验还是失败的尝试,都欢迎在评论区交流,让大家互相学习、少踩坑。