说实话,如果你现在手里有一台刚买回来的云服务器,脑子里一团浆糊,不知道该先装Nginx还是先配Docker,那这篇文章就是给你写的。我不跟你整那些虚头巴脑的学术定义,咱们直接开干。
2025年了,AlmaLinux 9 确实是个被低估的宝藏。为什么?因为CentOS Stream虽然能用,但作为生产环境总让人觉得脚下有点虚;Ubuntu长期支持版不错,但它的包管理器apt和国内那些教程水土不服;而Rocky Linux虽然优秀,但Alma在云厂商的预装适配上做得更丝滑。最重要的是,它是RHEL(红帽企业版)的1:1二进制兼容,这意味着你在上面跑的东西,放到昂贵的RHEL服务器上也照样能跑,这种“降维打击”的兼容性,懂行的都知道有多香。
咱们这次的任务很明确:从零开始,在一台纯净的AlmaLinux 9实例上,搭建一套完整的Web服务环境。我们要用Docker来跑Web应用,用Nginx做反向代理,还要配置好HTTPS(也就是那个让人头疼的SSL证书),最后确保你的服务器安全得连黑客看了都想转行。
别担心,我会把每一步可能踩的坑都给你标出来,用大白话讲清楚原理,再配上可以直接复制粘贴的命令。咱们开始吧。
第一步:别急着动手,先做好“战前准备”
很多人拿到服务器IP,立马就连上SSH开始乱敲命令,这是大忌。在AlmaLinux 9上,顺序错了,后面全是bug。
1.1 安全组与安全策略:把门先焊死
在你连接服务器之前,先去你的云服务商控制台(不管是阿里云、腾讯云、AWS还是DigitalOcean),找到“安全组”或者“防火墙规则”。
默认情况下,云服务商只开放了22端口(SSH)。你必须手动添加以下规则:
- TCP 80:用于HTTP(后续转HTTPS需要)
- TCP 443:用于HTTPS(你的网站正式入口)
- TCP 22:保持开启,别把自己锁外面了
避坑指南:千万别为了方便,把0.0.0.0/0全部开放。有些教程会让你临时开一堆端口调试,调试完忘了关,结果服务器被扫到,第二天就被挖矿病毒光顾了。记住,最小权限原则,只开必要的。
1.2 基础系统更新:给内核打个补丁
登录你的服务器。如果你用的是Mac或Linux,终端输入:
ssh root@你的服务器IP
如果是Windows用户,建议下载PuTTY或者直接用Windows Terminal的SSH功能。第一次登录会让你改密码,设一个复杂的,别用123456。
登录成功后,先执行这一步:
sudo dnf update -y
sudo dnf upgrade -y
这里有个细节要注意。AlmaLinux 9用的是dnf包管理器,比旧版的yum快很多,而且依赖解析更智能。update和upgrade的区别在于,update会处理新增的包,upgrade只处理现有包。两块都跑一遍,确保你的系统基线是最新的。
避坑指南:如果更新过程中提示有内核更新,一定要重启服务器:
sudo reboot
重启后再连上去,用uname -r看看内核版本是不是变了。不重启直接装东西,后续可能会出现一些奇奇怪怪的兼容性问题,比如某些内核模块加载失败。
1.3 创建非root用户:别当上帝太久
用root账户干所有事,就像开着一辆法拉利在菜市场里飙车,危险又没必要。我们需要创建一个专门的管理员用户。
useradd -m -s /bin/bash adminuser
passwd adminuser
输入两次密码,最好复杂点,大小写字母加数字加符号。
接下来,给这个用户加sudo权限。在AlmaLinux 9中,wheel组的用户拥有sudo权限:
usermod -aG wheel adminuser
现在,你可以用su - adminuser切换过去试试,或者直接开第二个终端窗口用新用户名登录。确认能正常sudo后,为了安全,我们可以禁掉root的SSH远程登录。编辑SSH配置:
sudo vi /etc/ssh/sshd_config
找到PermitRootLogin这一行,改成:
PermitRootLogin no
然后重启SSH服务:
sudo systemctl restart sshd
重要提示:改完这一步,千万别断网!先保留当前root的终端窗口,用新创建的adminuser从另一个窗口登录测试。如果新窗口能登录且sudo正常,再关掉root窗口。一旦测试失败把自己锁在外面,你就得去云服务商的VNC控制台里改配置了,那场面非常狼狈。
第二步:搭建Docker环境——现代Web站的基石
为什么用Docker?因为“在我机器上能跑”是程序员最大的谎言。Docker解决了环境一致性问题。你把代码、依赖、运行时全部打包成一个镜像,部署到哪都一样。
2.1 安装Docker
AlmaLinux 9的默认仓库里的Docker版本可能比较旧。我们直接去Docker官方仓库安装,这样能拿到最新功能和安全补丁。
首先,安装一些必要的依赖:
sudo dnf install -y ca-certificates curl
然后,添加Docker官方GPG密钥。这一步很多人会忘,导致后面dnf install时报错“公钥未安装”:
sudo install -m 0755 -d /etc/yum.repos.d
sudo curl -fsSL https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
注意,AlmaLinux是RHEL兼容的,所以用CentOS的仓库链接完全没问题。
接下来,安装Docker引擎:
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2.2 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
验证安装是否成功:
sudo docker --version
sudo docker run hello-world
如果最后一步输出了“Hello from Docker!”,恭喜你,Docker核心环境已经就绪。
避坑指南:AlmaLinux 9默认启用了rootless Docker吗?没有。默认情况下,你运行docker ps还是需要sudo。为了使用方便,把当前用户加入docker组:
sudo usermod -aG docker $USER
注意:这步改完组后,需要重新登录SSH会话才能生效。不要指望立即生效,这是Linux的权限机制决定的。注销再登录,然后直接运行docker ps,应该不需要sudo了。
2.3 配置Docker镜像加速
Docker Hub在国内的访问速度……你懂的,经常超时或者慢得像蜗牛。我们必须配置镜像加速。
编辑Daemon配置文件:
sudo vi /etc/docker/daemon.json
如果文件是空的,或者不存在,就新建它,填入以下内容(这里以阿里云或腾讯云为例,你可以根据实际情况替换):
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
后面两段log-driver和log-opts是很多人忽略的配置。Docker容器的日志如果没人管,会无限增长,几天下来就把你的磁盘撑爆了。设置每个日志文件最大10MB,最多保留3个,就能避免这个问题。
改完配置,重启Docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
第三步:用Nginx和Docker搭建Web站点
现在,核心软件都有了,咱们来真正跑起来一个网站。假设我们要部署一个简单的React或Vue前端项目,或者一个Node.js后端API。为了演示,我们用Docker最经典的Nginx镜像,并挂载本地目录,模拟真实部署场景。
3.1 准备项目目录结构
在你的服务器上,创建目录结构:
mkdir -p ~/mywebsite/html
mkdir -p ~/mywebsite/nginx/conf.d
mkdir -p ~/mywebsite/nginx/ssl
在html目录下,放一个最简单的index.html测试一下:
echo '<h1>Hello, AlmaLinux 9 + Docker!</h1>' > ~/mywebsite/html/index.html
3.2 编写Nginx配置文件
我们需要告诉Nginx怎么代理流量。创建一个默认的配置文件:
vi ~/mywebsite/nginx/conf.d/default.conf
内容如下:
server {
listen 80;
server_name your.domain.com; # 记得换成你的域名或IP
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# 转发API请求到后端容器(假设后端跑在8080端口)
location /api/ {
proxy_pass http://backend:8080/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
避坑指南:这里的backend是Docker Compose中定义的服务名。如果你不用Compose,而是单独跑容器,那这里需要填容器IP或者宿主机IP加端口。用Docker Compose会更整洁,我们下一步就用Compose。
3.3 编写Docker Compose文件
在项目根目录创建docker-compose.yml:
vi ~/mywebsite/docker-compose.yml
内容:
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: web-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
networks:
- webnet
restart: always
# 示例:一个后端服务
backend:
image: node:18-alpine
container_name: web-backend
working_dir: /app
volumes:
- ./backend:/app
command: npm start
networks:
- webnet
restart: always
networks:
webnet:
driver: bridge
这里用了nginx:alpine版本,镜像体积小,启动快,安全性也相对更高。restart: always确保服务器重启后容器自动拉起。
启动服务:
cd ~/mywebsite
sudo docker-compose up -d
用sudo docker-compose ps查看状态,应该都是Up。
用浏览器访问你的服务器IP,应该能看到“Hello, AlmaLinux 9 + Docker!”。
避坑指南:如果访问不通,第一反应查云服务器的安全组有没有开80端口,第二反应查AlmaLinux本地的firewalld防火墙:
sudo firewall-cmd --list-ports
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
第四步:搞定HTTPS——让网站披上安全外衣
HTTP明文传输在2025年已经是过街老鼠了。浏览器会直接标红警告,用户也会觉得你不专业。我们要用Let’s Encrypt免费证书,通过Certbot来自动申请和管理。
4.1 安装Certbot
AlmaLinux 9的EPEL仓库里有Certbot,但版本可能不是最新。我们直接装snap版的Certbot,或者用Python pip安装。为了稳定,推荐用EPEL源:
sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginx
4.2 申请证书
这里有个前提:你需要一个域名,并且解析到了这台服务器的IP。Let’s Encrypt不支持纯IP申请证书。
假设你的域名是your.domain.com,且DNS已经生效。运行:
sudo certbot --nginx -d your.domain.com
Certbot会自动检测你的Nginx配置,并询问你是否要重定向HTTP到HTTPS。选2(重定向)是最优解。它会修改你的default.conf,加入SSL相关配置,并自动续签。
避坑指南:Certbot申请证书时,会让你的服务器向Let’s Encrypt验证你拥有这个域名。验证方式通常是让服务器在.well-known/acme-challenge/路径下提供一个文件。如果你之前配置了复杂的WAF或者CDN(比如Cloudflare),可能会拦截这个请求,导致证书申请失败。初次配置时,建议先绕过CDN,直接验证IP,或者在CDN控制台临时关闭代理。
4.3 配置自动续签
Let’s Encrypt证书有效期只有90天。虽然Certbot安装时会帮你配置cron任务自动续签,但最好自己检查一下:
sudo systemctl status certbot.timer
如果是active (waiting),那就没问题。你可以手动模拟续签测试一下:
sudo certbot renew --dry-run
如果没有报错,说明自动续签机制工作正常。
第五步:加固服务器——别让人家进来随便逛
搭建好网站只是第一步,守好它才是本事。AlmaLinux 9自带了不错的安全基线,但我们还要再强化一下。
5.1 配置Firewalld高级规则
除了开80和443,SSH端口22最好也换个非标准端口,或者限制来源IP。如果你是从固定IP登录,可以这样限制SSH:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的固定IP/32" port port="2222" protocol="tcp" accept'
sudo firewall-cmd --reload
这样,只有你的IP能连2222端口,其他人都吃闭门羹。
5.2 安装Fail2Ban:抵御暴力破解
SSH和Nginx是攻击者的首选目标。Fail2Ban可以监控日志,发现多次登录失败就封禁IP。
sudo dnf install -y fail2ban
sudo systemctl enable --now fail2ban
默认配置就够用了。如果你想保护Nginx免受CC攻击或恶意扫描,可以创建一个过滤规则:
sudo vi /etc/fail2ban/jail.local
内容:
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
重启Fail2Ban:
sudo systemctl restart fail2ban
5.3 SELinux:别轻易关掉它
很多新手遇到SELinux报错,第一反应是setenforce 0把它关掉。这是错误示范。SELinux是AlmaLinux的安全内核模块,关掉后,一旦容器逃逸或Web应用被注入,攻击者将拥有root权限。
正确的做法是学习如何配置SELinux策略。Docker官方其实提供了SELinux兼容的启动方式。我们只需要确保挂载卷时加了:z或:Z标签,或者在docker-compose.yml中设置安全上下文。
简单做法:
sudo setsebool -P httpd_read_user_content 1
sudo setsebool -P httpd_can_network_connect 1
这两个命令允许Nginx读取用户内容目录并联网。对于Docker容器,通常不需要额外配置,因为容器有自己独立的SELinux上下文。但如果遇到权限拒绝,用audit2allow生成策略比直接关SELinux强得多。
第六步:监控与维护——让系统自己会说话
服务器跑起来了,不代表就没事了。你得知道它累不累、病不病。
6.1 内置工具就够用了
AlmaLinux 9自带了一套强大的监控命令,不用装第三方软件:
top或htop:看CPU和内存df -h:看磁盘空间free -m:看内存使用情况ss -tuln:看哪些端口在监听journalctl -u docker -f:实时看Docker日志
6.2 配置日志轮转和远程备份
容器日志和系统日志积累多了会影响性能。我们之前配了Docker的日志大小限制。系统日志可以用logrotate管理,AlmaLinux默认已经配好了。
建议定期备份你的配置。比如~/mywebsite目录里的代码和配置文件,可以用一个简单的脚本打包上传到对象存储(如OSS或S3):
tar -czvf backup-$(date +%Y%m%d).tar.gz ~/mywebsite
# 然后用aws s3或ossutil上传
把这个脚本加到crontab里,每周跑一次。
结语:享受你亲手搭建的数字家园
从一台空白的云服务器,到拥有一个运行着Docker容器、配有HTTPS、防御着暴力破解的Web站点,这条路并不长,但每一步都藏着细节。
AlmaLinux 9的稳定性、Docker的便捷性、Nginx的高效性,这三者的结合是2025年搭建个人站点或小型企业服务的黄金组合。它不像Kubernetes那样复杂得让人望而却步,也不像传统VPS面板那样功能臃肿。它干净
