Ubuntu服务器学习路径:从零部署网站到管理容器,新手避坑实用指南
第一章:服务器不是黑盒,你比想象中更能掌控它
我认识一个朋友,叫小林。刚开始接触服务器的时候,他连SSH是什么都不知道,看见黑乎乎的命令行就慌。现在他一个人运维着一套完整的Web服务,还会用Docker管容器。他的经验告诉我:服务器没你想的那么可怕,只是需要有人领你入门。
Ubuntu是目前最流行的服务器操作系统,尤其是对于新手来说。它的社区庞大、文档齐全、问题好找。咱们今天就从头开始,一步步带你把网站跑起来,再管理容器。
第二章:第一件事——你得有一台服务器
2.1 云服务器 vs VPS vs 本地主机
很多人一开始就懵:服务器从哪里来?
云服务器(阿里云、腾讯云、AWS、DigitalOcean等)是最常见的选择。你只需要按月付费,就能拥有一台远程的Linux电脑。好处是随时能开、随时能关,价格也便宜,入门级别的机器每月只要几十块钱。
VPS(虚拟专用服务器)本质上类似,只是提供商不同。
本地主机就是你自己电脑上的Ubuntu,适合学习,但不适合对外提供服务的场景。
新手建议:先从云服务器的免费试用或者最便宜的档位开始。别一上来就买贵的,先学会用再说。
2.2 选购时最容易踩的坑
坑一:选错了操作系统镜像
有些云服务商默认给你装的是CentOS或者Windows。如果你是想学Ubuntu,记得在创建实例的时候选对镜像。现在推荐选 Ubuntu 22.04 LTS 或 24.04 LTS,这两个是长期支持版本,稳定且文档多。
坑二:安全组规则没配置
云服务器默认是锁死端口的。你得手动开放22端口(SSH)、80端口(HTTP)、443端口(HTTPS),否则连不上去。
在阿里云的控制台里,找到”安全组”,添加入方向规则:
协议: TCP, 端口: 22, 授权对象: 0.0.0.0/0
协议: TCP, 端口: 80, 授权对象: 0.0.0.0/0
协议: TCP, 端口: 443, 授权对象: 0.0.0.0/0
腾讯云里类似,叫”入站规则”,找一找就能明白。
坑三:没配置密钥登录
密码登录很容易被暴力破解。强烈建议配置SSH密钥:
# 在你的本地电脑上生成密钥(如果没有的话)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 把公钥复制到服务器
ssh-copy-id root@你的服务器IP
然后去服务器上禁用密码登录:
sudo nano /etc/ssh/sshd_config
找到这一行,改成:
PasswordAuthentication no
重启SSH服务:
sudo systemctl restart sshd
这样就算有人暴力破解你的密码,也进不来。
第三章:连上服务器,先别急着动手
3.1 第一次登录
ssh root@你的服务器IP
第一次连的时候,可能会让你确认一下指纹,输入yes就行。然后用你的密钥或者密码登录。
3.2 第一件事:更新系统
sudo apt update && sudo apt upgrade -y
这条命令会把系统里所有的包都升级到最新版本。养成习惯,每次拿到新服务器都先跑一遍。
3.3 创建你自己的用户
用root直接操作有点危险,建议创建一个普通用户,再给他sudo权限:
# 创建用户,把username换成你想要的名字
sudo adduser username
# 给用户sudo权限
sudo usermod -aG sudo username
然后你就可以用这个新用户登录了,root账号可以考虑禁用:
sudo nano /etc/ssh/sshd_config
加入:
PermitRootLogin no
重启SSH:
sudo systemctl restart sshd
3.4 安装常用工具
sudo apt install -y curl wget git htop tmux
curl:发HTTP请求用wget:下载文件用git:代码版本控制htop:看系统资源占用,比top好看tmux:终端复用器,断开连接后任务还在跑,这个神器新手不知道吃了多少亏
第四章:部署第一个网站
4.1 用最简单的方式:Nginx + HTML
这是最基础的Web服务搭建方式。先装Nginx:
sudo apt install -y nginx
启动并设置开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx
然后访问http://你的服务器IP,你应该能看到Nginx的默认欢迎页面。
4.2 把你的网站放上去
Nginx的默认网站根目录在/var/www/html。你可以直接把HTML文件放进去:
sudo nano /var/www/html/index.html
写入你的网页内容,然后刷新浏览器看看效果。
4.3 配置域名
你肯定不想让人家记一个IP地址。买一个域名,把DNS指向你的服务器IP。然后在Nginx里配置虚拟主机:
sudo nano /etc/nginx/sites-available/example.com
写入:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
创建目录并软链接:
sudo mkdir -p /var/www/example.com
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置有没有语法错误
sudo systemctl reload nginx
4.4 上HTTPS证书(必做!)
用Let’s Encrypt免费拿证书,配合certbot工具:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
按提示操作就行,certbot会自动帮你配置HTTPS。
第五章:当网站需要跑代码的时候
5.1 后端用Node.js
很多现代网站都有后端,Node.js是个不错的选择:
# 安装Node.js
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# 验证安装
node -v
npm -v
写一个最简单的Express服务器:
mkdir ~/myapp && cd ~/myapp
npm init -y
npm install express
// app.js
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Hello from Ubuntu Server!');
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server running on port ${PORT}`);
});
用PM2来管理这个进程,否则SSH断开了服务就没了:
sudo npm install -g pm2
pm2 start app.js
pm2 save
pm2 startup # 开机自启
5.2 后端用Python + Flask
sudo apt install -y python3 python3-pip python3-venv
mkdir ~/myflaskapp && cd ~/myflaskapp
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello from Flask on Ubuntu!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
用gunicorn跑:
gunicorn --bind 0.0.0.0:5000 app:app
同样用PM2管起来更稳。
5.3 数据库别省
不管什么网站,大概率需要数据库。MySQL和PostgreSQL随便选一个:
# MySQL
sudo apt install -y mysql-server
sudo mysql_secure_installation
# PostgreSQL(我个人更推荐)
sudo apt install -y postgresql postgresql-contrib
sudo -u postgres psql
-- 创建数据库和用户
CREATE DATABASE myapp;
CREATE USER myappuser WITH PASSWORD 'your_strong_password';
GRANT ALL PRIVILEGES ON DATABASE myapp TO myappuser;
\q
第六章:容器时代,Docker是绕不过去的
6.1 什么是容器,为什么你要学它
想象一下,你在自己电脑上开发了一个应用,运行得好好的。换到服务器上却报错,因为服务器上的Python版本不一样,或者某个依赖没装。这种”在我机器上能跑”的问题,困扰了开发者几十年。
Docker解决的就是这个问题:把应用和它的所有依赖打包在一起,保证在任何地方运行效果一致。
6.2 安装Docker
# 官方安装脚本(最省事)
curl -fsSL https://get.docker.com | sudo sh
# 把当前用户加入docker组,避免每次都用sudo
sudo usermod -aG docker $USER
# 重新登录或者运行以下命令让组变更生效
newgrp docker
# 验证安装
docker --version
docker run hello-world
6.3 Docker基础命令
# 拉取镜像
docker pull nginx:latest
# 运行容器
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 查看运行的容器
docker ps
# 停止容器
docker stop my-nginx
# 删除容器
docker rm my-nginx
# 删除镜像
docker rmi nginx:latest
-d 表示后台运行,-p 是端口映射(宿主机端口:容器端口)
6.4 Docker Compose:一键启动多个服务
现实中的网站很少只有一个服务,通常是Web服务+数据库+缓存。Docker Compose让你用一个YAML文件管理所有这些容器。
写一个docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- api
networks:
- app-network
api:
build: ./api
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
networks:
- app-network
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
pgdata:
然后一行命令启动全部:
docker compose up -d
停止:
docker compose down
这个文件就是整个应用的说明书,丢给任何人都能跑起来。
6.5 容器数据持久化
新手最容易犯的错误:容器删了,数据也没了。用数据卷来持久化:
volumes:
pgdata: # 命名卷,容器删了数据还在
./data: # 绑定卷,映射到宿主机目录
第七章:新手最常踩的十个坑
坑一:直接改系统文件忘了备份
# 改之前先备份
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
养成备份习惯,改坏了还能恢复。
坑二:防火墙只开了SSH忘了开其他端口
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 3000/tcp
sudo ufw enable
用ufw管理防火墙,比iptables友好多了。
坑三:不知道端口被谁占了
sudo lsof -i :80
# 或者
sudo netstat -tlnp
坑四:磁盘满了不知道
df -h
du -sh /var/log/*
定期清理日志和临时文件,/var/log经常是罪魁祸首。
坑五:SSH连不上了
检查安全组、检查SSH服务有没有运行、检查是不是改了端口:
sudo systemctl status sshd
坑六:Docker镜像拉取慢
国内服务器拉Docker Hub的镜像能拉到怀疑人生。换源:
sudo nano /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
坑七:容器里时间不对
Docker容器默认用的是UTC时间,而你的应用可能需要北京时间:
docker run -e TZ=Asia/Shanghai ...
或者在Dockerfile里加:
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
坑八:证书过期了没注意到
# 定期检查证书
sudo certbot certificates
# 自动续期(Ubuntu默认已配置)
sudo certbot renew --dry-run
坑九:不知道谁在访问你的网站
# 查看Nginx访问日志
tail -f /var/log/nginx/access.log
# 查看错误日志
tail -f /var/log/nginx/error.log
日志是你的朋友,出了问题先看日志。
坑十:没有备份策略
# 简单备份脚本
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
mysqldump -u root -p'password' mydb > $BACKUP_DIR/db_$DATE.sql
tar -czf $BACKUP_DIR/files_$DATE.tar.gz /var/www
find $BACKUP_DIR -mtime +30 -delete # 只保留30天内的备份
定期执行这个脚本,备份放到别的服务器上或者对象存储里。
第八章:进阶——监控和自动化
8.1 系统监控
# 实时监控
htop
# 查看磁盘IO
iostat
# 查看网络流量
nethogs
8.2 日志集中查看
# 所有服务的日志
sudo journalctl -u nginx -f
sudo journalctl -u docker -f
8.3 自动重启失败的服务
用systemd的Restart=always选项,或者用PM2的自动重启功能,确保服务挂了能自己起来。
8.4 定期安全更新
# 安装自动安全更新
sudo apt install -y unattended-upgrades
# 配置自动更新
sudo dpkg-reconfigure unattended-upgrades
第九章:学习路径总结
别急着一口气全学完,按这个顺序来:
第一阶段(第1-2周)
- 租一台服务器,学会SSH登录
- 掌握基本命令:ls、cd、cp、mv、grep、find、systemctl
- 学会用nano或vim编辑文件
- 完成一个静态网站的部署
第二阶段(第3-4周)
- 学习Nginx配置
- 部署一个动态网站(Node.js或Python)
- 配置HTTPS证书
- 了解基本的安全措施
第三阶段(第5-6周)
- 学习Docker基础
- 学会写Dockerfile
- 用Docker Compose部署多服务应用
- 理解数据持久化的概念
第四阶段(第7周及以后)
- 学习监控和日志管理
- 搭建自动化备份
- 了解CI/CD的基本概念
- 根据自己的项目深入某个方向
第十章:一些过来人的话
服务器这东西,上手之后你会发现它比你想象的简单很多。你只需要一台机器、一个终端、一点点耐心。
我见过太多人因为第一次SSH连不上就放弃了,其实99%的问题都是端口没开或者密码错了。我见过太多人因为怕改配置文件把系统搞崩,其实备份一下就好了。我见过太多人不敢碰Docker,觉得它很复杂,但其实跑一个hello-world只需要三分钟。
最大的障碍不是技术,是心里的那层恐惧。
你现在读到的这些内容,每一个步骤我都是亲手试过的。有问题就去查文档,去Google,去Stack Overflow。Ubuntu的社区是世界上最大的Linux社区之一,你遇到的问题十有八九别人遇到过,也有答案。
从这一刻开始,去租一台服务器,动手试试。看完这篇文章不实际操作,等于没看。