Linux 从零部署项目实战指南(四):域名绑定、HTTPS 证书与 CI/CD 自动化
本系列面向零基础或初中级开发者,手把手教你将一个项目从零部署到 Linux 服务器,并解决过程中遇到的常见问题。
一、前言
前三篇文章我们完成了:
- • 第二篇:Nginx + MySQL + Redis 环境搭建 ✔️
- • 第三篇:.NET Web 应用部署与环境配置 ✔️
现在应用已经在服务器上跑起来了,但还有几个关键问题没解决:
- 用 IP 访问很不方便
- 没有 HTTPS,浏览器提示"不安全",微信小程序等平台也要求 HTTPS
- 每次更新代码都要手动连接服务器部署
本篇一次性解决这三个问题:域名 → HTTPS → 自动化部署。
二、域名购买与 DNS 解析
2.1 域名是什么?
域名就是网站的"门牌号",比如 google.com、github.com。用户通过域名访问你的网站,而不是记一串 IP 地址。
域名(好记) DNS 解析 IP 地址(难记)yourdomain.com ──────────────────▶ 123.123.123.123
2.2 在哪里买域名?
国内主流域名注册商:
| | | |
|---|
| 阿里云(万网) | | | |
| 腾讯云(DNSPod) | | | |
| 华为云 | | | |
| Cloudflare | | | |
省钱技巧:
- • .com 域名首年一般 45-65 元,续费约 60-80 元/年
- • .xyz 等新后缀首年可能低至 10 元,但续费可能更贵
- • 建议一次买 3 年,避免忘记续费导致域名被别人抢注
2.3 DNS 解析配置
域名购买后,需要在域名管理后台添加 DNS 解析记录,将域名指向你的服务器 IP。
以阿里云为例,登录控制台 → 域名 → DNS 设置 → 添加记录:
记录类型:A(将域名指向一个 IPv4 地址)主机记录:@ (表示 yourdomain.com 本身)记录值:123.123.123.123(你的服务器公网 IP)TTL:10 分钟(默认即可)记录类型:A主机记录:www (表示 www.yourdomain.com)记录值:123.123.123.123(与上面相同的 IP)TTL:10 分钟记录类型:CNAME(可选,用于验证域名所有权)主机记录:_dnsauth记录值:根据服务商提供
DNS 记录类型说明:
2.4 验证域名解析
配置完 DNS 后,需要等待解析生效(通常几分钟到几小时):
# 在本地电脑上测试ping yourdomain.com# 如果返回的 IP 是你的服务器 IP,说明解析生效# 查看 DNS 解析详情nslookup yourdomain.com# 或使用 dig(如果安装了 dnsutils)dig yourdomain.com# 查看域名的 DNS 服务器nslookup -type=NS yourdomain.com
三、ICP 备案(国内服务器必须)
3.1 什么是备案?
根据中国法律,使用国内服务器提供互联网信息服务,必须进行 ICP 备案。未备案的域名无法绑定到国内服务器。
备案流程:
购买域名 → 实名认证 → 提交备案申请 → 管局审核 → 获取备案号 ↓ ↓ ↓ ↓ ↓ 1-2天 1-2天 3-5天 5-20天 永久有效
3.2 备案怎么做?
以阿里云为例:
# 登录阿里云控制台 → ICP 备案# 按照指引填写:# 1. 主体信息(个人/企业)# 2. 网站信息(网站名称、服务内容)# 3. 域名信息(已购买的域名)# 4. 上传资料(身份证正反面、域名证书、核验单等)# 关键步骤:# ① 域名实名认证 - 域名必须完成实名认证才能备案# ② 备案信息填写 - 网站名称不能太随意(如"我的网站"不行)# ③ 幕布拍照 - 部分地区需要手持身份证拍照# ④ 管局审核 - 等待通信管理局审核,一般 5-15 个工作日# ⑤ 获取备案号 - 审核通过后会在网站底部显示备案号
3.3 免备案方案
如果不想备案,有以下选择:
方案一:使用香港服务器 优点:无需备案,速度快 缺点:价格稍贵,无国内节点方案二:使用海外服务器(新加坡/美国/日本) 优点:无需备案,全球覆盖 缺点:国内访问速度慢方案三:使用 Cloudflare CDN 代理 优点:可以隐藏真实服务器 IP 缺点:仍需备案才能使用国内服务器
四、配置 HTTPS 证书
4.1 为什么需要 HTTPS?
HTTP VS HTTPS │ │ │ 明文传输 │ 加密传输 │ 数据可被窃听 │ 数据加密保护 │ 浏览器标记"不安全" │ 浏览器显示🔒 │ 微信小程序不兼容 │ 微信小程序必须 │ 影响 SEO 排名 │ 提升 SEO 排名
4.2 使用 Let's Encrypt 免费证书
Let's Encrypt 是一个免费、自动化的证书颁发机构,证书有效期为 90 天,但可以通过 Certbot 自动续期。
# 安装 Certbot 和 Nginx 插件sudo apt install -y certbot python3-certbot-nginx# 申请证书(需要域名已解析到本服务器)sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com# 按照提示操作:# 1. 输入邮箱地址(用于接收证书到期通知)# Saving debug log to /var/log/letsencrypt/letsencrypt.log# Enter email address (used for urgent renewal and security notices):# 请输入你的邮箱:admin@yourdomain.com# 2. 同意服务条款# Please read the Terms of Service at...# (A)gree/(C)ancel: A# 3. 选择是否将 HTTP 重定向到 HTTPS# Please choose whether to redirect HTTP traffic to HTTPS...# 1: No redirect# 2: Redirect - Make all requests redirect to secure HTTPS access# 选择:2(强烈推荐)# 成功后输出:# Congratulations! Your certificate and chain have been saved at:# /etc/letsencrypt/live/yourdomain.com/fullchain.pem# Your key file has been saved at:# /etc/letsencrypt/live/yourdomain.com/privkey.pem
4.3 自动续期配置
Let's Encrypt 证书有效期只有 90 天,但 Certbot 会自动配置续期任务:
# 查看 Certbot 的定时器状态sudo systemctl status certbot.timer# 输出应显示:active (running)# 测试续期是否正常工作sudo certbot renew --dry-run# 手动续期(如果需要)sudo certbot renew# 查看证书信息sudo certbot certificates# 输出示例:# Found the following certs:# Certificate Name: yourdomain.com# Domains: yourdomain.com www.yourdomain.com# Expiry Date: 2026-10-27 12:00:00+00:00 (VALID: 89 days)# Certificate Path: /etc/letsencrypt/live/yourdomain.com/fullchain.pem# Private Key Path: /etc/letsencrypt/live/yourdomain.com/privkey.pem
4.4 Certbot 自动生成的 Nginx 配置
Certbot 会自动修改你的 Nginx 配置,添加 SSL 相关配置。配置完成后,查看效果:
# 查看 Certbot 生成的配置sudo cat /etc/nginx/sites-available/myproject
Certbot 生成的配置大概长这样:
server { # HTTP 请求自动跳转到 HTTPS listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri;}server { listen 443 ssl; listen [::]:443 ssl; server_name yourdomain.com www.yourdomain.com; # SSL 证书路径 ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 你原来的站点配置 root /home/www/myproject/static; index index.html; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /static/ { alias /home/www/myproject/static/; expires 30d; } location /uploads/ { alias /home/www/myproject/static/uploads/; expires 7d; }}
4.5 验证 HTTPS
# 测试 HTTPS 访问curl -I https://yourdomain.com# 输出应包含:HTTP/2 200# 测试 HTTP 自动跳转curl -I http://yourdomain.com# 输出应包含:301 Moved Permanently# Location: https://yourdomain.com/# 查看 SSL 证书详情curl -vI https://yourdomain.com 2>&1 | grep -E "SSL|certificate|issuer"# 输出应显示 SSL 连接信息和证书颁发者
4.6 手动配置 SSL(如果 Certbot 方式不行)
如果 Certbot 自动配置失败,或者你想手动调整配置:
# 手动配置 Nginx 的 SSLsudo tee /etc/nginx/sites-available/myproject << 'EOF'# HTTP → HTTPS 跳转server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri;}# HTTPS 站点server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; # SSL 证书 ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem; # SSL 安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; # HSTS(强制浏览器使用 HTTPS,有效期 6 个月) add_header Strict-Transport-Security "max-age=15768000" always; # 其他配置与之前一致 root /home/www/myproject/static; index index.html; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /static/ { alias /home/www/myproject/static/; expires 30d; } location /uploads/ { alias /home/www/myproject/static/uploads/; expires 7d; }}EOF# 测试配置并重新加载sudo nginx -t && sudo systemctl reload nginx
五、CDN 加速(可选)
5.1 CDN 是什么?
CDN(Content Delivery Network)将你的网站内容缓存到全球各地的节点上,用户访问时从最近的节点获取数据,速度更快。
用户(北京) CDN 节点(北京) 源站(上海) │ │ │ │ 请求 yourdomain.com │ │ ├─────────────────────────────▶│ │ │ │ 缓存未命中,回源请求 │ │ ├─────────────────────────────▶│ │ │ ◀─────────────── 返回数据 │ │ ◀─── 缓存并返回 ────────────┤ │ │ │ │ │ 下次同一用户或附近用户 │ │ │ CDN 节点直接返回缓存 │ │ ├─────────────────────────────▶│ │ │ ◀────── 直接返回缓存 ───────┤ │
5.2 配置 CDN(以阿里云 OSS + CDN 为例)
方案一:全站 CDN 加速
# 1. 在阿里云控制台 → CDN 服务 → 添加域名# 2. 填写域名:yourdomain.com# 3. 源站信息:你的服务器 IP# 4. 加速类型:全站加速# 5. 配置完成后,将域名 DNS 解析改为 CNAME 到 CDN 分配的域名# 修改 DNS 解析:# 记录类型:CNAME# 主机记录:@# 记录值:yourdomain.com.w.alikunlun.com(CDN 分配的域名)# TTL:10 分钟
方案二:静态资源 CDN 加速(推荐,成本更低)
# 静态资源(图片、CSS、JS)走 CDN,动态请求直接回源# 优点:CDN 流量比全站 CDN 便宜,且效果更好# 在 Nginx 中配置静态资源分离:location /static/ { alias /home/www/myproject/static/; expires 30d; add_header Cache-Control "public, immutable"; # 如果配置了 CDN,添加 CDN 回源验证 add_header X-Cache $upstream_cache_status;}location /uploads/ { alias /home/www/myproject/static/uploads/; expires 7d; add_header Cache-Control "public, immutable";}
5.3 使用 Cloudflare 免费 CDN
Cloudflare 提供免费的 CDN 和 SSL 证书,适合个人项目:
# 1. 注册 Cloudflare 账号(https://dash.cloudflare.com)# 2. 添加你的域名 yourdomain.com# 3. Cloudflare 会自动扫描现有的 DNS 记录# 4. 修改域名的 NS 服务器为 Cloudflare 提供的地址# 5. 在 Cloudflare 控制台开启 SSL/TLS(Full 或 Flexible 模式)# 修改 DNS 服务器(在域名注册商的控制台修改):# 将 NS 记录改为:# dave.ns.cloudflare.com# marge.ns.cloudflare.com
六、CI/CD 自动化部署
6.1 什么是 CI/CD?
CI(持续集成):代码推送到仓库后,自动编译、测试。CD(持续部署):测试通过后,自动部署到服务器。
之前的手动部署流程:
本地修改代码 → git push → 登录服务器 → cd 项目目录 → git pull→ dotnet publish → systemctl restart → 验证
CI/CD 自动化后的流程:
本地修改代码 → git push ↓GitHub Actions 自动执行: ├── 编译代码 ├── 运行测试 ├── 发布项目 └── 通过 SSH 推送到服务器并重启 ↓部署完成(无需手动操作)
6.2 配置 SSH 免密登录(为 CI/CD 准备)
CI/CD 工具需要能够通过 SSH 连接到你的服务器,所以需要配置 SSH 密钥:
# 在本地电脑上生成部署专用的 SSH 密钥对ssh-keygen -t rsa -b 4096 -f ~/.ssh/deploy_key -C "ci-cd@yourdomain.com"# 将公钥添加到服务器的 authorized_keysssh-copy-id -i ~/.ssh/deploy_key.pub deploy@yourdomain.com# 测试连接ssh -i ~/.ssh/deploy_key deploy@yourdomain.com "echo 'CI/CD 连接成功'"
6.3 创建 GitHub Actions 工作流
在项目根目录创建 .github/workflows/deploy.yml:
name: Deploy to Production# 触发条件:推送到 main 分支时on: push: branches: [ main ]jobs: deploy: runs-on: ubuntu-latest steps: # 步骤 1:检出代码 - name: Checkout code uses: actions/checkout@v4 # 步骤 2:安装 .NET SDK - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x # 步骤 3:还原依赖 - name: Restore dependencies run: dotnet restore # 步骤 4:编译(Release 模式) - name: Build run: dotnet build --no-restore -c Release # 步骤 5:运行测试 - name: Test run: dotnet test --no-build -c Release # 步骤 6:发布 - name: Publish run: dotnet publish -c Release -o ./publish # 步骤 7:通过 SSH 部署到服务器 - name: Deploy to Server uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} source: "./publish/*" target: "/home/www/myproject/publish" strip_components: 2 rm: true # 步骤 8:重启服务 - name: Restart Application uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} script: | sudo chown -R deploy:deploy /home/www/myproject/publish sudo chmod -R 755 /home/www/myproject/publish sudo systemctl restart mywebapi sleep 3 curl -s http://localhost:5000/health
6.4 配置 GitHub Secrets
在 GitHub 仓库中配置以下 Secrets(Settings → Secrets and variables → Actions):
| | |
|---|
SERVER_HOST | yourdomain.com | |
SERVER_USER | deploy | |
SERVER_SSH_KEY | ~/.ssh/deploy_key | |
添加 Secrets 步骤:
- 打开 GitHub 仓库 → Settings → Secrets and variables → Actions
- 点击 "New repository secret"
6.5 简化版部署脚本(替代 GitHub Actions)
如果你不想用 GitHub Actions,也可以用我们之前创建的部署脚本,配合 Git Hooks 实现自动部署:
# 在服务器上设置 Git Hooks 自动部署sudo tee /home/www/myproject/source/MyWebApi/.git/hooks/post-merge << 'EOF'#!/bin/bashecho "检测到代码更新,开始自动部署..."bash /home/www/myproject/deploy.shEOFsudo chmod +x /home/www/myproject/source/MyWebApi/.git/hooks/post-merge
七、域名绑定后更新 Nginx 配置
绑定域名后,需要更新 Nginx 配置中的 server_name:
# 更新 Nginx 配置中的 server_namesudo tee /etc/nginx/sites-available/myproject << 'EOF'server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; # ========== 日志 ========== access_log /var/log/nginx/myproject_access.log; error_log /var/log/nginx/myproject_error.log; # ========== 静态文件 ========== location /static/ { alias /home/www/myproject/static/; expires 30d; add_header Cache-Control "public, immutable"; } location /uploads/ { alias /home/www/myproject/static/uploads/; expires 7d; } # ========== 反向代理 ========== location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; client_max_body_size 100m; }}EOF# 测试配置并重新加载sudo nginx -t && sudo systemctl reload nginx
八、完整验证
域名和 HTTPS 配置完成后,做一次全面验证:
# ========== DNS 解析 ==========echo "=== DNS 解析 ==="ping -c 2 yourdomain.comnslookup yourdomain.com# ========== HTTP 访问 ==========echo "=== HTTP 访问 ==="curl -I http://yourdomain.com# 应该返回 301 跳转到 HTTPS# ========== HTTPS 访问 ==========echo "=== HTTPS 访问 ==="curl -I https://yourdomain.com# 应该返回 200 OK# ========== SSL 证书 ==========echo "=== SSL 证书 ==="curl -vI https://yourdomain.com 2>&1 | grep -E "SSL handshake|issuer|subject"# 或者使用 opensslopenssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null | openssl x509 -noout -dates# ========== API 接口 ==========echo "=== API 接口 ==="curl https://yourdomain.com/healthcurl https://yourdomain.com/api/test# ========== 安全头 ==========echo "=== 安全头 ==="curl -sI https://yourdomain.com | grep -i "strict-transport-security"
九、常见问题
❓ Q1:域名解析后无法访问网站
原因:DNS 解析未生效、Nginx 未配置正确的 server_name、防火墙未放行。
排查步骤:
# ① 检查 DNS 是否解析到正确的 IPping yourdomain.com# 如果 IP 不对,去域名注册商检查 DNS 记录# ② 检查 Nginx 是否配置了你的域名sudo nginx -T | grep server_name# 应该能看到 yourdomain.com# ③ 检查防火墙是否放行 80/443 端口sudo ufw status | grep -E "80|443"# ④ 检查云平台安全组是否放行 80/443# 登录云平台控制台 → 安全组 → 入方向规则
❓ Q2:Certbot 申请证书失败 "DNS problem: NXDOMAIN"
原因:域名还没有正确解析到服务器 IP。
解决方案:
# 确认域名解析已生效dig yourdomain.com +short# 如果返回的是你的服务器 IP,说明解析正常# 如果返回空或错误的 IP,等待 DNS 生效或检查 DNS 记录# DNS 解析可能需要 10 分钟到 48 小时不等# 可以先用临时域名测试,或者等解析生效后再申请
❓ Q3:HTTPS 配置后网站显示 "不安全"
原因:混合内容(Mixed Content)问题,页面中加载了 HTTP 资源。
解决方案:
# 检查你的页面中是否引用了 HTTP 资源# 常见问题:图片、CSS、JS 链接使用了 http:// 而不是 https://# 修复方法:# ① 将所有资源链接改为 https:// 或使用 // 协议相对路径# ② 在 Nginx 中添加 Content-Security-Policy 头add_header Content-Security-Policy "upgrade-insecure-requests";# ③ 或者在 HTML 的 head 中添加:<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
❓ Q4:Let's Encrypt 证书续期失败
# 检查续期日志sudo tail -f /var/log/letsencrypt/letsencrypt.log# 手动续期调试sudo certbot renew --dry-run -v# 常见原因:# ① 80 端口被防火墙拦截# ② Nginx 配置错误导致验证请求被拒绝# ③ 域名解析异常# 强制手动续期sudo certbot certonly --nginx -d yourdomain.com
❓ Q5:GitHub Actions 部署失败
排查步骤:
# ① 检查 SSH 密钥是否正确# 在 GitHub Secrets 中确认 SERVER_SSH_KEY 是否包含完整的私钥内容# 私钥以 -----BEGIN OPENSSH PRIVATE KEY----- 开头# ② 检查服务器是否能接受 SSH 连接ssh -i ~/.ssh/deploy_key deploy@yourdomain.com# 如果连接不上,检查:# - 服务器防火墙是否放行了 22 端口# - 云平台安全组是否放行了 22 端口# - deploy 用户的 authorized_keys 是否包含了公钥# ③ 检查 deploy 用户的 sudo 权限# 在 GitHub Actions 中的重启命令需要 sudo 权限# 确认 deploy 用户有 sudo 权限且无需密码:sudo visudo# 添加以下行:# deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart mywebapi# deploy ALL=(ALL) NOPASSWD: /usr/bin/chown -R deploy:deploy /home/www/myproject/publish# deploy ALL=(ALL) NOPASSWD: /usr/bin/chmod -R 755 /home/www/myproject/publish
❓ Q6:备案审核被驳回
常见驳回原因:
驳回原因:网站名称不符合要求 解决方案:网站名称不能是"个人网站""我的网站"等泛称 应使用具体的名称,如"IT在线自学""张三的技术博客"驳回原因:主体信息不完整 解决方案:检查身份证信息是否与备案信息一致驳回原因:域名信息不一致 解决方案:确认域名实名认证的信息与备案主体信息一致驳回原因:核验单填写有误 解决方案:重新下载核验单,按要求填写并上传
❓ Q7:CDN 配置后网站访问异常
# ① 清除 CDN 缓存# 在 CDN 控制台操作# ② 临时绕过 CDN 直接访问源站curl -H "Host: yourdomain.com" http://服务器IP/health# ③ 检查 CDN 回源配置# 确认回源地址和端口正确# ④ 如果使用 Cloudflare,开启 Development Mode 临时绕过缓存# Cloudflare 控制台 → Speed → Development Mode
十、总结
至此,你的网站已经具备了专业级生产环境的所有要素!
本文要点回顾:
第四篇:域名绑定、HTTPS 证书与 CI/CD 自动化├── ✅ 域名购买与 DNS 解析│ ├── A 记录指向服务器 IP│ └── 验证解析生效├── ✅ ICP 备案说明│ ├── 国内服务器必须备案│ └── 免备案方案(海外服务器)├── ✅ HTTPS 配置│ ├── Let's Encrypt 免费证书│ ├── Certbot 自动续期│ └── SSL 安全最佳实践├── ✅ CDN 加速(可选)│ ├── 全站 CDN vs 静态资源 CDN│ └── Cloudflare 免费 CDN├── ✅ CI/CD 自动化部署│ ├── GitHub Actions 工作流│ ├── SSH 密钥配置│ └── 自动编译、测试、部署└── ✅ 常见问题排查 ├── DNS 解析问题 ├── SSL 证书问题 ├── CI/CD 连接问题 └── 备案问题
下一篇预告:《Linux 从零部署项目实战指南(五):性能优化、监控与日志》我们将配置性能监控、日志收集、告警通知,让服务器运行状态一目了然。同时总结整个系列,形成一个完整的部署运维知识体系。
如果你在操作过程中遇到任何问题,欢迎在评论区留言交流!
📌 本系列持续更新中,关注 IT在线自学 第一时间获取最新教程。