之前写过 phpStudy 搭 DVWA 和双靶场踩坑,这篇是课堂版:源码编译路线的 LNMP。坑比一键面板多得多,但正因为源码装,才把 Linux 服务管理的底层机制讲透了。
0x01 SSH 连不上:由底向上的排查链
远程连接失败时的标准排查顺序(网络 → 服务 → 策略):
ping <IP> # 1. 网络通不通
systemctl status sshd # 2. 服务起没起
ss -tlnp | grep 22 # 3. 端口听没听(没装 net-tools 用 ss)
逐层拆弹:
- 服务没装:
apt install ssh/openssh-server; - 起不来:先怀疑防火墙(Ubuntu
ufw disable)和 SELinux(setenforce 0临时关闭验证)——这两个”拦路虎”占一半的疑难杂症; - root 登不上:默认禁止 root 远程,改
/etc/ssh/sshd_config的PermitRootLogin yes后重启服务。
还有一个隐蔽坑:MySQL 曾因注册表/服务文件里服务名拼接错误多了非法参数导致自启动失效——现象像端口问题,根因是配置文件,遇到”服务莫名起不来”要去看服务定义本身。
0x02 源码编译 Nginx:为什么 systemctl 管不了它
# 依赖先行:gcc / make / pcre / zlib
./configure --prefix=/usr/local/nginx
make && make install
源码安装绕过了包管理器,也绕过了系统服务管理——/usr/lib/systemd/system/ 里根本没有它的 service 单元文件。课堂由此引出了 systemctl 的运行机制(这是本篇最值钱的知识点):
systemctl start nginx的本质是:systemd 读取xxx.service单元文件里的 ExecStart 路径,替你拉起进程;- 没有 service 文件 → systemctl 无从下手 → 只能手动执行
/usr/local/nginx/sbin/nginx启动; - 反过来,想纳入 systemd 管理就自己写一个 service 文件(课上后面用 Podman 跑服务时就现场写了一个);
- 验证启动成功的标准永远是看端口:
ss -tlnp | grep 80。
配置改完必须 reload:./nginx -s reload——改完不重启等于白改。
0x03 PHP-FPM:9000 端口联动
Nginx 只分发静态内容,PHP 请求要转发给 PHP-FPM:
- 修改
php-fpm.conf让它监听127.0.0.1:9000; - Nginx 的 server 块里把
.php请求fastcgi_pass 127.0.0.1:9000; - 排错第一招永远是
ss -tlnp | grep 9000看 FPM 活没活。
后来 Docker 环境里 PHP 版本不对,就是靠改回这里把流量从容器切回本地 9000 的——/usr/local/nginx/conf/nginx.conf 里指向哪个 9000,决定了 PHP 跑在谁身上。
0x04 MySQL/MariaDB 与 DVWA 部署
apt install mariadb-server
mysql_secure_installation # root 初始化
DVWA 部署三步:源码放 Web 根目录 → 改 config/config.inc.php 的数据库连接 → 访问 setup 页初始化。课堂现场踩的坑:
- 文件权限导致访问失败(Web 目录属主要对 www-data 可读);
- 版本兼容性地狱:Ubuntu 仓库 PHP 版本过高/过低都会让 DVWA 报 500——课堂从 phpStudy 低版本试到 MySQL 8.0 高版本来回横跳,最后结论是用 Docker 打包低版本 PHP 镜像最干净:环境不兼容时,把”降级环境”打成镜像,宿主机只留端口映射;
- MariaDB 与 MySQL 语法有差异,DVWA 初始化 SQL 报错时直接定位
database/下对应语句改写(先分析后动手,别让 AI 盲改); - 部署前给虚拟机拍快照——环境玩崩了能回滚,这是省命的教训。
0x05 Docker/Podman 入门定位
课程对容器的定位很务实:大三大二按需掌握,先会用再理解。
- 镜像拉取依赖网络,国内配镜像加速器;
docker装在/usr/local/bin/,命令行工具不暴露外部目录;- SQLi-labs 这类老靶场对 PHP 版本敏感,容器是标准的解法(compose 起服务 + 端口映射);
- 验证标准:
docker images能看到拉取的镜像即达标,容器运行留作自学。
0x06 服务管理的通用心智模型
把这篇的底层逻辑串起来:Linux 上一切服务 = 一个可执行文件 + 一份描述它的配置。
- 有 service 文件 → systemctl 管(systemd 拉起、自启、日志);
- 没 service 文件 → 手动跑二进制(源码安装路线);
- 自己写 service 文件 → 手动服务升级为托管服务;
- 判断服务活没活,永远
ss -tlnp看端口,别看进程名猜。
这个模型后面在 CS 服务端部署(Ubuntu + JDK + 手动启动 teamserver)、提权(服务路径劫持)里全都复用到了。
相关旧文
- 小皮面板搭建 DVWA(Windows 一键路线)
- Nginx Web 服务器完整配置
- Linux 计划任务