
你是否感觉自己收藏夹里,已经躺着一大堆关于服务器的“武功秘籍”——安全设置一篇,Nginx配置一篇,Docker入门又一篇……但当真面对一台崭新的、空无一物的服务器时,你依然会感到一丝迷茫,不知道第一步该做什么,第二步该连向哪里?
这些零散的知识点,就像一颗颗强大的“龙珠”,只有将它们全部集齐,并用一条清晰的“主线任务”串联起来时,才能召唤出名为“高级技术栈”的神龙。
今天,我们就来走完这条主线任务。
我们将模拟一个最真实的场景:你刚刚购买了一台全新的云服务器,你的目标,是在上面同时运行两个应用,并且都要实现HTTPS加密访问:
- 一个是用
yourdomain.com
访问的官方网站(纯静态页面)。 - 另一个是用
api.yourdomain.com
访问的API服务(用Docker运行)。
这个任务,几乎涵盖了个人开发者和小型团队80%以上的日常需求。现在,让我们化身为“总工程师”,开始为我们的“数字帝国”奠基。
第一阶段:建造“堡垒”地基 —— 服务器的初始化安全加固
在我们思考如何“建大楼”之前,必须先确保我们的“地皮”是安全的。一台刚刚创建的服务器,就像一座对外不设防的“毛坯房”,我们必须先给它装上最坚固的“防盗门”和“监控系统”。
1. 告别“万能钥匙”,创建你的专属“将军” 永远不要直接使用root
这个“国王”账户。我们要创建一个权限受控的“将军”账户来发号施令。
Bash
# 用root登录后,立刻创建新用户(这里以myadmin为例)
adduser myadmin
# 赋予他sudo(临时使用国王权力)的权限
usermod -aG sudo myadmin
现在,exit
退出,立刻用你的新用户myadmin
重新登录服务器。从今往后,忘了root
吧。
2. 扔掉“密码锁”,换上“生物识别” 密码,总有被暴力破解的风险。我们要换上更安全的SSH密钥。
- 在你自己的电脑上(不是服务器上!)打开终端,生成密钥对:
Bash
ssh-keygen -t rsa -b 4096
将你的“公钥”(锁芯)安装到服务器上:
Bash
ssh-copy-id myadmin@你的服务器IP
3. 彻底封死“后门” 现在,我们要编辑SSH的配置文件,让它只认密钥这把“唯一的钥匙”。
Bash
sudo nano /etc/ssh/sshd_config
在文件里,找到并修改这几项:
PasswordAuthentication no # 禁止密码登录
PermitRootLogin no # 禁止root用户通过SSH登录
4. 玩个“捉迷藏”,隐藏你的“大门” 继续在sshd_config
文件里,把默认的SSH端口22
,改成一个你自己记住的、大于1024的数字,比如23456
。
Port 23456
保存文件,然后重启SSH服务:sudo systemctl restart sshd
。
5. 部署“城墙守卫”,UFW防火墙 最后,我们开启防火墙,只允许我们需要的端口通行。
Bash
# 先把你刚才改的SSH新端口放行!这是救命的一步!
sudo ufw allow 23456/tcp
# 放行Web服务需要的HTTP和HTTPS端口
sudo ufw allow http
sudo ufw allow https
# 启动防火墙
sudo ufw enable
好了!经过这一番操作,你的服务器,已经从一个谁都能来踹门的“毛坯房”,变成了一座拥有隐藏入口、只认你这个主人、并且有警卫站岗的“坚固堡垒”。地基,已经打好。
第二阶段:聘请“超级前台” —— 配置Nginx反向代理
现在,我们的“堡垒”里,要同时开两家“公司”:官网(静态网站)和API服务。但我们的堡垒只有一个“正门”(80/443端口)。怎么办?
请出我们的“超级前台”Nginx!它能根据访客要找的“公司名称”(域名),把他们精准地引导到不同的“内部房间”(应用端口)。
1安装Nginx
Bash
sudo apt update
sudo apt install nginx
2为“官网”创建接待指南 假设你的官网文件放在/var/www/yourdomain
。
Bash
sudo nano /etc/nginx/sites-available/yourdomain
写入配置:
Nginx
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
3为“API服务”创建接待指南 我们的API服务,计划稍后用Docker,在服务器的3000
端口上运行。
Bash
sudo nano /etc/nginx/sites-available/api
写入反向代理配置:
Nginx
server {
listen 80;
server_name api.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
proxy_pass
这行,就是魔法所在。它告诉Nginx:“所有找api.yourdomain.com
的访客,都给我转交给本机3000端口的那个家伙去处理!”
4让指南生效
Bash
sudo ln -s /etc/nginx/sites-available/yourdomain /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
现在,Nginx这位“前台”,已经知道该如何接待访问这两个域名的客人了。
第三阶段:引入“集装箱”—— 用Docker运行API服务
为什么我们要用Docker来跑API服务?因为它可以把我们的应用,连同它的所有“生活用品”(依赖环境),都打包在一个标准化的“集装箱”里,干净、隔离、可移植。
1安装Docker (如果你的服务器不是买的Docker应用镜像)
Bash
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
2准备一个极简的API“货物” 我们创建一个目录,并在里面写一个简单的Node.js API。
Bash
mkdir my-api && cd my-api
nano index.js
写入内容:
JavaScript
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Hello from my Dockerized API!' }));
});
server.listen(3000, '0.0.0.0', () => {
console.log('Server running on port 3000');
});
3撰写“打包说明书”——Dockerfile
Bash
nano Dockerfile
写入内容:
Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY index.js .
EXPOSE 3000
CMD ["node", "index.js"]
这份说明书,告诉Docker如何一步步地,把我们的Node.js应用,打包成一个标准的“集装箱”。
Bash
# 打包(构建镜像) sudo docker build -t my-api-image . # 发货(运行容器) sudo docker run -d –name my-api-container -p 3000:3000 –restart always my-api-image
--restart always
这个参数很重要,它保证了即使服务器重启,我们这个API“集装箱”也会自动运行。
现在,我们的API服务,已经在后台的3000端口上,稳定地运行起来了。而Nginx这位前台,正在忠实地,把所有访问api.yourdomain.com
的请求,都转交给它。
第四阶段:全线“加密升级” —— 部署SSL证书
万事俱备,只差最后的“安全认证”。我们要为这两家“公司”,都挂上HTTPS的“金字招牌”。
1安装“认证专家”Certbot
Bash
sudo apt install certbot python3-certbot-nginx
2一键完成所有认证!
Bash
sudo certbot --nginx
- Certbot会自动识别出你配置的
yourdomain.com
和api.yourdomain.com
两个域名,询问你要为哪些开启HTTPS。选择全部,然后同意将HTTP自动跳转到HTTPS。
几分钟后,魔法就会发生。Certbot会自动帮你搞定所有证书的申请、配置和安装。
现在,你再用https://yourdomain.com
和https://api.yourdomain.com
访问试试看。看到了吗?那把绿色的小锁,已经在地址栏里,为你闪耀。
你,已是“总工程师”
好了,停下来,回顾一下你刚刚完成的这一切。
你从一台空空如也的服务器开始,亲手为它建立了坚不可摧的安全壁垒。然后,你像一位城市规划师,用Nginx设计了这座城市的交通枢纽,让不同的应用得以和谐共存。紧接着,你又引入了Docker这项现代化的工业技术,让你的应用部署,变得标准化和高效。最后,你用SSL,为整座城市,覆盖上了一层安全的能量护盾。
你不再是那个只会用单个工具的“工匠”,你已经成了一个能规划并建造整个“数字城市”的“总工程师”。
这,就是你的技术栈。它不再是零散的、躺在你收藏夹里的知识点,而是一套你已经亲手验证过的、可以随时拿来,去解决真实世界问题的强大武器。
现在,去这片你亲手开垦的土地上,建造你的下一个伟大项目吧。