阿里云腾讯云服务器安装 AlmaLinux 8 从零开始配置 Nginx PHP MySQL 全流程实战指南
嗨,朋友,看到你这条标题,我大概能想象出你现在的状态——可能是刚买完服务器,看着那个黑漆漆的终端屏幕有点懵,或者之前在 Windows 上用 phpStudy 那种一键安装包用过,现在换了 Linux 突然发现什么都得自己动手。别担心,我也是这么过来的的,今天咱们就慢慢来,一步一步把这个 LNMP 环境搭好,保准你看完之后不仅能跑起来,还能明白每一步到底在干嘛。
先跟你聊聊 AlmaLinux 8 是什么,以及为什么选它
你可能听说过 CentOS、Ubuntu、Debian 这些发行版,AlmaLinux 说实话是比较新的选手了——它是 2021 年才出来的,目的很简单:CentOS 8 提前停止维护之后,大家需要一个可靠的、100% 兼容 RHEL(Red Hat Enterprise Linux)的替代品,AlmaLinux 就是为此而生的。它由 CentOS 的创始团队参与创建,背后还有个非营利组织在运营,稳定性不用担心。
选 AlmaLinux 8 的理由其实挺实在的:
- 长生命周期:支持到 2029 年,你不用折腾着升级系统
- 免费:和生产级的 RHEL 一模一样,但不要钱
- 包管理器用 dnf/yum:装软件很方便,命令简单
- 适合服务器:稳定性好,社区支持越来越强
好了,背景知道就行,咱们直接进入正题。
第一步:登录你的服务器
不管你是阿里云还是腾讯云,购买完成之后你会收到三样东西:公网 IP 地址、root 密码(或者密钥)。打开你电脑上的终端工具——Mac 和 Linux 用户直接用自带的 Terminal,Windows 用户推荐用 PuTTY 或者 Git Bash,也有很多人用 Xshell,看个人喜好。
在终端里输入:
ssh root@你的服务器IP地址
比如你的服务器 IP 是 43.138.72.15,那就输入:
ssh root@43.138.72.15
第一次登录会问你 Are you sure you want to continue connecting (yes/no/[fingerprint])?,输入 yes 回车。然后输入密码,注意 Linux 输入密码的时候屏幕上不会显示任何字符,连星号都没有,这是正常的,盲打完了直接回车就行。
登录成功后你会看到类似这样的提示符:
[root@almalinux ~]#
这就说明你已经在服务器上了,接下来的所有命令都在这个状态下执行。
小贴士:如果提示
Connection refused或者超时,先去云厂商的控制台看看安全组/防火墙规则,确认 22 端口(SSH 默认端口)已经放行了。阿里云在”安全组”里加规则,腾讯云在”安全组”里也类似操作,加一条入方向允许 TCP 22 端口就行。
第二步:系统更新和基础工具安装
登录进去之后,第一件事不是急着装 Nginx,而是先把系统更新一下,确保你拿到的是最新的补丁和软件包。
dnf update -y
这个 -y 的意思是”所有确认提示都自动选是”,不然它会停下来问你每个包要不要装,很麻烦。更新过程可能需要几分钟,取决于你的网络速度和包的数量。
更新完顺便装一些常用工具,后面会用到:
dnf install -y vim wget curl git net-tools epel-release
- vim:文本编辑器,用来改配置文件
- wget / curl:下载文件的工具
- git:版本控制工具,后续可能用到
- net-tools:包含
ifconfig、netstat等命令,排查网络问题用 - epel-release:Extra Packages for Enterprise Linux,装一些官方源没有的软件时需要它
注意:AlmaLinux 8 默认用
dnf而不是yum,不过yum命令实际上是个软链接,指向dnf,所以你在网上看到yum install也没问题,效果一样。
第三步:安装 Nginx
Nginx 是个高性能的 Web 服务器,处理静态文件的能力特别强,而且占用资源少,做反向代理也是一把好手。现在用它来搭建网站环境,基本是行业标配了。
3.1 安装 Nginx
dnf install -y nginx
装完之后,启动 Nginx 并设置为开机自启:
systemctl start nginx
systemctl enable nginx
start 是现在启动,enable 是设置开机自动启动,这两个都得做,不然重启服务器之后 Nginx 不会自己跑起来。
3.2 确认 Nginx 运行状态
systemctl status nginx
你应该能看到类似这样的输出,绿色的 active (running) 表示一切正常:
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2025-01-13 10:23:45 CST; 5min ago
Main PID: 12345 (nginx)
Tasks: 2 (limit: 11620)
Memory: 2.1M
CGroup: /system.slice/nginx.service
├─12345 nginx: master process /usr/sbin/nginx
└─12346 nginx: worker process
如果状态不是 active (running),可以用 journalctl -u nginx -n 20 查看最近 20 行日志来排查问题。
3.3 配置防火墙,开放 80 端口
AlmaLinux 8 用的是 firewalld 防火墙,默认只开放了 SSH(22端口),HTTP(80端口)还没开,需要手动加:
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
第一条是永久开放 HTTP 服务(80端口),第二条是 HTTPS(443端口),第三条是重新加载防火墙规则让修改生效。
3.4 浏览器访问测试
现在打开你电脑上的浏览器,在地址栏输入 http://你的服务器IP,如果你看到 Nginx 的欢迎页面,上面写着 “Welcome to nginx!” 之类的字样,那就说明 Nginx 安装成功了!
常见问题:如果浏览器打不开,首先检查云厂商控制台的安全组,确认入方向有允许 TCP 80 和 443 端口的规则。很多人卡在第一步就是因为忘了这里。
第四步:安装 MySQL(MariDB)
说到数据库,很多人第一反应是 MySQL,但在 AlmaLinux 8(以及 CentOS/RHEL 系列)里,默认的软件源里提供的是 MariaDB,它是 MySQL 的一个分支,由 MySQL 的原作者维护,完全兼容 MySQL 的协议和命令。你可以把它理解为 MySQL 的一个”升级版平替”,用起来几乎没有区别,而且对商业软件更友好。
4.1 安装 MariaDB
dnf install -y mariadb-server mariadb
装完之后启动并设置开机自启:
systemctl start mariadb
systemctl enable mariadb
4.2 运行安全初始化脚本
MariaDB 刚装好之后有个默认的 root 用户,密码是空的,这很不安全。官方提供了一个安全脚本帮你设置密码、删除匿名用户、禁止远程 root 登录等:
mysql_secure_installation
运行后会弹出一连串问题,一个个来:
VALIDATE PASSWORD COMPONENT can be used to test password security.
Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: N
密码强度验证组件不用开,选 N,不然你后面设的密码可能太简单不被允许。
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
删除匿名用户,选 Y。
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
禁止 root 远程登录,选 Y,安全起见。
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
删除测试数据库,选 Y。
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
重新加载权限表,选 Y。
4.3 登录数据库验证
mysql -u root -p
输入你刚才设置的 root 密码,进入 MariaDB 命令行后,输入:
SHOW DATABASES;
如果你能看到 information_schema、mysql、performance_schema 这些数据库列表,说明 MariaDB 正常工作了。输入 exit; 退出。
第五步:安装 PHP 8.x
AlmaLinux 8 默认的 AppStream 软件源里自带 PHP 7.2,但这个版本太老了,很多现代 PHP 框架和库都不再支持。咱们来装一个更新一点的版本——PHP 8.1 或者 8.2,通过 REMI 仓库来安装。
5.1 启用 REMI 仓库
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
然后启用 PHP 8.1 的模块:
dnf module reset php -y
dnf module enable php:remi-8.1 -y
如果你想装 PHP 8.2,把上面的
remi-8.1改成remi-8.2就行。
5.2 安装 PHP 和相关扩展
dnf install -y php php-fpm php-mysqlnd php-gD php-mbstring php-xml php-curl php-zip php-intl php-json php-opcache
这里装的不只是 PHP 本体,还有一堆常用扩展:
- php-fpm:PHP FastCGI 进程管理器,Nginx 需要它来解析 PHP
- php-mysqlnd:PHP 连接 MySQL/MariaDB 的驱动
- php-gd:图像处理,做验证码、缩略图需要
- php-mbstring:多字节字符串支持,处理中文很重要
- php-xml:XML 解析,WordPress 等很多程序需要
- php-curl:发送 HTTP 请求
- php-zip:解压 zip 文件
- php-intl:国际化支持
- php-opcache:OPcode 缓存,提升 PHP 性能的关键
5.3 启动 PHP-FPM
systemctl start php-fpm
systemctl enable php-fpm
systemctl status php-fpm
确认状态是 active (running)。
第六步:配置 Nginx 和 PHP-FPM 协同工作
这一步是最关键的,也是很多新手卡住的地方。Nginx 本身不会处理 PHP 文件,它需要把 PHP 请求转发给 PHP-FPM,PHP-FPM 执行完再返回结果给 Nginx,Nginx 再吐给浏览器。这个”转发”配置写在哪里呢?写在一个叫 vhost(虚拟主机) 的配置文件里。
6.1 创建网站目录
mkdir -p /var/www/html/your-site
把 your-site 换成你自己的域名或者项目名,比如 myblog。
然后放一个测试用的 PHP 文件进去:
echo '<?php phpinfo(); ?>' > /var/www/html/your-site/info.php
phpinfo() 是 PHP 的一个内置函数,会输出当前 PHP 环境的所有配置信息,非常适合用来验证 PHP 是否工作正常。
6.2 设置目录权限
chown -R nginx:nginx /var/www/html/your-site
chmod -R 755 /var/www/html/your-site
把目录的属主改成 nginx,这样 Nginx 进程有权限读写网站文件。
6.3 编写 Nginx 虚拟主机配置
AlmaLinux 8 的 Nginx 配置文件在 /etc/nginx/ 目录下,里面有 nginx.conf 主配置文件和 conf.d/ 目录。我们通常在 conf.d/ 里放自己的站点配置,这样不容易搞乱主配置。
vim /etc/nginx/conf.d/your-site.conf
把以下内容复制进去:
server {
listen 80;
server_name your-domain.com www.your-domain.com;
root /var/www/html/your-site;
index index.php index.html index.htm;
# 日志配置
access_log /var/log/nginx/your-site-access.log;
error_log /var/log/nginx/your-site-error.log;
# 默认入口文件
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 文件处理
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问隐藏文件(如 .git、.env)
location ~ /\. {
deny all;
}
# 静态文件缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|pdf)$ {
expires 7d;
add_header Cache-Control "public, immutable";
}
}
关键点解释:
listen 80:监听 80 端口server_name:你的域名,如果是测试可以先留着,或者改成你的 IProot:网站的根目录try_files:先尝试找文件,找不到就转发给index.php,这是 WordPress 等框架友好的写法fastcgi_pass 127.0.0.1:9000:把 PHP 请求转发给本地的 PHP-FPM(默认监听 9000 端口)fastcgi_param SCRIPT_FILENAME:这行特别重要,告诉 PHP 要找哪个文件,少了这行 PHP 会报 404
6.4 测试配置并重启 Nginx
在重启之前,先测试一下配置文件有没有语法错误:
nginx -t
如果你看到:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
那就没问题了,然后重启 Nginx:
systemctl restart nginx
6.5 浏览器访问验证
在浏览器里访问 http://你的服务器IP/info.php,如果你看到一个巨大的 PHP 配置信息页面,上面有 PHP 版本、已加载的扩展、服务器信息等等,那就说明 Nginx + PHP-FPM 已经完全联通了!
第七步:配置 PHP-FPM 以配合 Nginx
默认情况下,PHP-FPM 是用 www-data 用户运行的,但 Nginx 在 AlmaLinux 上用的是 nginx 用户,这两个不一样会导致文件权限问题。我们需要把 PHP-FPM 的进程用户改成和 Nginx 一致。
vim /etc/php-fpm.d/www.conf
找到这两行:
user = apache
group = apache
改成:
user = nginx
group = nginx
同时也把监听方式确认一下,找到:
listen = /run/php-fpm/www.sock
或者:
listen = 127.0.0.1:9000
两种都行,刚才 Nginx 配置里我们用的 127.0.0.1:9000,所以确保这里是 IP+端口的方式。改成之后保存退出,然后重启 PHP-FPM:
systemctl restart php-fpm
第八步:创建数据库和用户(实战示例)
光有环境还不够,咱们来实际操作一下,创建一个数据库和一个普通用户,模拟一个真实的项目场景。
mysql -u root -p
输入密码进入数据库后,依次执行:
-- 创建数据库,指定 UTF-8 编码
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建专用用户,限制只能从本地登录
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY '你的强密码';
-- 授权用户访问这个数据库
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 验证
SHOW DATABASES;
EXIT;
安全建议:生产环境不要用
root账户连接应用程序,一定要创建专用用户,最小权限原则。密码要够强,大小写字母+数字+特殊字符,至少 12 位。
第九步:安装 PHPMyAdmin(可选但推荐)
如果你不想每次都用命令行操作数据库,可以装一个 PHPMyAdmin,一个网页版的数据库管理工具。
cd /tmp
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
tar -xzf phpMyAdmin-latest-all-languages.tar.gz
mv phpMyAdmin-*-all-languages /var/www/html/phpmyadmin
chown -R nginx:nginx /var/www/html/phpmyadmin
chmod -R 755 /var/www/html/phpmyadmin
然后给 Nginx 加一个 PHPMyAdmin 的 location 配置:
vim /etc/nginx/conf.d/phpmyadmin.conf
server {
listen 8080;
server_name _;
root /var/www/html/phpmyadmin;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
重启 Nginx:
systemctl restart nginx
然后开放 8080 端口:
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
浏览器访问 http://你的服务器IP:8080,用刚才创建的 myapp_user 登录就能管理数据库了。
安全提醒:生产环境不建议直接用默认路径暴露 PHPMyAdmin,可以改端口、加 IP 白名单、或者用 HTTPS 保护。
第十步:配置 HTTPS(Let’s Encrypt 免费证书)
现在你的网站是 HTTP 的,数据明文传输,不太安全。咱们来给网站加上 HTTPS 加密,用的是 Let’s Encrypt 的免费证书,通过 Certbot 来自动申请和续签。
10.1 安装 Certbot
dnf install -y certbot python3-certbot-nginx
10.2 申请证书
certbot --nginx -d your-domain.com -d www.your-domain.com
过程中会问你邮箱地址(用于收证书到期提醒)和是否同意条款,照着提示操作就行。Certbot 会自动修改 Nginx 配置,把 HTTP 重定向到 HTTPS,并配置好证书路径。
如果你还没有域名,可以用 http://你的IP 先测试,等有了域名再补上 HTTPS。
10.3 设置自动续签
Let’s Encrypt 的证书有效期是 90 天,但 Certbot 可以自动续签。检查定时任务是否已创建:
systemctl list-timers | grep certbot
应该能看到类似的输出:
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2025-04-13 ... ... ... certbot-renew.timer certbot-renew.service
如果没有,手动启用:
systemctl enable --now certbot-renew.timer
第十一步:项目部署示例(以 WordPress 为例)
环境都配好了,咱们来实际部署一个 WordPress 站点,感受一下整个流程。
# 进入网站目录
cd /var/www/html/your-site
# 下载 WordPress(中文版)
wget https://cn.wordpress.org/wordpress-latest-zh_CN.tar.gz
tar -xzf wordpress-latest-zh_CN.tar.gz
mv wordpress/* .
rm -rf wordpress wordpress-latest-zh_CN.tar.gz
# 设置权限
chown -R nginx:nginx /var/www/html/your-site
find /var/www/html/your-site -type d -exec chmod 755 {} \;
find /var/www/html/your-site -type f -exec chmod 644 {} \;
然后打开浏览器访问 http://你的服务器IP,你会看到 WordPress 的安装向导页面。按照提示填写:
- 数据库名:
myapp_db - 用户名:
myapp_user - 密码:你之前设置的密码
- 数据库主机:
localhost - 表前缀:
wp_(默认就行)
点击提交,完成安装,然后你就能看到一个完整的 WordPress 站点跑起来了。
第十二步:常用运维命令汇总
环境跑起来之后,一些日常操作你也得会:
# 查看各服务状态
systemctl status nginx
systemctl status php-fpm
systemctl status mariadb
# 启动/停止/重启服务
systemctl start/stop/restart nginx
systemctl start/stop/restart php-fpm
systemctl start/stop/restart mariadb
# 设置开机自启
systemctl enable nginx php-fpm mariadb
# 查看防火墙规则
firewall-cmd --list-all
# 查看 Nginx 错误日志(遇到问题先看这个)
tail -f /var/log/nginx/error.log
# 查看 PHP-FPM 日志
tail -f /var/log/php-fpm/error.log
# 查看 MariaDB 日志
tail -f /var/log/mariadb/mariadb.log
# 检查 PHP 版本
php -v
# 检查 Nginx 版本
nginx -v
# 检查 MariaDB 版本
mysql -V
第十三步:常见问题排查
问题一:访问 PHP 文件直接下载而不是执行
这说明 Nginx 没有把 PHP 请求转发给 PHP-FPM。检查 Nginx 配置文件里的 location ~ \.php$ 块,确认 fastcgi_pass 指向了正确的地址,且 PHP-FPM 正在运行:
systemctl status php-fpm
ss -tlnp | grep 9000
问题二:502 Bad Gateway
通常是 PHP-FPM 没启动或者端口不对。先确认 PHP-FPM 在跑,再看 Nginx 配置里 fastcgi_pass 和 PHP-FPM 实际监听的地址是否一致。
问题三:PHP 页面报 “Permission denied”
文件权限问题。确保网站目录的属主是 nginx:nginx:
chown -R nginx:nginx /var/www/html/your-site
问题四:数据库连接失败
检查 MariaDB 是否在运行,以及用户密码是否正确:
mysql -u myapp_user -p -h localhost
如果本地能连但远程连不上,可能是用户权限问题,确认创建用户时主机是 localhost 而不是 %。
问题五:中文显示乱码
数据库和表没有用正确的字符集。建库时指定 utf8mb4:
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
写在最后
到这里,你的 AlmaLinux 8 服务器就已经拥有了完整的 Nginx + PHP + MySQL 环境,从系统更新到 HTTPS 配置,从数据库安全到实际项目部署,每一步都走完了。
你可能会觉得步骤有点多,但放心,第一次花点时间把这些都跑通之后,后续再部署新项目就快多了。整个环境搭好之后,你甚至可以把它当成一个模板,以后买新服务器直接照着做,一遍下来也就半个多小时的事。
如果你在某个步骤卡住了,别急着放弃,把错误信息复制出来仔细看看,大部分问题在网上都能找到答案。云服务器环境搭建这回事,本质上就是把一堆小任务串联起来,一个一个解决就好了。
祝你玩得开心,有啥问题随时来问。
