在 CentOS Stream 9 上搭建 Web 服务,核心思路与传统的 CentOS 7/8 或 Ubuntu 有显著不同。主要区别在于:默认包管理器从 yum 变为 dnf,且 Firewalld 和 SELinux 的策略更加严格。
作为新手,最稳妥、最易维护的方案是使用 Nginx + PHP (FPM) 或 Apache (httpd)。鉴于 Nginx 在高并发场景下的优势及国内主流云厂商的推荐配置习惯,以下以 Nginx 为例,提供一套标准、合规的生产环境配置流程。
一、前置准备:系统初始化与安全基线
-
更新系统
sudo dnf update -y -
配置防火墙(Firewalld)
CentOS Stream 9 默认启用 firewalld。需开放 HTTP (80) 和 HTTPS (443) 端口:sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload -
SELinux 处理建议
- 生产环境:不建议直接禁用 SELinux。应学习使用
semanage fcontext和restorecon正确设置上下文。 - 新手测试环境:可临时设为 permissive 模式避免权限报错:
sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 生产环境:不建议直接禁用 SELinux。应学习使用
二、安装 Nginx
CentOS Stream 9 的 AppStream 仓库中已包含稳定版 Nginx。
sudo dnf install nginx -y
启动并设置开机自启:
sudo systemctl enable nginx --now
验证安装:
curl http://localhost
# 应返回 HTML 页面内容
注意:不要随意添加第三方 EPEL 或 Remi 仓库除非必要,官方仓库版本经过充分测试,稳定性更高。
三、安装 PHP(以 PHP-FPM 为例)
Web 服务器需要动态内容时,通常通过 FastCGI 协议与 PHP-FPM 通信。
1. 安装 PHP 及相关模块
根据需求选择版本(当前最新稳定为 PHP 8.2 或 8.3)。此处以通用模块为例:
sudo dnf install php php-fpm php-mysqlnd php-gd php-mbstring php-xml php-json -y
2. 启动 PHP-FPM
sudo systemctl enable php-fpm --now
3. 关键配置:修改用户组
默认情况下,Nginx 运行用户是 nginx,PHP-FPM 运行用户是 apache(在某些发行版中)或 php-fpm。必须确保两者能协同工作。
编辑 /etc/php-fpm.d/www.conf:
user = nginx
group = nginx
重启 PHP-FPM 使配置生效:
sudo systemctl restart php-fpm
为什么改为用户 nginx?
因为 Nginx 需要以相同用户身份访问 PHP-FPM 的 socket 文件,避免权限拒绝(Permission Denied)。
四、配置 Nginx 虚拟主机(Virtual Host)
创建站点目录和配置文件:
1. 创建网站根目录
sudo mkdir -p /var/www/html/example.com/public_html
sudo chown -R nginx:nginx /var/www/html/example.com
sudo chmod -R 755 /var/www/html/example.com
2. 编写测试文件
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/example.com/public_html/index.php
3. 创建 Nginx 配置文件
新建 /etc/nginx/conf.d/example.com.conf:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html/example.com/public_html;
index index.php index.html;
# 日志路径
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
# 静态资源缓存
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# PHP 处理
location ~ .php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock; # 注意:此路径可能与你的系统略有差异
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问隐藏文件
location ~ /. {
deny all;
}
}
4. 测试配置并重载 Nginx
sudo nginx -t
sudo systemctl reload nginx
五、验证与服务管理
-
浏览器访问
打开http://your_server_ip/index.php,应显示 PHP 信息页。 -
常用命令速查
# 查看服务状态 systemctl status nginx systemctl status php-fpm # 查看日志(排查问题必备) tail -f /var/log/nginx/error.log journalctl -u php-fpm -f -
安全加固建议
- 禁用危险函数:在
php.ini中注释掉disable_functions中的高危函数(如exec,shell_exec,system等)。 - 限制上传大小:调整
upload_max_filesize和post_max_size。 - HTTP 强制跳转 HTTPS:若后续配置 SSL,可在 Nginx 中添加
return 301 https://$host$request_uri;。
- 禁用危险函数:在
六、常见问题与排错指南
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 403 Forbidden | 权限错误 | 检查 chown -R nginx:nginx /var/www;确认 SELinux 未阻止 |
| 502 Bad Gateway | PHP-FPM 未启动或连接失败 | 检查 php-fpm.service 状态;确认 fastcgi_pass 指向正确的 socket |
| 空白页 | PHP 解析失败 | 检查 Nginx 配置中 location ~ .php$ 是否正确包含 fastcgi_params |
| 无法访问网络 | 防火墙/安全组 | 检查云服务器控制台的安全组规则是否放行 80/443 端口 |
七、进阶建议(面向生产环境)
-
使用 Let’s Encrypt 免费 SSL 证书
安装certbot自动签发证书,实现 HTTPS:sudo dnf install certbot python3-certbot-nginx -y sudo certbot --nginx -d example.com -
考虑使用容器化部署
对于新项目,推荐使用 Docker + Docker Compose 部署 LEMP/LAMP 栈,便于迁移和环境一致性。 -
备份策略
定期备份数据库和网站文件至对象存储(如阿里云 OSS、腾讯云 COS),避免单点故障。
总结
在 CentOS Stream 9 上搭建 Web 服务的核心要点是:
- 使用
dnf而非yum - 正确处理 Firewalld 和 SELinux 权限
- 统一 Nginx 与 PHP-FPM 的运行用户
- 规范配置 虚拟主机 和 PHP 解析块
遵循上述步骤,即可构建一个稳定、安全的 Web 服务基础架构。如需进一步优化性能或安全性,可结合 CDN、WAF 及监控工具进行扩展。
CLOUD云枢