1. 为什么学习Web安全要从DVWA开始
如果你第一次接触Web安全,或者刚开始啃Kali Linux的渗透测试教程,大概率会反复听到一个名字——DVWA。我当年刚进安全圈的时候,第一件事就是照着网上的教程把它装起来,然后对着默认的admin账户一通乱点。说实话,那个过程踩了不少坑,但也正是这些坑让我把Kali、Apache、MySQL、PHP这些组件之间的协作关系彻底搞清楚了。
DVWA全称是Damn Vulnerable Web Application,翻译过来就是"该死的易受攻击的Web应用"。它本身不是真实业务系统,而是一个故意留着各种漏洞的教学靶场,目标就是让初学者在一个合法、可控、不用承担法律风险的环境里练习SQL注入、XSS、文件上传、命令执行这些经典攻击手法。
那么,它到底能做什么?
- 提供了Brute Force、Command Injection、CSRF、File Inclusion、File Upload、SQL Injection、XSS等常见Web漏洞模块
- 每个漏洞模块都分为Low、Medium、High、Impossible四个难度级别,可以循序渐进地理解漏洞成因和防御方式
- 完全部署在本地环境,不会对任何真实网站产生危害,也不需要担心"练着练着把自己送进去"的问题
- 与Kali Linux自带的大量渗透工具(Burp Suite、sqlmap、hydra等)天然配合,能让你把工具和原理真正串联起来
所以,如果你是零基础想入门Web安全,或者已经装了Kali但不知道从哪开始学,DVWA就是那个最合理的第一站。这篇内容不是简单丢给你几条命令就完事,我尽量把每一个步骤背后的原因、踩过的坑、以及搭建完成后的学习路径都讲清楚,让你照着操作完,不只是"装上了",而是真正明白这套环境是怎么协作的。
2. DVWA与其他靶场的对比:为什么它是第一选择
很多新手会问:Web应用靶场那么多,我为什么非得选DVWA?是不是因为它最简单?其实不完全是。
我前后用过DVWA、Pikachu、sqli-labs、upload-labs、WebGoat这些靶场,它们各有侧重。DVWA最大的优势不是简单,而是难度曲线清晰且功能覆盖全面。
| 靶场名称 | 主要覆盖漏洞 | 难度设计 | 部署难度 | 适合人群 |
|---|---|---|---|---|
| DVWA | SQL注入、XSS、文件上传、CSRF、命令执行等全类型 | Low/Medium/High/Impossible四级递进 | 一般 | 零基础入门首选 |
| Pikachu | 中文靶场,覆盖RCE、SQL、XSS等 | 等级划分不明显,偏题型练习 | 一般 | 国内初学者友好 |
| sqli-labs | 专攻SQL注入 | 按注入类型分近100关 | 简单 | SQL注入专项练习 |
| upload-labs | 专攻文件上传绕过 | 按绕过思路逐关递进 | 简单 | 文件上传专项练习 |
| WebGoat | 覆盖常见Web漏洞及业务逻辑漏洞 | 课程式引导,偏教学 | 中等 | 英文较好、想深入的人 |
DVWA的Impossible级别设计是别的靶场很少做到的。同一个漏洞,在Low级别你随便写个payload就能打穿,到了Impossible级别,你会发现源码里已经用参数化查询、过滤函数、Token校验等手段把漏洞堵死了。这种"同一漏洞、两种视角"的对照,对理解攻防双方站在什么位置思考问题非常有帮助。
另外,DVWA的部署环境是Apache + MySQL/MariaDB + PHP,这套组合本身就是Web世界里最普及的架构之一。你把DVWA装明白,顺手也就理解了绝大多数PHP建站程序(比如早期的WordPress、Discuz)的运行原理。这也是我坚持让你手动部署一遍,而不是直接用在线Demo的原因——搭环境的过程本身就是学习过程。
3. 搭建设置前的准备:搞清楚Kali里已经有什么
在动手之前,先别急着敲命令。Kali Linux是一套基于Debian的渗透测试系统,它预装了大量工具,但每个版本预装的Web环境组件不一样,甚至同一版本选装桌面不同也会影响。我见过太多人一上来就照着老教程执行,结果提示找不到命令,或者装完启动Apache报错,最后才发现是基础环境没核清楚。
3.1 确认Kali版本与基础环境
打开终端,先用下面几条命令确认一下当前系统状态:
cat /etc/os-release uname -a whoamiwhoami这个命令很关键。如果输出是root,说明你直接在root权限下操作,后面改文件会省去很多sudo麻烦;如果输出的是普通用户名,那后面所有写系统目录的命令都要习惯性加上sudo。
接下来检查Web服务环境:
systemctl status apache2 systemctl status mariadb systemctl status mysql php -v如果返回Unit apache2.service could not be found.,说明Apache还没有安装;如果php -v提示命令不存在,那PHP也没装。这里我多说一句:Kali新版本默认不装LAMP环境,它更倾向于让你按需安装工具,所以不要觉得"Kali这么专业的系统怎么可能没有Apache",没有才是正常的。
3.2 缺少组件时的安装方式
如果确认缺少组件,直接一条命令批量装齐:
sudo apt update sudo apt install apache2 mariadb-server mariadb-client php php-mysqli libapache2-mod-php php-xml php-mbstring php-gd -y我来解释一下这几个包都是干什么的,免得你装完了还是一头雾水:
apache2:Web服务器,负责接收浏览器请求并返回页面mariadb-server+mariadb-client:数据库服务端和客户端。Kali里用MariaDB替代MySQL,命令和用法基本兼容php:服务端脚本解析器,DVWA的页面代码全靠它跑起来libapache2-mod-php:让Apache能够识别和处理.php文件的桥梁模块php-mysqli:PHP连接MySQL/MariaDB数据库的驱动,DVWA存数据写日志都要用php-xml、php-mbstring、php-gd:DVWA某些模块和图像验证码功能依赖的扩展
安装完成后,建议先启动服务并设置开机自启:
sudo systemctl start apache2 sudo systemctl enable apache2 sudo systemctl start mariadb sudo systemctl enable mariadb这时候在浏览器地址栏输入http://127.0.0.1,如果看到Apache的默认欢迎页,说明Web环境已经转起来了。看到这个页面,你离DVWA只剩一步。
4. 两种主流部署方式,我建议你按这条路线走
DVWA的部署方式主要有两种:一种是下载源码手动部署到Apache,另一种是用Docker容器一键拉起。很多人会纠结到底选哪个,我直接给结论:如果你是新手,或者想把DVWA当长期学习靶场用,请先用手动部署;如果你只是临时体验一下、或者电脑环境特别乱不想折腾环境依赖,才考虑Docker。
两种方式各有优劣,先说透再动手:
| 对比维度 | 手动部署 | Docker部署 |
|---|---|---|
| 环境依赖 | 需要自己有Apache/MySQL/PHP,但能加深理解 | 镜像自带环境,完全隔离 |
| 安装速度 | 10-20分钟,取决于网速和操作 | 拉镜像快的话5分钟搞定 |
| 学习价值 | 高,能理解整个Web服务栈协作逻辑 | 低,容器屏蔽了底层细节 |
| 自定义能力 | 强,可以随意改动PHP配置、数据库结构 | 每次重启容器配置可能丢失 |
| 资源占用 | 相对省内存 | 容器本身会占一部分额外资源 |
考虑到DVWA的核心目的是"看懂漏洞",我推荐手动部署。你在手动部署过程中每解决一个报错,实际上就是在积累真正的排障能力——而这种能力,才是未来搞渗透测试或者运维最值钱的东西。
5. 手动部署DVWA全流程:每一步都拆开讲
这一节是整个搭建过程的核心,我会把每一步的细节和原理都写清楚,不是单纯的命令堆砌。
5.1 下载DVWA源码并放置到Web目录
DVWA的源码托管在GitHub上,官方仓库地址是digininja/DVWA。在Kali终端使用git clone把它拉下来:
cd /tmp git clone https://github.com/digininja/DVWA.git/tmp目录下面操作是因为这个目录对普通用户可写,不会遇到权限问题。拉取完成后,把整个目录移动到Apache的Web根目录,并改名为dvwa,同时设置好权限:
sudo mv DVWA /var/www/html/dvwa sudo chown -R www-data:www-data /var/www/html/dvwa sudo chmod -R 755 /var/www/html/dvwa这里有两点需要特别说明:
chown -R www-data:www-data:Apache在Debian系系统下默认以www-data用户运行,把目录所有权交给它,才能保证后续DVWA写入文件、操作目录时有权限- 为什么不直接保留文件夹名
DVWA?纯粹是个人习惯,访问路径里小写更省事。你保留大写也行,但后续一切路径都要匹配
移动完成后,在浏览器访问http://127.0.0.1/dvwa,如果目录结构正常,你会看到一个关于PHP配置检查的页面,多个条目显示红色警告。这是正常的,接下来就是配置环境让红色全部变绿。
5.2 配置文件的核心修改逻辑
DVWA的配置信息在config目录下。首次部署时,目录里只有一个示例文件config.inc.php.dist,你需要把它复制一份并改名为config.inc.php:
cd /var/www/html/dvwa/config sudo cp config.inc.php.dist config.inc.php sudo nano config.inc.php打开文件后,重点看这几个关键项:
$_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'dvwa'; $_DVWA[ 'db_password' ] = 'p@ssw0rd'; $_DVWA[ 'db_port' ] = '3306';默认情况下,DVWA会尝试用用户名dvwa、密码p@ssw0rd连接本机的MariaDB数据库。如果你的数据库还没创建这个用户,那就需要在MariaDB里手动创建,并给予对应的权限。
进入MariaDB控制台:
sudo mysql -u root然后在MariaDB命令行里执行:
CREATE DATABASE dvwa; CREATE USER 'dvwa'@'127.0.0.1' IDENTIFIED BY 'p@ssw0rd'; CREATE USER 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd'; GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'127.0.0.1'; GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost'; FLUSH PRIVILEGES; EXIT;这里需要提醒你:p@ssw0rd是DVWA官方默认密码,部署完成后建议改掉。但修改密码时要注意同步修改config.inc.php和MariaDB里对应用户的密码,两处不一致会导致页面能打开,但一提交数据就报数据库连接错误。
5.3 PHP配置中那些容易被忽略的关键项
DVWA安装在本地后,有些功能模块(比如文件包含、文件上传)依赖PHP的某些配置项。配置文件在/etc/php/目录下,Kali不同版本的PHP路径会略有不同,一般都在/etc/php/8.2/apache2/php.ini这种位置。
需要重点修改的有两个参数:
allow_url_include = Off改为On:这个开关决定PHP代码中能否通过HTTP等方式远程包含文件。DVWA的File Inclusion模块和部分挖洞练习需要开启它display_errors = Off改为On:开启后,PHP脚本出错时会把错误信息直接显示在页面上,调试时非常直观
修改完保存,然后重启Apache让配置生效:
sudo systemctl restart apache2注意:在生产环境的真实服务器上,
allow_url_include必须保持关闭,display_errors也应该关闭,否则会泄露大量敏感信息。DVWA是本地靶场才这么改,别把这个习惯带到真实服务器上。
5.4 初始化数据库并进入DVWA
重新访问http://127.0.0.1/dvwa,页面底部的红色警告应该都变绿了。这时候点击页面底部的Create / Reset Database按钮,DVWA会自动创建数据表并写入初始数据。
初始化完成后,跳转到登录页面,使用默认账户登录:
用户名:admin 密码:password看到DVWA主界面后,先在左边菜单栏找到Setup/Reset Database,再点一次Create / Reset Database确认数据完整。然后就可以进入各个漏洞模块开始练习了。
有一点值得专门说一下:DVWA登录之后,默认的安全级别是Impossible,也就是所有漏洞都已经修复的状态。这时候你直接试验各种攻击手法会发现"全都打不进来"。正确的操作是先在页面底部的DVWA Security选项卡里把安全级别调为Low,再回到模块里去攻击。很多新手卡在这一步,不知道这是怎么回事,其实是默认级别选得太高。
6. 搭建过程中最常见的报错与排查思路
搭建DVWA的过程中,几乎每个人都会遇到几个报错。这里我把自己踩过的、以及帮别人排查过的常见故障整理成完整的排查链路,希望你能学会怎么一步一步定位问题,而不是只看答案。
6.1 页面能打开但提示数据库连接失败
这是最典型的报错之一。如果你看到类似Access denied for user 'dvwa'@'localhost'或者Could not connect to database的提示,说明PHP无法成功连上MariaDB。
排查链路如下:
- 先确认MariaDB服务是否在运行:
sudo systemctl status mariadb - 如果服务没启动,启动:
sudo systemctl start mariadb - 服务正常的话,接着用命令行手动登录测试:
如果这里登录失败,说明数据库用户或密码有问题;如果能登录成功,说明问题出在配置文件mysql -u dvwa -p'p@ssw0rd' -h 127.0.0.1 - 检查
config/config.inc.php里的数据库名、用户名、密码是否和MariaDB中实际创建的一致。这一步最容易被忽略——有人改了MySQL密码却忘了同步配置,有人创建了数据库但忘了授权 - 检查PHP的MySQL扩展是否安装:
如果没输出,说明缺php -m | grep mysqliphp-mysqli扩展,安装重启Apache即可
6.2 访问页面出现PHP警告或空白页
这种问题多半出在PHP版本兼容性上。DVWA项目本身更新频率不算快,遇到较新的PHP版本时,部分老代码会触发弃用警告,甚至因为display_errors被关闭直接白屏。
排查时先把display_errors打开,看看到底是什么错误信息。比较常见的是类似Deprecated: Functions with by-reference arguments must be passed as variables,这类警告一般不影响功能运行,可以忽略。
如果真的出现了Fatal error,那多半是某个PHP扩展没装。DVWA完整运行需要的扩展可以在页面顶部的检查区域看到,逐个安装缺失项:
sudo apt install php-curl php-zip php-gd php-xml php-mbstring -y sudo systemctl restart apache26.3 80端口被占用导致Apache无法启动
Kali本身可能预装了Nginx,或者你开了别的服务占用了80端口,Apache一启动就报Address already in use。
排查方式很简单:
sudo netstat -tlnp | grep :80看到PID和进程名后,两条路选一条:把占用进程停掉,或者给Apache换端口。既然是搭建DVWA,我建议直接停掉占用进程,保持80端口给Apache用,否则后续访问URL还得带端口号,比较别扭。
6.4 点击Create/Reset Database后没反应
如果点击按钮后页面刷新了但什么变化都没有,大概率是目录权限问题。DVWA的config目录或hackable上传目录没有写权限,导致初始化脚本执行到一半就失败了。
检查目录权限:
ls -la /var/www/html/dvwa/config确保config目录里面能写入文件。直接给www-data用户完全权限是最省事的做法:
sudo chown -R www-data:www-data /var/www/html/dvwa sudo chmod -R 755 /var/www/html/dvwa6.5 文件上传模块的目录始终提示不可写
DVWA的文件上传模块会把文件存到/var/www/html/dvwa/hackable/uploads/目录。如果上传模块报"目录不可写",先别急着怀疑权限命令有问题,检查一下是不是SELinux或者AppArmor在拦。Debian系默认用AppArmor:
sudo aa-status如果看到Apache相关的限制条目,可以临时禁用或为Apache进程调整策略。Kali桌面版一般不会触发这个,但如果你用的是定制化安装,还是值得排查一下。
6.6 表格速查:报错现象与常见原因
| 报错现象 | 最可能原因 | 快速解决办法 |
|---|---|---|
| 页面打开无样式 | AllowOverride未开启或.htaccess未生效 | 检查apache2.conf中的AllowOverride All |
| 数据库连接失败 | 用户名密码不一致或未授权 | 核对配置文件和数据库用户,执行FLUSH PRIVILEGES |
| 登录后所有模块空白 | PHP扩展缺失 | 按提示安装php-xml、php-mbstring、php-gd |
| 上传文件报不可写 | uploads目录属主不对 | chown -R www-data:www-data并设置755 |
| Apache无法启动 | 80端口被Nginx或其他进程占用 | netstat -tlnp找出占用进程并停掉 |
| Create/Reset没反应 | config目录无写权限 | chown www-data后重试 |
7. Docker方式备选:适合快速体验或环境极乱的场景
虽然我推荐手动部署,但有些场景下Docker确实是更好的选择。比如你不想折腾PHP版本冲突,或者电脑里已经跑了一堆服务,手动部署很容易搞乱环境,那用Docker隔离是最稳妥的。
7.1 Kali上安装Docker引擎
Kali基于Debian,安装Docker比想象中简单:
sudo apt install docker.io -y sudo systemctl start docker sudo systemctl enable docker sudo usermod -aG docker $USER最后一行的usermod -aG docker把当前用户加进docker用户组,这样就不必每条命令都加sudo。改完用户组后需要重新登录终端才能生效。
7.2 使用官方镜像启动DVWA
DVWA在Docker Hub上有社区维护的镜像,一条命令就能启动:
docker run --rm -it -p 8080:80 -d vulnerables/web-dvwa参数解释:
-d:后台运行容器-p 8080:80:把容器内部的80端口映射到宿主的8080端口。用8080是为了避免和你本机已装的Apache 80端口冲突--rm:容器停止时自动删除自身数据
启动后访问http://127.0.0.1:8080,如果登录进去后页面又提示数据库配置,可以先进入容器手动启动MariaDB:
docker exec -it <容器ID> service mariadb start注意:用
--rm参数启动的容器,一旦你停止并删除容器,所有数据都会消失。如果你打算长期使用Docker方式学习,建议去掉--rm参数,并把数据库目录挂载到宿主机做持久化。
7.3 手动部署与Docker的体验差异
如果你两种都试过就会发现,Docker方式虽然省事,但你在排查数据库连接、PHP配置问题时的收获远不如手动部署。而且DVWA后续练习时常需要修改PHP配置、上传马、看Apache日志,Docker容器里操作这些总归隔着一层。
所以我的建议非常明确:Docker适合"我只想看看DVWA长什么样"的人;手动部署适合"我真的想学会Web安全"的人。这篇博文的主要篇幅给了手动部署,也是这个原因。
8. 搭建完成后,DVWA模块的学习路径建议
环境搭好了,登录进去了,安全级别也调到Low了,接下来该练什么?很多人对着左侧菜单栏十几项,知道了模块名,却不知道从哪个先入手。我根据自己带人学习时的经验,说说推荐的顺序。
8.1 从Brute Force模块理解"登录暴力破解"
Brute Force(暴力破解)是最直观的漏洞模块。在Low级别下,你可以用Burp Suite抓包,然后发送到Intruder模块进行密码字典爆破;也可以用Hydra命令行工具直接破解:
hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 http-post-form "/dvwa/vulnerabilities/brute/?username=^USER^&password=^PASS^&Login=Login:Login failed"注意Kali里的rockyou.txt字典默认是压缩包形式,在/usr/share/wordlists/目录下,先解压再用。这个模块能让你直观理解认证机制为什么会被绕过,以及加验证码、加延迟、加锁定策略为什么能防爆破。
8.2 SQL Injection模块是入门必练
SQL Injection(SQL注入)是整个Web安全里最核心的技能之一。DVWA的Low级别几乎不设防,你在用户名字段直接输入:
admin' --就能绕过密码直接登录。这个模块还配套了Blind SQL Injection(盲注)关卡,让你理解在页面无回显的情况下如何通过布尔判断或时间延迟逐字符地猜出数据。
练习的时候建议同时在Burp Suite的Repeater里观察完整的HTTP响应,再到源码视图里比对后端SQL语句的拼接方式。从Low级别看到Impossible级别用PDO预处理语句修复的代码,你才能真正明白参数化查询为什么是防御注入的根本方案。
8.3 XSS模块与前端安全的思考
XSS(跨站脚本攻击)模块分为Reflected(反射型)和Stored(存储型)。Low级别下,你输入<script>alert(1)</script>就会被直接执行。这个模块很适合配合浏览器开发者工具观察DOM变化,理解浏览器为什么会把脚本当成页面的一部分执行。
练习完XSS后,建议你切到Impossible级别看看源码。你会看到DVWA使用htmlspecialchars()函数对输出做了HTML实体编码,这正是"输出编码"防御思路的直观展示。
8.4 File Upload与文件包含需要组合理解
File Upload(文件上传)模块在Low级别可以直接上传PHP一句话木马,然后配合菜刀或者蚁剑连接。这里要注意的是,上传和上传后的拿权限,往往需要你对服务器目录结构有足够了解。
File Inclusion(文件包含)模块则展示了另一种思路——服务器端包含文件时未严格校验路径,导致攻击者可以读取任意文件甚至远程执行代码。两个模块放到一起练,能帮你建立"入口点 + 利用链"的完整思路。
8.5 别忘了对比每个级别的源码差异
DVWA最有价值的地方不在于你能打好Low级别,而在于每练完一个模块,都去点击"View Source"看代码,对比四个级别之间到底改了什么。
- Low:完全没有防护,或者有极弱防护
- Medium:增加了函数过滤,但可以用大小写、双重编码、空格替换等方式绕过
- High:加了更严密的过滤和输入校验,但仍有逻辑缺陷
- Impossible:采用安全的函数和最佳实践,基本不可绕过
这种"同一漏洞的攻防演进过程",是任何教科书都给不了你的直观体验。
9. 部署完成后的安全基线建议
DVWA是一台"装满漏洞的靶机",它的存在价值就是被攻击,但这不意味着你可以无视安全基线。尤其是很多人在虚拟机里搭完后,还会在宿主机浏览器上访问它,或者把它放在局域网里随时练手。这种情况下,有几个底线问题一定要处理。
第一,不要让DVWA直接暴露在公网。默认配置下,DVWA没有限制访问来源,任何能访问到你IP的人都有可能尝试登录或者利用漏洞。如果你真的需要在云服务器上搭建,至少要通过防火墙或安全组把80端口限制为特定IP访问。DVWA本身对公网开放是高危行为的说法并非夸张——它是一个故意留漏洞的应用,被扫描到就等于送了一座门都开着的仓库。
第二,改掉默认账户和数据库密码。DVWA的默认登录账户是admin,密码是password,这套凭据几乎每个安全爱好者都知道。局域网练习可能无所谓,但如果对外开放,几分钟内就会被人用猜口令的方式登进去。数据库的dvwa用户密码同理,至少在配置文件和数据库两层都改成自定义密码。
第三,配置好备份快照。很多人在练习DVWA时会因为操作失误把数据表搞脏或者把文件改坏。我的建议是,在DVWA搭建完成、登录正常的那一刻,给虚拟机拍一个快照。之后不管把环境折腾成什么样,几分钟就能恢复到一个干净可用的状态,省掉重装系统的大把时间。
第四,练习时养成看日志的习惯。遇到异常报错时,不要只盯浏览器界面,多去看Apache和MariaDB的日志:
sudo tail -f /var/log/apache2/error.log sudo tail -f /var/log/mysql/error.log日志里面记录的每一行,都比你在网上搜"为什么白屏"更容易定位问题。自己也顺便建立用日志排查问题的意识,这种习惯越早养成越好。
10. 根据个人实战经验补充的扩展思路
环境搭建、模块练习都完成后,DVWA还能怎么玩?这里说几个我自己折腾过的方向,算是给已经上手的人一些进阶思路。
一个方向是结合外部工具做自动化测试。DVWA本身就是一套标准的"靶子",你可以用项目方提供的Docker环境反复起停,配合sqlmap对SQL注入模块做全自动检测,用Burp Suite的Scanner跑一遍所有模块,观察自动化工具和手工测试在报错、基于布尔、基于时间等不同类型漏洞上的检测差异。这种对比会让你对工具输出的准确性和局限有更实际的认识。
另一个方向是尝试修复漏洞。DVWA的Impossible级别其实就是官方给出的修复参考,但你可以不满足于参考,试着在自己部署的版本上去改进Low级别的代码——比如给文件上传模块加白名单校验、为SQL查询改成预处理语句。把一个漏洞靶场从"高危"修复到"安全",比单纯打穿更能帮人建立安全编码的直觉。我当年做完这个练习后,再看到同事写的代码漏洞时,脑子里会直接浮现出对应攻击手法,这种感觉还挺特殊的。
还有个比较省事但很有效的思路是:把DVWA部署到树莓派或者旧笔记本上,做成一个随身局域网靶场。出去玩的时候带一台小主机,几个人一起练。容器化部署在这种场景下也说得通了——换一台机器不用重新搭环境,省出来的时间全都能用在练习本身。
说到底,DVWA只是一个开始,但能把一个开始做到足够深入,后面的路会好走很多。希望这篇内容能帮你顺利把环境跑起来,也顺便少走一些我当年走过的弯路。