
简介在Windows 2000环境下配置FTP与WWW服务器是网络服务搭建中的基础技能也是很多网络工程课程的实验重点。这份实验指导PDF将整个流程拆解为可照做的操作指南适合网络初学者、计算机相关专业学生以及需要维护IIS环境的IT运维人员。内容从IIS 5.0安装讲起详细说明通过Internet服务管理器新建FTP站点MYFTPSITE和Web站点MYWEBSITE的步骤覆盖端口号设置、主目录映射、访问权限、匿名连接、虚拟目录配置、默认文档指定等关键环节同时结合Ethereal抓包软件解释网络包交互原理。全文配有操作界面图示对照执行即可完成文件上传下载与网页发布。资源共1个PDF文件大小约1.34MB便于随时查阅已有91人浏览学习。读者可获得一套完整可复用的Windows网络服务配置方法对理解IIS架构和排错也很有帮助。1. 实验四在讲什么两个服务器一次把文件传输和网页访问的链路打通一份名为《实验四FTP服务器及WWW服务器配置分享》的 PDF几乎是网络工程和信息化运维课里的标配作业一半人对着 vsftpd 折腾匿名访问和本地账号另一半人对着 Nginx 或 Apache 补网站目录和默认页。这类实验真正的价值不在背配置而在于你把文件从一台机器传上去再用浏览器从另一台机器拉下来这条链路从头到尾能自己证明通。你学的不是某个命令而是文件从上传到发布这整条链路里每一个环节各自负责什么。下面按最省事的路子讲环境用 Ubuntu 或 CentOS 都行FTP 选 vsftpdWWW 选 Nginx后面给 Apache 对照每一步给可复制的命令和参数说明。适合刚接触 Linux 服务器、第一次在虚拟机上搭网络服务的学生也适合想给实验室或小团队快速搭一个文件发布通道的运维新人。2. FTP 服务器怎么搭建vsftpd 的最小可用配置2.1 安装与启动一条命令把服务端跑起来FTP 的服务器端实现很多vsftpd 是 Linux 发行版里最常预装的那个名字里的 very secure 说的是它默认配置偏保守比早期那些开箱即用的古老 FTP 服务端更适合教学环境。常见做法是在 Ubuntu 上用 apt、在 CentOS/RHEL 上用 dnf 直接装# Ubuntu / Debian 系 sudo apt update sudo apt install -y vsftpd # CentOS / RHEL / Rocky 系 sudo dnf install -y vsftpd装完后先看一眼服务状态再决定要不要手动启动sudo systemctl enable --now vsftpd sudo systemctl status vsftpd安装这一步的逻辑很简单apt/dnf 会把 vsftpd 的可执行文件、默认配置/etc/vsftpd.conf和 systemd 单元文件一起放好。enable --now的意思是开机自启 立刻运行避免你实验做完重启虚拟机之后服务又没了。如果 status 输出里看到active (running)说明监听已经起来可以用ss -lntp | grep :21确认 21 号端口在监听。这一步卡住的人多半是系统里之前装过别的 FTP 实现比如 pure-ftpd两者抢 21 端口后面避坑章会说怎么排查。2.2 账号、目录与被动模式三个必调参数安装完的 vsftpd 默认配置只适合本机测试真要按实验要求跑通用户上传、匿名访问两种链路需要改/etc/vsftpd.conf。用 root 或 sudo 编辑改完重启服务。下面是一份能直接抄的配置注释里写了每条的作用# 匿名访问实验要求开就留 YES否则 NO anonymous_enableYES # 匿名用户上传文件不开这项匿名只能下载 anon_upload_enableYES # 允许匿名用户在可写目录里建目录 anon_mkdir_write_enableYES # 本地账号登录 FTP local_enableYES # 允许本地账号上传、删除、重命名 write_enableYES # 上传文件默认权限 644目录 755 local_umask022 # 把用户锁在自己的家目录里不让别人逛到 / chroot_local_userYES # 允许家目录可写默认 chroot 后家目录只读容易踩坑 allow_writeable_chrootYES # 被动模式端口范围防火墙要放行这个区间 pasv_enableYES pasv_min_port40000 pasv_max_port40100 # 日志 xferlog_enableYES xferlog_file/var/log/vsftpd.log这段配置的关键在于chroot_local_userYES和pasv_min_port/pasv_max_port两个点。chroot_local_userYES会把登录用户锁在自己的家目录里FTP 命令里看到的/其实就是家目录这既是安全边界也是实验里每个学生只能看到自己目录的实现方式。但默认策略下锁定的目录不能有写权限所以必须配套allow_writeable_chrootYES否则用户一上传就报 550。被动模式端口范围则是给数据连接留一个明确区间后面配置防火墙时只需放行 21 和 40000-40100 两段即可。改完配置先检查语法再用 systemd 重启sudo systemctl restart vsftpd sudo systemctl status vsftpd注意如果你改了端口范围但没有清掉旧的防火墙规则会出现控制连接能通、列目录卡死这种经典故障后面第 5 章专门说。2.3 验证与日志lftp 和 curl 怎么确认 FTP 真的通了配置写完了别急着交实验报告先用命令行验证两件事匿名能下载、本地账号能上传。验证 FTP 最顺手的工具是 lftp它比 ftp 那个老客户端更接近浏览器体验还能显示错误码# 匿名登录列目录 lftp 127.0.0.1 # 登录后输入 ls能看到 pub 目录说明控制连接和数据连接都通 # 本地账号方式假设建了一个叫 ftpuser 的用户 lftp ftpuser127.0.0.1 # 提示输入密码进入后执行 put /etc/hostname把本文件传上去如果 lftp 交互模式用不惯可以用 curl 做一次纯命令行的上传验证这招在脚本里也常见cd /tmp echo ftp test test.txt curl -u ftpuser:你的密码 -T test.txt ftp://127.0.0.1/upload/curl 的-T参数表示上传本地文件-u带上用户名和密码。上传成功后再lftp ftpuser127.0.0.1进去ls查看。这一步能通说明write_enableYES和local_umask022都生效了。日志在/var/log/vsftpd.log里面每一条 PUT/STOR 都有记录排错时先翻它。实验课里很多同学在这步卡住原因通常是账户密码里带特殊符号curl 和 lftp 对、#这类字符的解析不同可以先改成纯数字字母密码排除干扰。3. WWW 服务器配置从静态页面到虚拟主机的完整落地3.1 用 Nginx 实现第一个站点server 块的最小写法FTP 负责把文件送进来WWW 服务器负责把文件以网页形式发出去。Linux 上最常见的两个选择是 Nginx 和 Apache实验课建议优先 Nginx因为它的配置模型更简单一个server块就是一个站点你看配置文件就能想象出请求怎么走的。先把包装上# Ubuntu / Debian sudo apt install -y nginx # CentOS / RHEL / Rocky sudo dnf install -y nginx sudo systemctl enable --now nginxNginx 装完后默认站点在/var/www/html配置文件在/etc/nginx/sites-available/default。实验要求往往不止一个站点更好的做法是为每个站点写独立配置然后建立软链接到sites-enabled。先建站点目录和首页sudo mkdir -p /srv/www/实验站点 echo h1实验四站点/h1 | sudo tee /srv/www/实验站点/index.html注意我刻意没用默认的/var/www/html原因是后面要让 FTP 用户上传文件目录放在/srv/www下更直观。接下来写一个最小但完整的 server 块sudo vim /etc/nginx/sites-available/experimentserver { listen 80 default_server; listen [::]:80 default_server; root /srv/www/实验站点; index index.html index.htm; server_name _; location / { try_files $uri $uri/ 404; } }listen 80 default_server表示这是该 IP 上 80 端口的默认站点访问 IP 时直接进这个配置。root指向站点文件所在目录index决定访问/时先找哪个文件try_files是 Nginx 的典型路由写法先找真实文件找不到再尝试目录都没有就返回 404。写完做两件事sudo ln -s /etc/nginx/sites-available/experiment /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginxnginx -t是语法自检输出syntax is ok再reload。然后开浏览器访问http://服务器IP/应该能看到实验四站点那行标题。如果看到的是 Nginx 默认欢迎页多半是你没把默认配置文件从sites-enabled里移除或者default_server冲突。3.2 多站点与自定义域名按域名或端口拆 server 块实验做到这儿常见需求是一台服务器上搭两个 WWW 站点用不同域名或端口区分。这在 Nginx 里就是拆两个 server 块用server_name或listen区分。给两个站点各建一个配置# /etc/nginx/sites-available/site1 server { listen 80; server_name site1.local; root /srv/www/site1; index index.html; }# /etc/nginx/sites-available/site2 server { listen 8080; server_name _; root /srv/www/site2; index index.html; }site1 用域名site1.local区分site2 用 8080 端口区分。这里要理解 Nginx 的匹配顺序先匹配listen的端口再匹配server_name。同端口下如果多个 server 块都匹配default_server或第一个出现的会兜底。如果想在本机测试site1.local要在访问的机器上改 hosts 文件让域名指向服务器 IP# 在有浏览器的机器上执行WindowsC:\Windows\System32\drivers\etc\hosts echo 192.168.x.x site1.local | sudo tee -a /etc/hosts改 hosts 是内网实验环境最通用的做法不依赖 DNS 服务器。如果服务器上还要让其他容器或虚拟机的多个服务共存比如前端 80、后端 API 用 8080、管理面板用 9090就按端口拆 server 块逻辑上完全一样。3.3 Apache 的替代方案DocumentRoot 与 .htaccess 的取舍如果实验模板指定 Apache也别慌逻辑和 Nginx 是等价的。Ubuntu 上安装sudo apt install -y apache2 sudo systemctl enable --now apache2Apache 的站点配置在/etc/apache2/sites-available/默认文件叫000-default.conf。最小站点长这样# /etc/apache2/sites-available/experiment.conf VirtualHost *:80 ServerName localhost DocumentRoot /srv/www/实验站点 Directory /srv/www/实验站点 Require all granted /Directory /VirtualHost启用站点用a2ensite禁用默认站点用a2dissite 000-default然后重载sudo a2ensite experiment sudo a2dissite 000-default sudo systemctl reload apache2Apache 和 Nginx 最大的差别在权限模型的直观度Directory里的Require all granted必须显式声明允许外部访问该目录否则 403。Nginx 则默认就跟着root走。如果你在实验中遇到 403先看这个配置。.htaccess在实验课里很常见它让每个目录能放一个覆盖配置的文件但要在Directory里开启AllowOverride All才生效。实际生产环境我基本禁用.htaccess因为每次请求都要扫描目录找这个文件性能差且难排查但这属于工程经验问题实验课按课程要求写即可。4. FTP 与 WWW 联动把上传目录变成网站根目录的发布链路4.1 目录绑定加权限控制用户家目录与站点根目录合一FTP 和 WWW 分开讲都很简单真正的重头戏是让它们协作。实验四最常见的联动需求是用户通过 FTP 上传网页文件浏览器立刻能从 WWW 服务访问到。实现思路是让 FTP 用户的家目录就是 Nginx 的站点根目录。创建用户时直接用-d指定家目录sudo useradd -m -d /srv/www/site1 -s /bin/bash ftp_site1 sudo passwd ftp_site1 echo h1来自 FTP 上传的页面/h1 /tmp/index.html # 注意此时 /srv/www/site1 属主是 ftp_site1可以直接上传 sudo -u ftp_site1 cp /tmp/index.html /srv/www/site1/这里有个权限要点站点目录/srv/www/site1的属主是ftp_site1Nginx 的 worker 进程则是www-dataUbuntu或nginxCentOS。FTP 用户负责写文件WWW 服务负责读文件两个身份不同但目录相同。默认目录权限 755、文件权限 644 能让 Nginx 读取。如果上传上去浏览器访问出现 403绝大多数是目录没有x执行权限因为 Nginx 要在目录里做路径解析必须对目录有读和执行权限。可以用这段命令统一校正sudo chmod 755 /srv/www/site1 sudo chmod 644 /srv/www/site1/index.htmlchmod 644的含义是属主可读写、属组和其他人只读。不要给 777那是实验课的常见陋习会让管理员日志里全是权限告警。文件上传后用stat -c %a %U %G /srv/www/site1/index.html查看实际权限比肉眼猜可靠。4.2 多成员场景的权限设计setfacl 与 sgid实验室里最常见的一个坑是一台服务器上多个学生共用站点目录发布网页。如果每个学生一个 FTP 账号都往同一个/srv/www/shared写文件普通 Linux 权限很快就会乱A 上传的文件 B 不能覆盖或者 B 建的目录 Nginx 读不了。常见做法是用系统默认的 POSIX ACL 给目录加默认权限让该目录下新建的文件自动继承属组权限sudo mkdir -p /srv/www/shared sudo chgrp www-data /srv/www/shared # 给组读执行权限并设为默认 ACL sudo setfacl -m g:www-data:rx /srv/www/shared sudo setfacl -d -m g:www-data:rx /srv/www/shared # 目录加 sgid让新文件自动继承 www-data 属组 sudo chmod gs /srv/www/sharedsetfacl -d那条设置的是 default ACL之后在这个目录里新建的文件或子目录会自动带g:www-data:rx权限省去每次 chmod。chmod gs是 setgid作用类似新文件属组自动变成目录的属组。这两条配合使用多账号上传场景下权限基本不会再打架。如果学校实验环境不用 ACL退而求其次的办法是让每个学生目录各自独立Nginx 每个目录写一个location块但管理成本高。4.3 动态站点也要考虑FTP 上传 PHP 后FastCGI 权限怎么放实验四如果不止静态页面还要求在 WWW 服务器上跑 PHP联动就要多一层。Nginx 本身不执行 PHP它把.php请求转给php-fpm进程处理。装好 php-fpm 后在 server 块里加一段location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; }fastcgi_pass指向 php-fpm 的 socket 文件include snippets/fastcgi-php.conf是 Ubuntu 发行版预设好的一组 fastcgi 参数包含SCRIPT_FILENAME等关键项。这时权限要点变了PHP 文件不仅要让 Nginx 能读还要让www-data用户能读因为 php-fpm 默认以www-data身份运行。从 FTP 上传的 PHP 文件如果属主是ftp_site1需要保证其他人有读权限sudo chmod 644 /srv/www/site1/index.php sudo -u www-data php -l /srv/www/site1/index.phpphp -l是语法检查能发现文件能不能被 www-data 读取以及 PHP 代码是否有致命错误。实验课里FTP 传上去的 PHP 文件打开变成下载或直接 403多半就是漏了让 www-data 对目录有x权限或文件权限不够。这里也给个排查口诀静态页看文件读权限动态页看目录执行权限和 sock 文件权限。5. 实验四避坑连不上、传不上、页面 403 的三类高频翻车5.1 FTP 能登录但列不出目录数据连接被防火墙拦了现象lftp 输完用户名密码进去了敲ls后就一直卡住最后超时提示Connection refused或Timeout。原因FTP 有控制连接和数据连接两条通道21 端口只管登录真正传数据走的是被动模式端口。你只放行了 21防火墙把 40000-40100 这一段全拦了数据连接建立不了。解决在服务器防火墙上放行被动端口范围。# Ubuntuufw sudo ufw allow 20/tcp sudo ufw allow 21/tcp sudo ufw allow 40000:40100/tcp # CentOS / RHELfirewalld sudo firewall-cmd --permanent --add-serviceftp sudo firewall-cmd --permanent --add-port40000-40100/tcp sudo firewall-cmd --reload如果是虚拟机的 NAT 网络还需要确认宿主机和虚拟机的映射但这一步超出实验范围。排错时用ss -lntp | grep vsftpd看端口监听再用nmap -p 40000-40100 服务器IP确认端口是否 open。5.2 明明传了 index.html浏览器还是 403现象FTP 上传成功ls能看到文件但访问站点根路径返回 403 Forbidden。原因目录权限缺xNginx worker 进程进不去目录或 SELinux 策略拦截了 httpd 对非默认目录的访问。CentOS/RHEL 上后者的概率极高。解决# 先看权限 ls -ld /srv/www/site1 # CentOS 系关闭或放行 SELinux sudo setsebool -P httpd_read_user_content 1 sudo restorecon -Rv /srv/www/site1setsebool是运行时放行restorecon是修正文件的安全上下文。实验课里更快的临时办法是sudo setenforce 0但那是关 SELinux只建议用来验证是不是它的问题最后要记得改回来。查日志命令sudo tail -f /var/log/nginx/error.log看到Permission denied就是权限或 SELinux。5.3 上传返回 550 Permission deniedroot 被拒和主动模式目录写权限两个坑现象用 root 账号登录 FTP 后put一个文件返回550 Permission denied。原因vsftpd 默认禁止 root 这类系统账号登录而且即便你改配置放行root 的家目录是/rootFTP 用户未必有写权限。550是个笼统错误先区分是登录被拒还是写权限不足。解决实验课别用 root 做 FTP 测试建一个普通用户并确认家目录可写sudo useradd -m -s /bin/bash testftp sudo passwd testftp sudo chmod 755 /home/testftp如果确实需要某个账号能 FTP但不想给它 shell 登录权限可以用-s /sbin/nologinvsftpd 只验证密码不验证 shell 类型。还有一个变体登录后能建目录、删文件但传文件就 550那是 vsftpd 配置里write_enableYES没开或chroot目录只读回到 2.2 节检查allow_writeable_chrootYES。5.4 浏览器把 index.html 下载成文件而不是显示页面现象访问http://IP/时浏览器直接下载了一个文件没有渲染页面。原因站点根目录下缺少index.html或者 Nginx 配置里没有index指令。如果目录里只有main.htmlNginx 找不到索引文件默认行为是把目录列表或把文件内容按二进制流返回。解决# 在站点根目录补一个索引页 echo hello /srv/www/site1/index.html # 或在 server 块里追加 index index.php index.html index.htm;注意index指令的优先级Nginx 按从左到右的顺序找文件第一个存在就返回。放了index.php在前但 PHP 解析挂了又会变成下载 PHP。验证方法curl -I http://服务器IP/看响应头里的Content-Type是text/html还是application/octet-stream。5.5 重启虚拟机后 FTP 起不来systemd 单元被 masked 或端口 21 被占用现象systemctl start vsftpd报错Job for vsftpd.service failed但配置文件没改过。原因一种是之前装了别的 FTP 实现systemd 的vsftpd.service和pure-ftpd.service冲突另一种是restart执行得太快旧进程还没释放 21 端口。解决# 查看端口占用 sudo ss -lntp | grep :21 # 如果是 pure-ftpd 等其他服务占用 sudo systemctl stop pure-ftpd sudo systemctl disable pure-ftpd # 查看 vsftpd 是否被 masked systemctl is-enabled vsftpd systemctl unmask vsftpd排查时先journalctl -u vsftpd -n 20看最近日志比反复 restart 有用。如果你做了第 2 章配置但没执行systemctl restart vsftpd旧配置会一直在跑改了什么都是玄学不生效——这类问题在实验课上出现频率不低。6. 收尾组合服务上线前用这四条验证链路收口FTP 和 WWW 都配好后别急着截图交报告用一个完整链路验证收口从 FTP 上传一个文件到浏览器访问到它。拿我自己带实验的习惯来说固定走四步看端口、看权限、看日志、看响应。第一步确认监听和服务状态ss -lntp | grep -E :21|:80|:8080 systemctl is-active vsftpd nginx第二步上传一个测试页并确认权限echo h1链路验证 $(date)/h1 /tmp/index.html lftp -u ftp_site1,密码 127.0.0.1 -e put /tmp/index.html; quit stat -c %a %U %G /srv/www/site1/index.html第三步用 curl 验证 HTTP 响应这一步能同时检查索引文件和 MIME 类型curl -I http://127.0.0.1/ curl -s http://127.0.0.1/ | grep 链路验证第四步确认日志里链路痕迹tail -n 5 /var/log/vsftpd.log tail -n 5 /var/log/nginx/access.logvsftpd.log里能看到STOR index.htmlaccess.log里能看到GET / 200两条日志一凑整条链路就闭环了。这四步不是纸上谈兵我实际带实验课时至少一半学生的配置没问题是卡在第一步——服务装了但没 enable重启后没人 care。这里多补一句如果你用的是 Ubuntu 22.04 自带的 nftables 或 CentOS 的 firewalld放行后务必systemctl reload或firewall-cmd --reload否则规则不生效。我这个习惯是从早期被防火墙坑出来的后来每次实验必先跑一遍这个清单再往下排少走很多弯路。希望帮到你。本文还有配套的精品资源点击获取