絡(luò)課設(shè)實戰(zhàn):精品課程網(wǎng)站從部署到排障全記錄)
簡介計算機網(wǎng)絡(luò)課程設(shè)計中的精品課程網(wǎng)站建設(shè)方案主要面向高校網(wǎng)絡(luò)工程、計算機相關(guān)專業(yè)學(xué)生用于完成課程設(shè)計或畢業(yè)設(shè)計。資源圍繞一個可接入互聯(lián)網(wǎng)的精品課程網(wǎng)站展開要求支持一百個以上站點網(wǎng)絡(luò)內(nèi)部采用千兆主干、百兆到桌面的結(jié)構(gòu)并需劃分至少四個子網(wǎng)同時提供域名解析、動態(tài)地址分配、網(wǎng)頁服務(wù)、文件傳輸?shù)确?wù)整體覆蓋網(wǎng)絡(luò)拓?fù)?、地址?guī)劃、服務(wù)器部署和主頁編寫等關(guān)鍵環(huán)節(jié)。包內(nèi)共有三個文件核心為兩份文檔和一份網(wǎng)頁源碼文檔用于撰寫設(shè)計思路、方案說明與配置步驟網(wǎng)頁源碼展示基礎(chǔ)前端頁面實現(xiàn)整個壓縮包約 574KB輕量便于查閱。當(dāng)前已有八百六十人學(xué)習(xí)瀏覽適合需要參考完整設(shè)計流程、網(wǎng)絡(luò)服務(wù)配置方法及報告寫法的同學(xué)。借助這份資源讀者能掌握從需求分析到子網(wǎng)劃分、服務(wù)器角色配置再到網(wǎng)絡(luò)設(shè)計與網(wǎng)頁實現(xiàn)結(jié)合的完整方法形成可提交的課程設(shè)計成果。 每年計算機網(wǎng)絡(luò)課程設(shè)計繞不開的一個題目就是精品課程網(wǎng)站設(shè)計。表面上看它跟普通網(wǎng)站開發(fā)沒什么區(qū)別無非是放課程簡介、課件、教學(xué)視頻再加個在線測試和留言板。但真正做下來你會發(fā)現(xiàn)這個題目把網(wǎng)絡(luò)原理里的協(xié)議、地址、服務(wù)、安全全調(diào)動起來了HTTP是應(yīng)用層TCP三次握手是傳輸層IP地址和路由是網(wǎng)絡(luò)層DHCP和DNS又是怎么配合的全都能在項目里找到對應(yīng)物。這篇文章記錄我自己完整做一遍精品課程網(wǎng)站的過程包括需求拆解、技術(shù)選型、頁面實現(xiàn)、局域網(wǎng)部署以及調(diào)試網(wǎng)絡(luò)時踩過的各種坑。正在準(zhǔn)備課設(shè)、或者想把網(wǎng)絡(luò)知識和Web開發(fā)串起來的人都值得看一遍。1. 項目目標(biāo)與需求拆解1.1 這個課設(shè)真正要驗收什么很多同學(xué)拿到“精品課程網(wǎng)站設(shè)計”這個題第一反應(yīng)是套一個現(xiàn)成的CMS模板換個課程名就交差。但如果是計算機網(wǎng)絡(luò)課程的課設(shè)題目里的“網(wǎng)絡(luò)”兩個字才是關(guān)鍵得分點。老師想看到的不是Bootstrap做出多漂亮的首頁而是你能把下面這幾件事講明白網(wǎng)站是怎么部署到服務(wù)器上的客戶端通過什么協(xié)議、什么地址訪問到它在局域網(wǎng)里怎么規(guī)劃IP域名是怎么解析的如果訪問出現(xiàn)問題你能不能定位到是網(wǎng)絡(luò)層、傳輸層還是應(yīng)用層的故障。我這次給自己的驗收標(biāo)準(zhǔn)是一臺Ubuntu服務(wù)器一臺普通交換機幾臺客戶機搭一個小型局域網(wǎng)。服務(wù)器上跑課程網(wǎng)站所有終端通過IP地址和域名都能訪問。站在用戶角度需要課程介紹、教學(xué)大綱、課件下載、視頻點播、在線測試、留言板這些功能缺一個都不算完整。站在網(wǎng)絡(luò)角度需要能看到DHCP分配地址的過程能通過抓包看到HTTP請求三次握手能在安全設(shè)備日志里排查異常訪問。兩條線都走通了課設(shè)才算真正完成。1.2 技術(shù)選型按課設(shè)場景取舍課設(shè)不是企業(yè)項目不需要微服務(wù)也不需要前后端分離重點是把原理打通。我選了這套組合模塊我使用的方案為什么這么選前端頁面HTML CSS 原生JavaScript不用框架演示時容易解釋頁面加載流程后端邏輯Python Flask路由和HTTP方法非常直觀代碼量少數(shù)據(jù)庫MySQL 8.0課程常見能體現(xiàn)傳統(tǒng)關(guān)系型庫的配置過程Web服務(wù)器Nginx反向代理靜態(tài)資源和動態(tài)請求配置清晰網(wǎng)絡(luò)環(huán)境VMware虛擬機 真實家用路由器既能模擬也能真機聯(lián)調(diào)兩端都覆蓋抓包工具Wireshark / tcpdump課堂演示網(wǎng)絡(luò)層分析的標(biāo)配Flask 開發(fā)服務(wù)器雖然也能跑但它只有一個進程高并發(fā)弱而且老師一眼就知道你沒做生產(chǎn)環(huán)境部署。用 Nginx 加 uWSGI 跑 Flask才符合“網(wǎng)絡(luò)服務(wù)”這個課設(shè)題目。前端我不建議上 React/Vue因為課程設(shè)計的時間有限原生頁面配合 CSS 框架足夠還能把 URL 路由和 HTTP 請求講得更清楚。1.3 網(wǎng)絡(luò)環(huán)境設(shè)計總體思路網(wǎng)絡(luò)環(huán)境按一個小型校園單位來設(shè)計。服務(wù)器放在獨立網(wǎng)口IP 固定為 192.168.10.10/24。終端設(shè)備通過路由器DHCP自動獲取 192.168.10.20 到 192.168.10.200 的地址。路由器就是網(wǎng)關(guān) 192.168.10.1同時承擔(dān)DNS轉(zhuǎn)發(fā)功能。這樣設(shè)計的好處是既能演示靜態(tài)IP配置也能演示DHCP協(xié)議交互還能讓學(xué)生終端隨意接入不需要手工設(shè)置網(wǎng)絡(luò)。這種網(wǎng)絡(luò)比單機虛擬機復(fù)雜的地方在于虛擬機的網(wǎng)絡(luò)模式要選“橋接模式”讓虛擬機直接掛到局域網(wǎng)里獲得和物理機同網(wǎng)段的地址。否則 NAT 模式下外部終端永遠(yuǎn)訪問不到它。首次做這個項目的人很容易忽視這點導(dǎo)致服務(wù)器只有本機才能打開網(wǎng)站。2. 網(wǎng)站核心功能與頁面實現(xiàn)2.1 功能模塊與URL路由精品課程網(wǎng)站我劃分成五個模塊首頁、課程資源、視頻教學(xué)、在線測試、留言板。每個模塊對應(yīng)一組 URL這其實就是 HTTP 應(yīng)用層的資源定位。Flask 后端代碼里路由直接映射函數(shù)調(diào)試的時候能看到 GET 和 POST 請求分別進入哪里。from flask import Flask, render_template, request import os app Flask(__name__) app.route(/) def index(): return render_template(index.html) app.route(/course/ppt) def ppt_list(): files os.listdir(static/ppt) return render_template(ppt.html, filesfiles) app.route(/course/video) def video_list(): return render_template(video.html) app.route(/exam, methods[GET, POST]) def exam(): if request.method POST: # 接收答案并判分 return render_template(result.html, scorescore) return render_template(exam.html) app.route(/message, methods[GET, POST]) def message_board(): if request.method POST: # 寫數(shù)據(jù)庫 pass return render_template(message.html)注意一點路由中的/course/ppt不是文件系統(tǒng)路徑而是 Web 服務(wù)器映射出來的邏輯路徑。真正的文件放在/var/www/course/static/ppt下面Nginx 會把它映射成外部可訪問的 URL。這個映射關(guān)系是“網(wǎng)絡(luò)資源”和“本地文件”之間的橋梁很多人不關(guān)注但面試常問。2.2 課件與視頻資源的訪問策略課件和視頻是精品課程網(wǎng)站的大頭也是最容易拖垮服務(wù)器的地方。我的處理方式是課件文件統(tǒng)一放在static/ppt視頻文件放在static/video頁面通過遍歷目錄生成下載鏈接。這樣不用每次新增文件都改代碼也方便老師直接往目錄里丟素材。視頻播放不能用簡單的a標(biāo)簽否則用戶必須下載完整文件才能看。用 HTML5 的video標(biāo)簽可以直接在線播放但服務(wù)器必須支持 Range 請求也就是 HTTP 分塊傳輸。Nginx 默認(rèn)支持 Range所以靜態(tài)視頻交給 Nginx 處理就行不要讓 Flask 去讀文件再返回。否則視頻播放會卡頓而且服務(wù)器內(nèi)存被瞬間占滿。我在 Nginx 里對這目錄做了單獨配置location /static/video/ { alias /var/www/course/static/video/; add_header Accept-Ranges bytes; }Range 請求是 HTTP 協(xié)議里非常典型的“斷點續(xù)傳”機制。瀏覽器播放視頻時會先請求前幾秒的數(shù)據(jù)播放到一半再請求下一段。你通過 Wireshark 抓包能看到請求頭里的Range: bytes0-1023響應(yīng)頭里有Content-Range。這個細(xì)節(jié)在課設(shè)答辯時講出來含金量很高。2.3 在線測試與留言板的實現(xiàn)在線測試我做了十個單選題題目放在一個 JSON 文件里答案用 SHA256 哈希值存不直接明文寫答案防止學(xué)生查看源碼。用戶提交答案后后端逐題比對哈希值最后返回分?jǐn)?shù)。這種設(shè)計雖然比明文多寫幾行代碼但能體現(xiàn)你懂一點信息安全的思路。判斷題、多選題也能按同樣邏輯擴展。留言板是典型的 POST 請求場景也是安全問題高發(fā)區(qū)。第一次寫的時候我直接拼接 SQL結(jié)果輸入一個單引號就把頁面打崩了。后面改成參數(shù)化查詢徹底解決 SQL 注入問題。建表語句如下CREATE TABLE message ( id INT AUTO_INCREMENT PRIMARY KEY, nickname VARCHAR(50) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) DEFAULT CHARSETutf8mb4;注意這里特意指定utf8mb4不然留言里出現(xiàn)表情符號或者中文特殊字符保存后就是亂碼。字符集是新手最容易踩的坑頁面、數(shù)據(jù)庫、連接串三處編碼不統(tǒng)一中文數(shù)據(jù)就會變成“????”。我統(tǒng)一改成 UTF-8 后問題才徹底消失。這個坑看似是應(yīng)用層問題實際上和 TCP 傳輸?shù)淖止?jié)流顯示有關(guān)也可以從編碼原理上跟面試官聊幾句。3. 網(wǎng)絡(luò)配置與服務(wù)器部署實戰(zhàn)3.1 IP地址和DHCP怎么配合局域網(wǎng)里服務(wù)器必須用靜態(tài) IP否則DHCP租約到期后地址變了所有客戶端都訪問不了網(wǎng)站。其他的教師機和學(xué)生終端用 DHCP 自動獲取這樣任何設(shè)備接入局域網(wǎng)都能自動獲得 IP、掩碼、網(wǎng)關(guān)和 DNS。這里有個容易混淆的點DHCP 不只是分配 IP它還可以下發(fā)網(wǎng)關(guān)和 DNS。所以只要路由器開了 DHCP客戶端瀏覽器就能正常解析域名并訪問外網(wǎng)。我在路由器上的配置是這樣的DHCP 地址池 192.168.10.100 到 192.168.10.200網(wǎng)關(guān) 192.168.10.1首選 DNS 用 223.5.5.5。服務(wù)器單獨保留 192.168.10.10不做 DHCP 分配。為了驗證 DHCP 工作我打開客戶機的命令行用ipconfig /renew重新獲取地址然后用 Wireshark 抓 DHCP Discover、Offer、Request、ACK 四個包。這就是課設(shè)里最直接的“網(wǎng)絡(luò)協(xié)議可視化”素材。設(shè)備IP地址獲取方式用途W(wǎng)eb服務(wù)器192.168.10.10/24靜態(tài)配置跑Nginx、MySQL、Flask網(wǎng)關(guān)/路由器192.168.10.1/24固定DHCP、DNS轉(zhuǎn)發(fā)、NAT教師機192.168.10.100/24DHCP后臺維護學(xué)生終端192.168.10.x/24DHCP訪問課程網(wǎng)站3.2 域名解析從小處理解DNS如果只讓學(xué)生用 IP 訪問網(wǎng)站那 DNS 部分就沒法體現(xiàn)。我在內(nèi)網(wǎng)自己配了一個域名course.jingpin.local。最簡單的方式是在每臺客戶機的 hosts 文件里寫一行192.168.10.10 course.jingpin.local這個方式能演示基本解析流程但只能逐臺配置。更接近真實場景的是用 dnsmasq 搭建內(nèi)網(wǎng) DNS 服務(wù)器然后讓路由器把 DNS 指向它。這樣所有客戶機只要 DHCP 拿到地址自動就能解析域名。課程設(shè)計里能說清楚這兩種方式的區(qū)別就已經(jīng)超過了大部分同學(xué)。有了域名之后Nginx 里要配置虛擬主機。用不同的server_name區(qū)分不同站點這是 HTTP 請求頭里Host字段的應(yīng)用。配置片段如下server { listen 80; server_name course.jingpin.local; root /var/www/course; index index.html; location /static/ { alias /var/www/course/static/; } location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3031; } }瀏覽器訪問http://course.jingpin.local時流程是先通過 DNS 或 hosts 解析域名得到 192.168.10.10然后向這個 IP 發(fā)起 TCP 三次握手再發(fā)送 HTTP GET 請求Nginx 發(fā)現(xiàn)Host是course.jingpin.local就匹配到這個 server 塊把請求轉(zhuǎn)發(fā)給 Flask。這個過程可以在瀏覽器開發(fā)者工具和 Wireshark 里完整看到答辯時照著這個順序講邏輯非常清晰。3.3 Web服務(wù)發(fā)布到局域網(wǎng)部署步驟整理成命令清單直接照著做就能跑通# 更新系統(tǒng)并安裝依賴 sudo apt update sudo apt install -y nginx mysql-server python3-pip pip3 install flask flask-sqlalchemy uwsgi # 啟動數(shù)據(jù)庫并建庫 sudo systemctl start mysql sudo mysql -e CREATE DATABASE course DEFAULT CHARSET utf8mb4; # 把 Flask 項目放到指定目錄 sudo mkdir -p /var/www/course # 項目代碼復(fù)制到 /var/www/course 后配置 uwsgi uwsgi --socket 127.0.0.1:3031 --wsgi-file app.py --callable app --daemonize /var/log/course.log這里關(guān)鍵點是 Flask 啟動時一定要監(jiān)聽所有網(wǎng)卡而不是默認(rèn)的 127.0.0.1。如果監(jiān)聽 127.0.0.1那么在服務(wù)器本機用curl能通但局域網(wǎng)其他機器永遠(yuǎn)打不開。這個問題出現(xiàn)頻率非常高我排查了很久才意識到是 Flask 的運行參數(shù)問題。用 uWSGI 把 Flask 跑在 127.0.0.1:3031Nginx 再對外監(jiān)聽 80 端口相當(dāng)于把內(nèi)網(wǎng)服務(wù)和對外開放隔離開。Nginx 還順手做了靜態(tài)文件服務(wù)、連接管理、訪問日志這些單靠 Flask 開發(fā)服務(wù)器做不好。3.4 對外開放訪問與防火墻局域網(wǎng)內(nèi)訪問已經(jīng)通了但為了演示更完整的網(wǎng)絡(luò)權(quán)限控制我還在服務(wù)器上開了防火墻。Ubuntu 自帶的 ufw 操作比較簡單sudo ufw allow 22/tcp # SSH 管理 sudo ufw allow 80/tcp # HTTP 訪問 sudo ufw allow 3306/tcp # 僅演示需要實際上不建議對外開放數(shù)據(jù)庫端口開放 3306 只是為了讓學(xué)生遠(yuǎn)程連接數(shù)據(jù)庫看表結(jié)構(gòu)真實環(huán)境必須關(guān)掉否則非常容易被掃描器爆破。我在安全日志里看到大量來自外網(wǎng)的 MySQL 連接嘗試才意識到數(shù)據(jù)庫端口暴露的嚴(yán)重性。后來取消了 3306 的外網(wǎng)放行只允許內(nèi)網(wǎng)網(wǎng)段訪問。這本身就是一次很好的“訪問控制”教學(xué)案例。4. 聯(lián)調(diào)測試與問題排查實錄4.1 常見問題速查表整個課設(shè)調(diào)試過程中我遇到過不少問題整理成一張速查表按照癥狀、原因、解法三列來寫癥狀可能原因解決辦法瀏覽器訪問 IP 顯示拒絕連接Nginx 未啟動或監(jiān)聽端口不對systemctl status nginx檢查ss -tlnp局域網(wǎng)其他電腦打不開Flask 監(jiān)聽了 127.0.0.1uWSGI 綁定0.0.0.0或走 Nginx 反向代理頁面能開但 CSS/圖片加載失敗Nginx 配置沒包含location /static/補上靜態(tài)目錄映射重啟 Nginx視頻播放卡頓或無法拖進度Nginx 沒開啟 Range 或文件路徑錯誤在 location 中加入add_header Accept-Ranges bytes;留言板中文亂碼數(shù)據(jù)庫字符集不是 utf8mb4重建表指定DEFAULT CHARSETutf8mb4域名在別人電腦上解析不了只配了本機 hosts用 dnsmasq 內(nèi)網(wǎng)DNS或改路由器DNS數(shù)據(jù)庫連接超時MySQL 綁定地址為 127.0.0.1修改bind-address 0.0.0.0授權(quán)允許遠(yuǎn)訪問訪問日志里出現(xiàn)大量重復(fù)請求可能是網(wǎng)頁輪詢或爬蟲用 Nginx 的limit_req模塊限制單IP請求頻率4.2 一次“異常流量”告警的排查手記調(diào)試接近尾聲時學(xué)校機房里的安全網(wǎng)關(guān)彈了一個提示“系統(tǒng)檢測到您的計算機網(wǎng)絡(luò)中存在異常流量。”這是我遇到過最有意思的一個問題因為網(wǎng)站明明功能正常怎么會有異常流量。排查第一步我先看 Nginx 的訪問日志。發(fā)現(xiàn)某個 IP 在幾十秒內(nèi)反復(fù)請求/admin/login.php、/wp-login.php、/.env這類路徑。這是一臺掃描器在遍歷網(wǎng)站試圖找后臺入口和配置漏洞并不是網(wǎng)站本身出問題。安全網(wǎng)關(guān)檢測到這種高頻探測就把它標(biāo)記為異常流量。進一步用ss查看連接狀態(tài)發(fā)現(xiàn)來自那個 IP 的 TCP 連接保持在 SYN_RECV 狀態(tài)說明它在不停嘗試建立新連接但在等第三次握手確認(rèn)典型的半連接掃描特征。我用 tcpdump 抓包確認(rèn)sudo tcpdump -i eth0 -n tcp port 80 and host 192.168.xx.xx抓到的包里全是 SYN 請求沒有后續(xù)正常的 HTTP GET這基本可以確認(rèn)是端口掃描或者惡意探測。解決辦法是在 Nginx 里限制并發(fā)和請求頻率limit_req_zone $binary_remote_addr zonecourse_limit:10m rate5r/s; server { listen 80; server_name course.jingpin.local; location / { limit_req zonecourse_limit burst10 nodelay; include uwsgi_params; uwsgi_pass 127.0.0.1:3031; } }同時在防火墻里只允許校園網(wǎng)網(wǎng)段訪問阻斷其他來源的探測。經(jīng)過處理后安全網(wǎng)關(guān)的告警逐漸消失。這個案例特別適合寫進課設(shè)報告因為它是“流量異常檢測”和“訪問控制策略”的活教材比單純做網(wǎng)站模板要深刻得多。4.3 幾個非常值得注意的坑除了上面表格里的問題還有幾個隱蔽的坑。第一是 Nginx 的緩存我改了 CSS 文件后瀏覽器里始終是舊的清緩存也沒用。原因是有個反向代理層把靜態(tài)資源緩存了最后在 Nginx 的 location 里加proxy_cache_bypass或者給靜態(tài)文件請求加版本號參數(shù)才解決。第二是 MySQL 授權(quán)時不能只給rootlocalhost授權(quán)。要從 Flask 后端連數(shù)據(jù)庫用的用戶最好是單獨創(chuàng)建的例如course_user并只授權(quán)這個庫的權(quán)限CREATE USER course_userlocalhost IDENTIFIED BY your_password; GRANT ALL PRIVILEGES ON course.* TO course_userlocalhost; FLUSH PRIVILEGES;這樣可以避免應(yīng)用賬號直接使用 root 的高權(quán)限哪怕被注入了也刪不了其他庫。第三是上傳課件和視頻時文件名一定不要用中文和空格。早期我把文件名直接放到 URL 里瀏覽器會轉(zhuǎn)義鏈接反復(fù)失效。后來統(tǒng)一改成英文和下劃線再用數(shù)據(jù)庫記錄原始文件名展示時讀取原始文件名給用戶下載這樣既不破壞 URL也能正常顯示中文名稱。這個經(jīng)驗在處理所有靜態(tài)資源時都通用。5. 驗收演示與經(jīng)驗擴展5.1 演示時怎么講出“計算機網(wǎng)絡(luò)”含量答辯和驗收的時候不要一上來就點開首頁而是先講網(wǎng)絡(luò)拓?fù)洹N覝?zhǔn)備了一張簡單的拓?fù)鋱D一臺 Web/數(shù)據(jù)庫服務(wù)器、一臺路由器/交換機、若干終端設(shè)備用文字標(biāo)注每臺設(shè)備的 IP、網(wǎng)關(guān)和 DNS。然后現(xiàn)場演示三件事第一在終端上用ping course.jingpin.local能看到域名解析成 192.168.10.10并且時延正常。第二打開 Wireshark在服務(wù)器端抓訪問課程首頁的包能看到 TCP 三次握手和 HTTP GET 請求。第三在留言板提交一條留言再到數(shù)據(jù)庫里查這條記錄證明前后端和數(shù)據(jù)庫鏈路是通的。這三步操作比講十頁 PPT 都有說服力老師一看就知道你確實理解了網(wǎng)絡(luò)通信的完整路徑。5.2 報告和收尾建議課設(shè)報告的結(jié)構(gòu)我建議分這幾塊需求分析、總體設(shè)計、網(wǎng)絡(luò)拓?fù)渑c IP 規(guī)劃、數(shù)據(jù)庫設(shè)計、核心功能實現(xiàn)、測試結(jié)果、故障處理記錄、總結(jié)展望。其中“故障處理記錄”一定要寫實比如我前面寫的異常流量告警就詳細(xì)寫了觀測現(xiàn)象、抓包結(jié)果、處理方案和最終效果。老師最反感那種全篇都是“實現(xiàn)了什么功能”但沒有任何問題分析的報告因為真實項目不可能沒有坑。報告里的 IP 地址表、域名映射、Nginx 配置片段、數(shù)據(jù)庫表結(jié)構(gòu)全部要有注釋。我還在附錄里放了 Wireshark 抓包截圖每張圖下配兩三句說明解釋這個包是在哪個階段出現(xiàn)、標(biāo)志位有什么含義、對應(yīng)哪一次通信過程。這樣做的好處是即使答辯時間很短老師翻到附錄也能快速理解你的網(wǎng)絡(luò)設(shè)計。5.3 如果再讓我做一次我會改什么這個項目做完之后我最大的體會是精品課程網(wǎng)站設(shè)計的難點不在頁面而在“讓這個網(wǎng)站在正確的位置提供正確的服務(wù)”。如果再給我一次機會我會直接給網(wǎng)站加上 HTTPS用自簽名證書雖然會被瀏覽器報不安全但能借機把 SSL/TLS 握手過程講明白也算多一個知識亮點。我也會把部署過程寫成自動化腳本用 Ansible 一鍵配置 Nginx、MySQL 和 Flask 環(huán)境這樣換一個網(wǎng)絡(luò)環(huán)境重新部署時就不用一個命令一個命令地敲。對于還在做課設(shè)的人我最后分享一個實用技巧每一步配置完成之后立刻用命令驗證。比如改完 Nginx 配置就運行nginx -t改完 hosts 就ping一下域名改完數(shù)據(jù)庫授權(quán)就用遠(yuǎn)程客戶端連一次。別等到所有配置都寫完了再一次性測試否則一旦報錯你會分不清是 Web 服務(wù)、數(shù)據(jù)庫、防火墻還是域名解析出問題。小步驗證才是這種網(wǎng)絡(luò)類課設(shè)最省時間的推進方式。本文還有配套的精品資源點擊獲取