
简介这是一份以Windows 2000环境为背景的实验四学习笔记型PDF围绕FTP服务器与WWW服务器配置展开适合网络技术初学者、高校实训学生以及需要复习IIS建站流程的IT运维人员。文档共1个文件压缩包约1.34MB主要为PDF格式文字版步骤便于对照操作。内容从IIS 5.0安装讲起覆盖新建MYFTPSITE和MYWEBSITE站点、IP与端口设置、主目录与访问权限、默认文档配置、FTP匿名访问及虚拟目录等关键环节并配有实验报告思考题与截图位置提示。目前已有91人学习能帮助读者按步骤搭建基础网络服务理解HTTP与FTP的实际工作方式是一份适合边实验边查阅的简明操作指引。1. 这个实验到底在配什么FTP 与 WWW 是你进公司前最该亲手搭一遍的服务实验四FTP服务器及WWW服务器配置分享这套题把网络课里两座最基础的服务都串起来了一边是负责文件传输的 FTP一边是负责网页发布的 WWW。很多人以为它只是应付验收的实验实际上这两台服务在入职后大概率还会遇到——公司里放文件、做内部门户、让上游单位往你这里推数据底层跑的就是这两个东西。这篇笔记不讲虚的直接讲清楚选型、最小可复现配置、参数边界和最容易翻车的几个点新手能照着走熟手也能捡到几条排查经验。如果你正在准备实验报告答辩或者刚接手一台要跑这两个服务的 Linux 服务器这篇就是按落地顺序写的。2. 在 Linux 上把 FTP 服务器跑起来vsftpd 的安装、参数与最小可复现配置2.1 先定选型vsftpd、IIS FTP 还是 Pure-FTPd实验和线上环境各选谁FTP 服务器的搭建与配置第一步不是装软件而是定选型。Windows Server 上最顺手的是自带 IIS 的 FTP 服务图形界面点几下就能开Linux 上常见的三个是 vsftpd、Pure-FTPd 和 proftpd。实验环境只要有 Linux 虚拟机我一般直接选 vsftpd理由很实际系统源里直接能装配置文件只有一个 /etc/vsftpd.conf网上的配置笔记最多出问题好搜。Pure-FTPd 虽然更轻但参数风格和 vsftpd 不一样抄配置容易抄混proftpd 的模块化配置对新手并不友好。这里要划一条界如果你在华为 ensp 里配 FTP那是网络设备侧的配置看的是设备视图下的 ftp server 配置段和主机上跑 vsftpd 完全是两条技能树别在 ensp 里找 /etc/vsftpd.conf。实验四的题目如果写的是 FTP 服务器及 WWW 服务器配置默认指的是主机服务不是设备服务。选型上记住一个原则验证实验用发行版自带源里最成熟的包上线环境再按并发量和权限模型去换。2.2 最小可复现从安装、匿名禁用到本地用户登录的三步落地我写一个最常见的实验形态禁止匿名登录用本地用户 ftpuser 登录能上传下载且用户只能在自己家目录里活动。第一步装包加备份第二步写配置第三步加用户、开服务、放防火墙。# Debian / Ubuntu 系列安装 vsftpd sudo apt update sudo apt install -y vsftpd # 改动任何配置前先备份这是后悔药出了问题能一键回滚 sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak备份习惯是拿时间换来的教训。很多教程让你直接改 /etc/vsftpd.conf改完启动失败又记不住自己改了哪几行备份文件一拷回来就能恢复原状。后面所有步骤默认你已经装好包并做了一次备份。anonymous_enableNO local_enableYES write_enableYES local_umask022 dirmessage_enableYES xferlog_enableYES xferlog_std_formatYES connect_from_port_20YES chroot_local_userYES allow_writeable_chrootYES pasv_enableYES pasv_min_port30000 pasv_max_port31000这套配置的逻辑anonymous_enableNO 直接关掉匿名入口实验要求“禁止匿名”只要显式写这一行就够local_enableYES 决定系统用户能否登录write_enableYES 是上传、删除、重命名的总开关两个一起开才谈得上“能上传”chroot_local_userYES 把所有本地用户锁进各自家目录避免登录后看到整个磁盘结构。allow_writeable_chrootYES 是配套项新版 vsftpd 默认不允许 chroot 之后的家目录可写不加这一行用户家目录属主是用户自己时可写反而会报 500 OOPS 拒绝登录。然后是用户、启动和防火墙三连。这里以 ftpuser 为例密码按实验要求自己改。# 新建一个本地用户并设密码 sudo useradd -m ftpuser echo ftpuser:LabPass2024 | sudo chpasswd # 启动服务并设为开机自启 sudo systemctl enable --now vsftpd sudo systemctl status vsftpd如果实验要求“只有指定用户能登录”常见做法是配合 user_list 文件做白名单。把这两行打开再把 ftpuser 写进白名单文件userlist_enableYES userlist_denyNO userlist_file/etc/vsftpd.user_listecho ftpuser | sudo tee /etc/vsftpd.user_list注意这个文件的逻辑比较绕很多人都栽在这里userlist_enableYES 表示启用用户名单功能此时 userlist_denyYES 是默认值名单里的用户被禁止登录写成 NO 才是把名单当成白名单只有名单里的人能登录。实验题里要求“允许 root 和 ftpuser其他用户一律拒绝”就用白名单模式并把这两个用户都写进文件。2.3 必调参数解读local_enable、write_enable、umask 与主动/被动模式边界上面这段配置里真正决定“能不能用”的是三个参数值得单独拆开说。local_enableYES 只是允许本地用户登录它不决定能不能写能不能上传、删除、改名一律看 write_enableYES。很多实验报告里只开了 local_enable 忘了开 write_enable结果 FTP 客户端能连上、ls 正常put 时直接 550 Permission denied这属于配置层面的权限不是文件系统的权限。排查时先用这条命令区分清楚。local_umask022 决定用户通过 FTP 新建文件时的权限反掩码。022 意味着新建文件权限是 644、目录是 755这是最常规的组合如果实验要求别人能直接浏览你传上去的网页644 就够但如果要求 FTP 用户之间能互相覆盖文件可能需要把 umask 改成 002同时配合目录属组做协作。主动/被动模式是另一个高频观察点。FTP 的控制连接固定走 21 端口但数据连接有两种。主动模式PORT下服务器用 20 端口主动连客户端客户端有防火墙时常常连不回来被动模式PASV下服务器临时开一个高位端口等客户端来连所以必须有 pasv_min_port 和 pasv_max_port 把范围固定下来否则端口是随机的防火墙根本没法放行。我一般习惯把被动端口段设在 30000-31000并在防火墙里原样放行这一段这是被真实环境反复验证过的组合。提示connect_from_port_20YES 只对主动模式生效。如果你在 NAT 环境里做实验优先用被动模式客户端配置里把被动模式打开再核对服务器防火墙是否放行了端口段。放行命令按系统写以 UFW 和 firewalld 为例# Ubuntu / Debian 的 UFW sudo ufw allow 20:21/tcp sudo ufw allow 30000:31000/tcp # CentOS / Rocky 的 firewalld sudo firewall-cmd --permanent --add-port20-21/tcp sudo firewall-cmd --permanent --add-port30000-31000/tcp sudo firewall-cmd --reload到这里 FTP 部分的最小闭环就齐了。记得改完配置必须 systemctl restart vsftpd只改文件不重启服务是新手最常见的无效操作。3. 把 WWW 服务器架起来nginx php mysql 这条链路的配置逻辑3.1 WWW 不等于装个浏览器静态、动态与请求到底被哪一层处理WWW 服务器的配置实验实际做的是让一台 Linux 主机对外提供网页访问。这个实验最核心的认知是WWW 服务不是一个程序而是 Web 服务器加解释器加数据库的一条链路。浏览器请求先到 Web 服务器常见的 Apache httpd 或 nginx如果请求的是 .html、.css、图片这类静态文件Web 服务器自己直接返回如果请求的是 .php 这类动态文件Web 服务器把请求转给 PHP-FPM 解释器跑完再把结果返回浏览器PHP 脚本里要读数据才会去连 MySQL/MariaDB。学校实验用 Apache httpd 的也很多配置路径是 /etc/httpd/conf/httpd.conf 或 /etc/apache2/sites-available/ 下的虚拟主机默认站点目录 /var/www/html。我这里用 nginx 来写不是因为 Apache 不好而是 nginx 的 server 块把监听端口、站点根目录、php 转发分开写一句话对应一个职责对实验来说更好解释。你在交付报告里写清楚用的是哪条链路就行两种都算合格的“WWW 服务器配置”实验。3.2 最小可复现nginx 站点的完整落地配置含PHP转发安装那条命令是在机器上把三样东西一起装齐# Debian / Ubuntu 一次装齐 nginx、MariaDB、PHP-FPM sudo apt update sudo apt install -y nginx mariadb-server php-fpm php-mysql # 确认 php-fpm 的 socket 路径版本不同路径不同 ls -l /run/php/php*-fpm.sock网上大量 mysql 安装配置教程的第一步是初始化 root 密码实验里更常见的做法是直接建一个业务库和专用账号下面这四条命令就是最小集。新版 MariaDB 默认 root 使用 unix socket 认证先 sudo 进命令行再逐条执行sudo mariadb -e CREATE DATABASE lab DEFAULT CHARACTER SET utf8mb4; sudo mariadb -e CREATE USER lablocalhost IDENTIFIED BY LabPass2024; sudo mariadb -e GRANT ALL PRIVILEGES ON lab.* TO lablocalhost; sudo mariadb -e FLUSH PRIVILEGES;这里的 lab 库是给后面的 PHP 页面做演示用的账号 lab 的权限被限制在 lab.*不会误伤系统其它库密码按实验要求改别在生产环境用这种弱口令。然后是 nginx 的站点配置。Debian/Ubuntu 装完 nginx 会自带一个监听 80 的默认站点先把它从 sites-enabled 里移走避免端口冲突。配置放在 /etc/nginx/conf.d/ 下用 server 块定义一个站点# 释放 80 端口CentOS 没有 sites-enabled跳过这行 sudo rm -f /etc/nginx/sites-enabled/default sudo vim /etc/nginx/conf.d/lab.conf配置文件内容如下server { listen 80; server_name lab.local; root /var/www/lab; index index.php index.html; location / { try_files $uri $uri/ 404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.2-fpm.sock; } }这里要说清楚三个关键点考试和面试都爱问。第一root /var/www/lab 是这个站点在磁盘上的根目录浏览器访问 / 时nginx 会去 /var/www/lab 找文件路径配错了直接 404。第二index index.php index.html 决定访问根路径时先找哪个文件写在前面的优先你要让实验页面先出 index.php就把它排在 index.html 前面。第三location ~ .php$ 用正则匹配所有以 .php 结尾的请求里面 fastcgi_pass 指定把请求交给 PHP-FPM 的 unix socket这段配置不写或者 socket 路径不对php 文件就会变成下载内容后面避坑章节专门讲。再把站点目录建出来放一个静态页和一个 php 探针页最后改属主、测试配置、重启服务sudo mkdir -p /var/www/lab echo h1Lab OK/h1 | sudo tee /var/www/lab/index.html echo ?php phpinfo(); ? | sudo tee /var/www/lab/info.php # nginx 的 worker 进程跑在 www-data 用户下目录必须给它读和执行权限 sudo chown -R www-data:www-data /var/www/lab # 先测配置语法报错就停别直接 restart sudo nginx -t sudo systemctl restart nginx这一步做完浏览器或 curl 访问 http://127.0.0.1/ 应该能看到 Lab OK访问 /info.php 能看到 PHP 的版本信息页。如果实验要求使用 Apache把默认根目录从 /var/www/html 换成你自己建的位置注意 httpd 的 worker 用户是 apache 或 www-data同样要 chown。3.3 参数边界root / index / fastcgi_pass 三个配置各自负责什么root 和 alias 是 nginx 里很容易混的两个指令。root /var/www/lab 的意思是访问 /aa.jpg 时找 /var/www/lab/aa.jpgroot 会把完整路径拼在 URL 后面alias /var/www/lab 则是 URL 路径不拼接直接映射到目标目录。实验里几乎都用 root但如果你见过别人的配置里用 alias要知道两者不能互换alias 后面必须指向真正存放文件的路径。index 指令的边界在于它只在访问目录时生效比如访问 / 或 /test/。如果访问的是一个具体文件 /test/run.phpindex 完全不起作用nginx 直接去找这个文件。这也解释了为什么网站根目录下没有 index 文件时访问 / 会 403 或 404因为你让 nginx 去列目录而 autoindex 默认是关的。fastcgi_pass 是动态请求的出口。nginx 识别出需要转给 PHP 的 .php 文件后把请求交给 PHP-FPM这里有两种写法unix socket 和 ip:port。Debian/Ubuntu 的 php-fpm 默认监听 unix socketCentOS 默认监听 127.0.0.1:9000。Socket 路径里的版本号必须和系统里实际装的 php 一致比如 php8.2-fpm 就写 php8.2-fpm.sock别照抄网上的 7.4 版本。判断方法很简单ls /run/php/ 看文件名配置里写哪个就复制哪个。提示location ~ .php$ 是正则匹配优先级高于普通的 location /。如果你在 server 块里既写了静态文件的 location又写了 php 的 location访问 .php 文件时一定会走正则那个块这是 nginx 的匹配规则不是 bug。到这里 WWW 服务的基础闭环也通了。实验报告里把数据库初始化记录、nginx 主配置、验证输出三样贴全基本能拿高分。4. 配置实践中的 5 个常见问题与排查防火墙、SELinux、端口、权限与日志实验做多了就会发现FTP 和 WWW 配置本身不复杂真正浪费时间的是那些“看着全对却连不上”的瞬间。下面这 5 个坑是我在反复翻车之后沉淀下来的每一条按现象、原因、解决三段写你可以直接拿去当排查手册用。4.1 坑位1客户端能 ping 通却连不上或连上后 ls 一直转圈现象客户机和服务器互相 ping 通防火墙也“好像”没挡住但 FTP 客户端要么在登录后卡住要么传文件时报 data connection failed、425 Failed to establish connection。原因这是 FTP 数据连接的经典问题。控制连接走 21/TCP数据连接走另外的策略默认的主动模式下服务器从 20/TCP 主动连客户端只要客户端有简单的出站过滤或 NAT 就会失败如果切了被动模式服务器随机开一个高位端口而你防火墙只放行了 21数据连接照样被拦。解决先把 21/TCP 的放行确认掉ss -lntp 必须能看到 :21 在 LISTEN防火墙规则里放行 21/tcp再统一走被动模式把服务器端口范围固定在防火墙里放行 30000-31000/TCP。具体配置就是 2.3 节里那组 pasv_min_port 和 pasv_max_port。改完一定要 systemctl restart vsftpd只 reload 有时不生效的是参数组里的被动范围。4.2 坑位2nginx 启动成功curl 却返回 403 或 404现象systemctl status nginx 显示 running但 curl -I http://127.0.0.1/ 返回 403 Forbidden或者浏览器访问子路径返回 404 Not Found。原因403 和 404 的原因不同。403 多数是权限问题站点根目录不存在、或者 nginx 的 worker 用户www-data / nginx对目录没有读和执行权限nginx 能启动但进不去目录404 多数是路径问题root 配的目录和实际文件位置不一致或者你访问的 index 文件在磁盘上根本不存在。解决先看文件在不在再查权限。ls -la /var/www/lab 确认 index.html 存在权限上目录至少要有 755文件至少 644或者直接 chown -R www-data:www-data /var/www/lab 把整个站点的属主交给 nginx。修改权限后刷新一次403 先消掉剩下的 404 基本是 root 或 index 指令写错。4.3 坑位3root 能登录 vsftpd普通用户却被拒绝现象用 root 登录 FTP 一切正常换成实验要求的 ftpuser 登录直接被 530 Login incorrect 弹出来。原因vsftpd 的用户控制有两处。一是系统级的 /etc/ftpusers这个文件里的用户被默认禁止登录很多发行版把 root、daemon 等系统账号都列在里面二是 vsftpd 自己的 user_list 逻辑当 userlist_enableYES 且 userlist_denyYES默认时user_list 里的用户是黑名单如果你把 ftpuser 写进去了它就进不来。你看到的“root 能登录普通用户不行”很可能是实验配置把 userlist_enableYES 打开却忘了处理 userlist_deny导致文件里的所有用户都被当成黑名单。解决先用 getent passwd ftpuser 确认系统账号存在再查 user_list 和 ftpusers 两个文件。实验要“只允许白名单用户登录”时把 userlist_denyNO 显式写出来user_list 就变成白名单然后把允许的账号放进去同时确保 /etc/ftpusers 里没有你正在放行的那个账号。改完重启 vsftpd。4.4 坑位4配置看着都对客户端仍然拒连或超时SELinux 在背后使绊子现象服务在监听firewalld 也放行了端口客户端却还是 Connection timed out用 ssh 去本机 curl 时又一切正常。这种情况在 CentOS、Rocky、Fedora 上特别典型Ubuntu 用户基本遇不到。原因SELinux 默认策略会拦截很多服务行为典型的就是 httpd 发起网络连接、FTP 用户写家目录这类操作。firewalld 放行的是防火墙层面SELinux 是内核安全模块层面两个独立运作前者放行不代表后者放行。解决先用 getsebool -a 查看相关布尔值最常改的两个是 allow_ftpd_full_access 和 httpd_can_network_connect把它们设成 on 并持久化getsebool -a | grep -E ftpd|httpd sudo setsebool -P allow_ftpd_full_access on sudo setsebool -P httpd_can_network_connect on很多时候网上的“玄学”排查卡在奇怪的位置最后发现是这几个布尔值在作祟。注意别图省事直接 setenforce 0把 SELinux 整个关掉上线环境会被安全审计盯上实验环境也养不成好习惯按需放开具体布尔值才是正路。4.5 坑位5HTML 能出PHP 文件却被下载或显示空白现象访问 index.html 正常访问 info.php 时浏览器直接弹下载框或者页面一片空白没有内容。原因前者是 nginx 把 .php 当静态文件返回了说明 location ~ .php$ 没生效或者 fastcgi_pass 缺失后者是 fastcgi_pass 的 socket 路径和实际 php-fpm 不对php-fpm 没启动nginx 转发失败也只返回空白。这些错误不会显示在浏览器全在日志里。解决先看 /var/log/nginx/error.log里面有明话比如 connect() to unix:/run/php/php8.2-fpm.sock failed。再确认 php-fpm 在跑systemctl status php-fpm 查看sock 路径用 ls /run/php/ 对比配置改完 nginx -t 加 restart。日志是这里唯一的黑匣子别在浏览器和配置文件之间反复瞎猜。5. 配置完怎么自证可用验证命令、联动 FTP 与 WWW 的常见做法服务配置完最容易被忽视的是验证环节。我的做法是一套固定的三件套先看端口再看日志最后做功能验证。端口用 ss -lntp 确认 vsftpd 监听 21、nginx 监听 80日志用 tail -f /var/log/vsftpd.log 和 /var/log/nginx/access.log 分别盯 FTP 和 HTTP功能上用 ftp 命令行和 curl 各来一轮ftp 客户端登录后 pwd、ls、put、get 各跑一次curl 看响应头。ss -lntp | grep -E :21|:80 curl -I http://127.0.0.1/ curl -I http://127.0.0.1/info.php这组命令先看端口监听再看 HTTP 响应头。curl 返回 200 说明静态页和 PHP 解析都通了如果 info.php 返回 500 或 Content-Type 是 application/octet-stream回头查第 4.5 条。端口检查里 :21 和 :80 必须出现在 LISTEN少一个就回到对应服务去看 systemctl status。第二个技巧是把 FTP 和 WWW 联动起来这也是很多实验的加分项。常见做法是让 FTP 的本地用户直接落在 WWW 站点目录里FTP 传上去的文件立刻能在浏览器看到。实现上不用改 nginx只需要把 FTP 用户的根目录指到站点目录并给足写权限sudo useradd -d /var/www/lab -M webpush echo webpush:LabPass2024 | sudo chpasswd sudo chown webpush:www-data /var/www/lab sudo chmod 775 /var/www/lab这个用户的家目录就是 WWW 站点目录FTP 上传的文件直接变成网页内容验证时用 ftp 客户端传一个 index.html浏览器里立刻能看到变化说明 FTP 与 WWW 的配合没有权限死角。我在企业内部见到过的最典型用法是上游单位把数据文件往公司 FTP 推服务器上的脚本每天定时拉下来转成 e 文件格式再喂业务库另一边 WWW 站点负责展示处理结果。实验里的这台练手服务器本质就是把这条链路缩小到一个机房能跑通。最后说配置分享的习惯。交实验或者交接给下一届时把系统版本、vsftpd.conf 核心段、nginx 站点配置、验证命令的输出四样贴进文档不要只丢结论。我自己吃过一个亏当年实验报告只写了“配置成功”三个月后重装系统照着报告根本还原不出当时的参数还得翻命令行历史。从那以后我每次改配置前都 cp 一份带日期后缀的备份改完把 diff 结果存进笔记再写清楚每个参数在当时的场景里是干什么的。希望这次整理的验证和联动套路能帮到你。我每次带新人也只会先让他们搭这一遍后面再踩到别的坑至少知道往日志和参数两个方向找。本文还有配套的精品资源点击获取