Web 部署实践课
系统初始化序列:启动
从静态文件到动态代理,选择合适的 Web 服务器是部署的第一步
综合能力雷达图
资源占用对比
全球 TOP 1000 网站中超过 40% 使用 Nginx,包括 Netflix、Dropbox、Airbnb
极低的资源占用,1GB 内存的 VPS 即可稳定运行,配置清晰易懂
掌握 Nginx = 掌握反向代理、负载均衡、SSL 配置等核心概念
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Chrome/120
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
location / {
root /var/www/html;
}
server {
listen 80;
server_name example.com;
# 文件根目录
root /var/www/html;
# 默认首页
index index.html index.htm;
}
/var/www/html + /css/style.css
/var/www/html/css/style.css
GET /users HTTP/1.1
Host: api.example.com
# api.example.com → :3000
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name example.com;
# 后端 API 路由
location /api/ {
proxy_pass http://localhost:3000;
}
# 前端 SPA 路由
location / {
root /var/www/dist;
try_files $uri $uri/ /index.html;
}
}
$uri (原始路径)$uri/ (作为目录)/index.html (SPA入口)upstream backend {
# least_conn; # 或 ip_hash;
server 192.168.1.10:3000;
server 192.168.1.11:3000;
...
}
# 开发服务器监听
python -m http.server 8080
node app.js # 监听 3000
server {
listen 80;
server_name example.com;
}
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/...;
}
sudo certbot --nginx -d example.com
TLS_AES_256_GCM_SHA384
接下来 5 步,在真实服务器上完成部署闭环:从代码、静态资源,到 Nginx、Cloudflare 与 SSL。
确保 SSH、Python 依赖、Nginx、Cloudflare、Certbot 都能顺畅切换,演示节奏一气呵成。
ssh deploy@prod.lab
/srv/apps/intro
/var/www/html/home
演示目标:上线一个 Python Web 服务 + 静态首页,Cloudflare 完成解析,最后以 Certbot 启用 HTTPS。
确保最新提交已推送并同步至演示机,保留回滚点。
git pull origin main
rsync -av --delete dist/ deploy@prod.lab:/srv/apps/intro
静态资源进入 /var/www/html/home,后端使用 venv + systemd 常驻。
# 部署静态文件
sudo cp -r static/* /var/www/html/home/
# 创建虚拟环境并安装依赖
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 编写 systemd service 配置
sudo nano /etc/systemd/system/intro.service
[Unit]
Description=Intro Web Service
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/srv/apps/intro
Environment="PATH=/srv/apps/intro/venv/bin"
ExecStart=/srv/apps/intro/venv/bin/python main.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload && sudo systemctl start intro.servicejournalctl -u intro.service -f一份 server 块同时服务静态首页,并将 /api 反代到 Python 进程。
server {
listen 80;
server_name demo.gislab.dev;
root /var/www/html/home;
index index.html;
access_log /var/log/nginx/intro_access.log;
error_log /var/log/nginx/intro_error.log warn;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8000/;
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_connect_timeout 5s;
proxy_read_timeout 30s;
}
}
现场展示记录创建,解释灰云 / 橙云差异,确保 TTL 足够短。
类型: A
名称: demo
目标: 203.0.113.42
代理: Proxied · TTL: Auto
安装 Nginx 插件,自动写入 server 块并生成定时续期。
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d demo.gislab.dev