中文

在 AlmaLinux 9 Linux VPS 上安装 LEMP 环境

1 min
VPS/VDS 主机

LEMP(Linux、Nginx、MariaDB、PHP-FPM)是托管 PHP 网站时替代 Apache 的快速轻量方案。在 AlmaLinux 9 上,所有软件都来自官方 AppStream 仓库,但 SELinux 和 firewalld 需要稍加留意。本指南将带你在 VPS Linux Infrawire 上完成一次干净的安装;相同步骤同样适用于 Rocky Linux 9。

📋 前提条件

  • 一台运行 AlmaLinux 9 的 KVM VPS(IP 和 root 密码可在客户区查看)
  • 以 root 身份通过 SSH 登录
  • 一个指向 VPS_IP 的域名 example.com

1. 更新系统并安装工具

Bash
dnf -y update dnf -y install nano policycoreutils-python-utils

policycoreutils-python-utils 提供 semanage,SELinux 一节会用到。

2. 安装 Nginx 并开放防火墙

Bash
dnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services

3. 安装 MariaDB

Bash
dnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation

按向导提示设置 root 密码、删除匿名用户、禁止 root 远程登录并删除测试数据库。然后创建专用的数据库和用户:

Bash
mysql -u root -p
SQL
1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;

4. 通过 AppStream 模块安装 PHP 8.3

AppStream 提供多个 PHP 流。安装前先选定所需版本:

Bash
dnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v

默认情况下 PHP-FPM 进程池以 apache 用户运行。由于 Nginx 以 nginx 用户运行,请统一进程池和会话目录的所属用户:

Bash
sed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm

进程池监听 Unix 套接字 /run/php-fpm/www.sock。

5. 创建 server block

Bash
mkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bash
nginx -t && systemctl reload nginx

6. 配置 SELinux

请让 SELinux 保持 enforcing 模式(用 getenforce 查看)。在 /var/www 下新建的文件会自动获得 httpd_sys_content_t 标签,但从别处用 mv 移入的文件会保留旧标签。重新打标签,并且只给确实需要写入的目录开放写权限:

Bash
restorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads

仅在应用确实需要时才启用布尔值:

Bash
# PHP 通过 TCP 连接数据库(远程服务器或 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # PHP 或 Nginx 发起对外连接(API、proxy_pass 到某个应用) setsebool -P httpd_can_network_connect 1

通过套接字访问的本机 MariaDB 两者都不需要。想查看 SELinux 拦截了什么,运行 ausearch -m avc -ts recent。切勿用 setenforce 0 来“解决”问题。

7. 测试 PHP 并删除测试文件

Bash
echo '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php

应返回 HTTP/1.1 200 OK。phpinfo() 页面会暴露你的配置,请立即删除。最后检查各服务状态:

Bash
systemctl is-active nginx php-fpm mariadb

🛠️ 故障排查

502 Bad Gateway。 PHP-FPM 已停止,或 fastcgi_pass 中的套接字路径有误。运行 systemctl status php-fpm,检查 ls -l /run/php-fpm/www.sock,并查看 /var/log/nginx/error.log。如果日志提示套接字 Permission denied,请用 ausearch 查找 AVC 拒绝记录。

403 Forbidden 或 Permission denied。 用 ls -Z /var/www/example.com/public 检查属主(nginx:nginx)和 SELinux 标签,应为 httpd_sys_content_t;否则运行 restorecon -Rv。

“File not found.” 或空白页。 root 路径或 SCRIPT_FILENAME 行有误。检查这两处,然后运行 nginx -t。

无法连接外部数据库或 API。 SELinux 默认拦截对外连接:按上文启用 httpd_can_network_connect_db 或 httpd_can_network_connect。


🎉 Nginx、MariaDB 和 PHP-FPM 已在 AlmaLinux 9 上运行,SELinux 仍保持 enforcing 模式。

及时了解最新的优惠、折扣和特别促销活动。

查看促销

我们使用Cookie

我们使用分析性Cookie来改善您在我们网站上的体验。数据不会出售给第三方。了解更多请查看我们的 隐私政策.