说实话,第一次买云服务器的时候,我对着密密麻麻的控制台菜单愣是看了十分钟,不知道该点哪里。现在回想起来,AlmaLinux 9 是个非常聪明的选择——它是 RHEL 9 的 1:1 二进制兼容发行版,意思就是你在 RHEL 上能跑的东西,在 AlmaLinux 9 上都能跑,但它完全免费,没有订阅费,社区活跃,稳定性还特别硬。下面我把整个流程拆碎了讲,哪怕你是刚接触 Linux 的小白,也能跟着一步步把环境搭起来。
选对镜像:别让第一步就踩坑
登录阿里云控制台后,创建实例的第一步就是选镜像。这里有个细节很多人会忽略:AlmaLinux 9 有多个版本,包括标准版(x86_64)和 ARM64 版。如果你选的是通用的 ECS 实例(比如 ecs.g7.xlarge),选 x86_64 即可;如果你用的是算能或者某些新型号的实例,才需要考虑 ARM64。
在镜像列表中搜索 “AlmaLinux”,你会看到官方提供的镜像,也有第三方发布的。建议优先选择 AlmaLinux Official 提供的镜像,发布日期越新越好,因为新版通常集成了最新的安全补丁。不要图省事选那些 “一键部署 LAMP” 的预装镜像,那些镜像里塞了一堆你根本用不到的服务,反而增加攻击面。
选完镜像后,记得勾选 云盘加密 和 自动快照策略,这两个选项在数据安全方面几乎是零成本的高回报投入。云盘加密确保即使硬盘物理被盗,数据也无法读取;自动快照则让你在误操作后还能后悔药吃。
安全组配置:先开门,再上锁
很多新手在创建完实例后直接尝试 SSH 连接,结果发现连不上,折腾半天才发现是安全组没放行端口。阿里云的安全组相当于云服务器的虚拟防火墙,必须在创建实例时就规划好。
在创建实例的第三步 “配置安全组” 里,建议新建一个安全组,然后添加以下规则:
- 入方向:允许 TCP 协议的 22 端口(SSH)、80 端口(HTTP)、443 端口(HTTPS)
- 出方向:全部允许(默认就是全部允许)
这里有个实战技巧:如果你只是临时测试,可以把 22 端口限制为你的公网 IP,而不是开放的 0.0.0.0/0。操作方法是把来源写成你的当前公网 IP,阿里云控制台有 “当前 IP” 的快捷按钮。这样即使密码被爆破,攻击者也不知道你的 IP,安全系数直线上升。
另外,强烈建议开启 实例RAM角色,给服务器绑定一个最小权限的 RAM 角色,这样服务器内部访问阿里云其他服务(比如 OSS、RDS)时,不需要硬编码 AccessKey,而是通过实例角色自动获取临时凭证,从根本上杜绝密钥泄露风险。
SSH 连接:告别密码登录的暴力破解
默认情况下,阿里云会给你一个初始密码,通过 VNC 远程连接或者 SSH 登录。但用密码登录是极其不安全的,因为你的密码再复杂,也比不上暴力破解工具的迭代速度。我见过太多朋友因为用了弱密码,服务器第二天就被植入挖矿病毒。
正确的做法是使用 SSH 密钥对。在阿里云控制台的 “SSH 密钥” 页面,点击 “创建密钥对”,选择生成的方式(本地生成或在线生成),下载私钥文件并妥善保管。私钥一旦丢失无法恢复,所以务必备份到多个安全位置。
创建实例时,在 “登录凭证” 阶段选择 “SSH 密钥”,并绑定刚才创建的密钥对。这样实例创建成功后,你就只能用私钥登录,密码登录自动失效。
连接命令长这样:
ssh -i ~/.ssh/alma_key.pem root@你的公网IP
如果提示权限错误,记得修正私钥权限:
chmod 600 ~/.ssh/alma_key.pem
登录进去后,第一件事就是修改 root 登录策略。编辑 SSH 配置文件:
sudo vi /etc/ssh/sshd_config
找到这几行,做如下修改:
PermitRootLogin prohibit-password # 允许 root 用密钥登录,禁止密码登录
PasswordAuthentication no # 彻底关闭密码认证
PubkeyAuthentication yes # 确保公钥认证开启
X11Forwarding no # 关闭 X11 转发,减少攻击面
修改完成后重启 SSH 服务:
sudo systemctl restart sshd
重要提醒:在关闭密码登录之前,务必确保你的密钥已经配置好并且能正常登录!最好新开一个终端窗口测试一下,别把现在的会话搞断了。
系统初始化:把基础打牢
AlmaLinux 9 基于 systemd,包管理器是 dnf。登录后的第一件事,更新整个系统:
sudo dnf update -y
这个过程可能需要几分钟,取决于你的网络带宽和镜像源速度。如果下载速度特别慢,可以考虑更换镜像源。比如换成阿里内部的镜像源,速度会快很多:
sudo cp /etc/yum.repos.d/AlmaLinux.repo /etc/yum.repos.d/AlmaLinux.repo.bak
sudo sed -i 's|mirrors.aliyun.com|mirrors.aliyuncs.com|g' /etc/yum.repos.d/AlmaLinux.repo
sudo dnf makecache
接下来安装一些基础工具,这些工具在后续配置中几乎都会用到:
sudo dnf install -y vim git curl wget net-tools telnet firewalld policycoreutils-python-utils
防火墙方面,AlmaLinux 9 默认使用 firewalld。启用并设置开机自启:
sudo systemctl enable --now firewalld
查看当前开放的端口:
sudo firewall-cmd --list-all
根据需要开放端口,比如开放 HTTP 和 HTTPS:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
安装 NGINX:比 Apache 更轻量的选择
为什么选 NGINX 而不是 Apache?简单说,NGINX 在处理并发连接时内存占用更低,配置更简洁,而且做反向代理和负载均衡天生就比 Apache 顺手。当然,这不代表 Apache 不好,只是对于大多数 Web 应用场景,NGINX 是更现代的选择。
安装 NGINX:
sudo dnf install -y nginx
启动并设置开机自启:
sudo systemctl enable --now nginx
查看 NGINX 版本和状态:
nginx -v
sudo systemctl status nginx
这时候打开浏览器,访问 http://你的公网IP,应该能看到 NGINX 的欢迎页面。如果看不到,十有八九是防火墙或者安全组没放行 80 端口。
NGINX 的配置文件在 /etc/nginx/nginx.conf,站点配置文件在 /etc/nginx/conf.d/。默认的配置文件已经做得不错,但建议稍作优化。编辑主配置文件:
sudo vi /etc/nginx/nginx.conf
在 http 块中添加或修改以下参数,提升安全性和性能:
http {
# 隐藏 NGINX 版本号,防止信息泄露
server_tokens off;
# 启用 Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
application/x-javascript application/xml+rss application/json;
# 限制请求大小,防止大文件上传攻击
client_max_body_size 10m;
# 超时设置,防止慢连接攻击
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
}
修改完成后测试配置是否正确:
sudo nginx -t
如果输出 syntax is ok 和 test is successful,就可以重启 NGINX 让配置生效:
sudo systemctl restart nginx
安装 MySQL:MariaDB 是更友好的选择
这里需要做一个选择:装 MySQL 还是 MariaDB?虽然名字像,但它们是两家不同的公司维护的。MySQL 现在是 Oracle 的,商业版很贵;MariaDB 是 MySQL 原作者创建的分叉,完全开源免费,API 兼容 MySQL,大多数情况下可以无缝替换。
在 AlmaLinux 9 上,MariaDB 是默认的数据库服务器。如果你确实需要 Oracle 官方的 MySQL,也可以装,但大多数场景下 MariaDB 足够了。
安装 MariaDB:
sudo dnf install -y mariadb-server mariadb
启动并设置开机自启:
sudo systemctl enable --now mariadb
接下来运行安全脚本,这是必不可少的一步:
sudo mysql_secure_installation
脚本会问你一系列问题,建议全部选 Y:
- 设置 root 密码:创建一个强密码,别用
123456这种 - 删除匿名用户:选 Y
- 禁止 root 远程登录:选 Y(这步很关键,远程登录只允许用密钥或特定用户)
- 删除测试数据库:选 Y
- 重新加载权限表:选 Y
验证安装是否成功:
mysql -u root -p
输入刚才设置的密码,如果能进入 MariaDB 命令行,说明安装成功。输入 exit 退出。
为了演示,创建一个测试数据库和用户:
CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
这里用的是 utf8mb4 字符集,它能支持 emoji 表情,比普通的 utf8 更现代。密码里包含大小写字母、数字和特殊字符,长度至少 12 位。
NGINX 反向代理 PHP:让动态网页跑起来
单有 NGINX 和 MySQL 还不够,大多数 Web 应用(比如 WordPress、Laravel)还需要 PHP 来解析动态内容。AlmaLinux 9 默认带的是 PHP 8.1,这是目前比较新且稳定的版本。
安装 PHP 和常用扩展:
sudo dnf install -y php php-fpm php-mysqlnd php-gd php-mbstring php-xml php-curl php-zip
启动 PHP-FPM 服务:
sudo systemctl enable --now php-fpm
编辑 NGINX 配置文件,让 NGINX 知道把 PHP 请求交给 PHP-FPM 处理。创建一个新的站点配置:
sudo vi /etc/nginx/conf.d/default.conf
内容如下:
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.php index.html;
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# PHP 处理
location ~ \.php$ {
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;
}
# 默认错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
测试配置并重启 NGINX:
sudo nginx -t
sudo systemctl restart nginx
创建一个简单的 PHP 测试文件:
sudo bash -c 'echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php'
浏览器访问 http://你的公网IP/info.php,如果看到 PHP 信息页面,说明 NGINX 和 PHP-FPM 配合成功了。测试完记得删除这个文件,别留 phpinfo() 在公网服务器上,那是暴露服务器信息的高手。
安全防护:别让服务器成为僵尸网络的一员
环境搭好了,但这只是开始。云服务器放在公网,每天会被成千上万的扫描器探测,不加固的话,迟早出事。
1. 安装 Fail2ban 防暴力破解
Fail2ban 可以监控日志,发现多次登录失败的 IP 自动封禁:
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
配置 Fail2ban 监控 SSH:
sudo vi /etc/fail2ban/jail.local
内容:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
backend = systemd
启动服务:
sudo systemctl enable --now fail2ban
2. 配置 SELinux
AlmaLinux 9 默认启用 SELinux,这是多一层的安全保障。不要为了省事直接关掉它:
sudo getenforce
如果显示 Enforcing,说明已经在正常工作。如果某服务因为 SELinux 策略报错,用 audit2allow 生成允许规则,而不是直接关掉 SELinux。
3. 定期更新系统
设置自动更新,确保系统始终处于最新状态:
sudo dnf install -y dnf-automatic
sudo systemctl enable --now dnf-automatic.timer
编辑配置文件:
sudo vi /etc/dnf/automatic.conf
找到这两行,取消注释:
apply_updates = yes
random_sleep = 0
这样系统会在每天凌晨自动下载并安装安全更新。
4. 限制入站流量
回到阿里云控制台的安全组,把不必要的端口全部关掉。如果你只做 Web 服务,只需要 22、80、443 三个端口开放。其他所有端口,包括 MySQL 的 3306,都不要对外开放。MySQL 只允许本地连接,或者通过 SSH 隧道访问。
5. 日志监控
开启系统日志的远程备份,防止日志被本地删除掩盖入侵痕迹。可以简单的把日志转发到另一个服务器,或者用阿里云的 SLS(日志服务):
sudo dnf install -y rsyslog
配置 rsyslog 转发到日志服务器(这里以本地为例,生产环境建议转发到远程):
sudo vi /etc/rsyslog.d/remote.conf
*.* @@日志服务器IP:514
重启 rsyslog:
sudo systemctl restart rsyslog
备份策略:最后的安全网
再好的防护也有失手的时候,备份是最后的底线。阿里云提供了快照功能,但最好再叠加一层自动化脚本。
创建一个备份脚本:
sudo vi /usr/local/bin/backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups"
DB_NAME="myapp"
DB_USER="myapp_user"
DB_PASS="StrongPassword123!"
mkdir -p $BACKUP_DIR
# 备份数据库
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# 备份网站文件
tar -czf $BACKUP_DIR/files_$DATE.tar.gz /usr/share/nginx/html
# 保留最近 7 天的备份
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed: $DATE"
给脚本执行权限:
sudo chmod +x /usr/local/bin/backup.sh
添加到 crontab,每天凌晨 2 点执行:
sudo crontab -e
添加:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
总结:一步一步来,别着急
部署服务器这事儿,急不得。每一步都验证一下,确认通了再往下走。AlmaLinux 9 是个很稳的系统,只要你把基础打牢,后续跑业务会很省心。记住几个核心原则:最小权限、定期更新、多重备份、日志监控。做到这四点,你的服务器就已经比市面上 80% 的云服务器安全了。
如果中间遇到报错,别慌,先把错误信息复制下来,大部分问题都能在网上找到答案。Linux 社区的力量是很强大的,你遇到的问题,早就有人遇到并解决了。
