4. HTTP/HTTPS启动服务器
网络启动环境里,HTTP/HTTPS服务器扮演的角色很关键。说白了,它就是负责把启动文件(vmlinuz、initrd.img、pxelinux.0这些)通过网络分发给客户端。我这些年折腾下来,发现很多人卡在这一步——服务器配好了,但就是启动不起来。其实问题往往出在几个小细节上。
4.1 为什么选Nginx或Apache?
我个人习惯用Nginx做PXE启动服务器。为什么?因为它轻量、并发能力强,而且配置语法简洁。Apache当然也能用,功能更全,但如果你只是做网络启动,Nginx完全够用。
我记得有一次给一个学校搭建批量装机环境,200台机器同时启动,Nginx稳如老狗,CPU占用不到10%。换成Apache的话,你得调优MPM参数,不然很容易撑爆内存。
核心原则:网络启动服务器不需要花哨的功能,稳定、高效、配置简单才是王道。
4.2 文件目录结构设计
目录结构这事,看似简单,但坑不少。我见过有人把所有文件堆在根目录下,结果维护时想死的心都有。下面是我常用的结构:
/var/www/html/
├── pxeboot/ # PXE启动根目录
│ ├── bios/ # BIOS启动文件
│ │ ├── pxelinux.0
│ │ ├── ldlinux.c32
│ │ ├── vesamenu.c32
│ │ └── pxelinux.cfg/
│ │ └── default
│ ├── efi/ # UEFI启动文件
│ │ ├── bootx64.efi
│ │ ├── grubx64.efi
│ │ └── grub.cfg
│ ├── images/ # 系统镜像文件
│ │ ├── centos7/
│ │ │ ├── vmlinuz
│ │ │ └── initrd.img
│ │ └── ubuntu20/
│ │ ├── vmlinuz
│ │ └── initrd.img
│ └── ks/ # Kickstart应答文件
│ └── centos7.ks
└── logs/ # 日志目录(软链接到/var/log/nginx)
你想想看,这样分层之后,找文件是不是一目了然?BIOS和UEFI分开,不同系统镜像分开,维护起来特别方便。
小技巧:我习惯把pxelinux.cfg目录权限设为755,但里面的default文件设为644。这样既能保证客户端读取,又防止误修改。
4.3 Nginx配置实战
Nginx配置其实不复杂,但有几个关键点必须注意。先看一个完整的配置示例:
server {
listen 80;
server_name pxeboot.local;
# PXE启动根目录
root /var/www/html/pxeboot;
# 开启目录列表(调试时很有用)
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
# 关键:禁用访问日志中的某些请求
location /pxeboot/ {
# 允许TFTP风格的请求
if ($request_method = GET) {
# 处理pxelinux.cfg请求
rewrite ^/pxeboot/(.*)$ /$1 break;
}
# 设置正确的MIME类型
types {
application/octet-stream 0;
text/plain cfg ks;
}
}
# 日志配置
access_log /var/log/nginx/pxe_access.log main;
error_log /var/log/nginx/pxe_error.log warn;
# 安全配置
location ~ \.ks$ {
# Kickstart文件可能包含密码,限制访问
allow 192.168.1.0/24;
deny all;
}
}
嗯,这里要注意autoindex on这个配置。调试阶段开着它,你能直接看到目录结构,方便排查文件路径问题。但生产环境建议关掉,避免暴露目录结构。
4.4 Apache配置要点
如果你非要用Apache,也不是不行。配置思路类似,但语法不同:
<VirtualHost *:80>
ServerName pxeboot.local
DocumentRoot /var/www/html/pxeboot
<Directory /var/www/html/pxeboot>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
# 添加正确的MIME类型
AddType application/octet-stream .0
AddType text/plain .cfg .ks
</Directory>
# 日志配置
CustomLog ${APACHE_LOG_DIR}/pxe_access.log combined
ErrorLog ${APACHE_LOG_DIR}/pxe_error.log
# 限制Kickstart文件访问
<FilesMatch "\.ks$">
Require ip 192.168.1.0/24
</FilesMatch>
</VirtualHost>
我曾经在Apache上踩过一个坑:默认的AllowOverride是All,结果某个子目录里的.htaccess文件把权限搞乱了,导致客户端一直拿不到文件。所以建议你显式设置AllowOverride None。
4.5 权限管理——最容易翻车的地方
权限问题,说白了就是「谁可以读、谁可以写」。网络启动场景下,客户端只需要读取权限,但很多人把权限设得太死。
| 文件/目录 | 建议权限 | 所有者 | 说明 |
|---|---|---|---|
| /var/www/html/pxeboot/ | 755 | root:root | 目录本身,可读可执行 |
| pxelinux.0, vmlinuz等 | 644 | root:root | 普通文件,只读即可 |
| pxelinux.cfg/ | 755 | root:root | 目录,需要可执行才能进入 |
| default配置文件 | 644 | root:root | 配置文件,只读 |
| Kickstart文件 | 600 | root:root | 可能包含密码,严格限制 |
注意:千万不要把文件权限设成777!我曾经见过有人图省事直接chmod -R 777,结果被扫描到敏感文件,整个内网都被拖了一遍。安全无小事。
4.6 日志分析——排查问题的利器
日志这东西,平时没人看,出问题时就成救命稻草了。Nginx的访问日志格式默认是这样的:
192.168.1.100 - - [10/Oct/2023:14:23:45 +0800] "GET /pxeboot/bios/pxelinux.0 HTTP/1.1" 200 26784 "-" "Wget/1.21"
我一般关注这几个字段:
- 客户端IP:谁在请求?是不是预期的机器?
- 请求路径:文件路径对不对?有没有拼写错误?
- 状态码:200正常,404文件不存在,403权限拒绝
- 文件大小:传输是否完整?
举个例子,如果看到大量404错误,八成是路径配置错了。我遇到过最奇葩的一次,是客户端请求/pxeboot/pxelinux.0,但服务器上文件实际在/pxeboot/bios/pxelinux.0。这就是目录结构没对齐。
错误日志同样重要。Nginx的错误日志会记录权限问题、配置错误等:
2023/10/10 14:25:01 [error] 12345#0: *678 open() "/var/www/html/pxeboot/bios/pxelinux.0" failed (13: Permission denied)
看到Permission denied,直接去检查文件权限和SELinux上下文。嗯,SELinux也是个坑,后面会专门讲。
4.7 调试技巧汇总
最后分享几个我常用的调试命令:
# 测试Nginx配置是否正确
nginx -t
# 查看实时访问日志
tail -f /var/log/nginx/pxe_access.log
# 模拟客户端请求
curl -I http://192.168.1.10/pxeboot/bios/pxelinux.0
# 检查文件权限
ls -la /var/www/html/pxeboot/bios/
# 查看SELinux上下文
ls -Z /var/www/html/pxeboot/bios/
说白了,网络启动服务器配置不难,但细节决定成败。目录结构清晰、权限设置合理、日志监控到位,这三样做好了,基本不会出大问题。
一句话总结:HTTP启动服务器就是「文件放对位置、权限设对级别、日志看对地方」。做到这三点,你的PXE环境就稳了。
可可精品资料库