选哪个
| 服务器 | 强项 | 备注 |
|---|---|---|
| Nginx | 高并发 / 反向代理 / 静态文件 | 现代首选 |
| Apache | 模块丰富 / .htaccess 灵活 | 老项目多用 |
| Caddy | 自动 HTTPS / 配置简单 | 现代轻量替代 |
新项目首选 Nginx——本文以它为例。
装 Nginx
sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx
浏览器访问服务器 IP → 看到 "Welcome to nginx!" 默认页 = 装好了。
关键目录
/etc/nginx/ 配置根目录
├── nginx.conf 主配置
├── sites-available/ 可用站点配置
│ └── default
├── sites-enabled/ 启用中的(软链到 sites-available)
└── conf.d/ 额外配置
/var/log/nginx/ 日志
├── access.log
└── error.log
/var/www/html/ 默认站点根
配静态站点
新建 /etc/nginx/sites-available/wadely:
server {
listen 80;
server_name wadely.example.com;
root /var/www/wadely;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(jpg|jpeg|png|gif|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
启用:
# 准备文件
sudo mkdir -p /var/www/wadely
echo "<h1>Hello WadeLy</h1>" | sudo tee /var/www/wadely/index.html
# 启用站点
sudo ln -s /etc/nginx/sites-available/wadely /etc/nginx/sites-enabled/
# 测试配置语法
sudo nginx -t
# 重载(不断连接)
sudo systemctl reload nginx
绑定域名解析到服务器 IP 后,浏览器访问 http://wadely.example.com 看到 "Hello WadeLy"。
反向代理(最常见用法)
把 Nginx 前端 + 后端应用(Node / Python / Go)放本机:
互联网 → Nginx :80/:443 → 后端 :3000
后端跑在 localhost:3000,Nginx 转发:
server {
listen 80;
server_name api.wadely.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_set_header 必抄——后端拿到真实 IP / 协议靠它们。
多虚拟主机
一台机器同时跑多个域名:
sites-available/
├── wadely.conf → wadely.com
├── api.wadely.conf → api.wadely.com
└── blog.wadely.conf → blog.wadely.com
各自配 server_name 不同就行,Nginx 按 Host 头分流。
HTTPS:Let's Encrypt
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d wadely.com -d www.wadely.com
证书 90 天自动续签(certbot 装好就配好了 cron)。
sudo certbot renew --dry-run # 演练续签
sudo systemctl list-timers | grep certbot
gzip 压缩
/etc/nginx/nginx.conf 的 http 块里:
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
限频(基础防护)
http {
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
}
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://127.0.0.1:3000;
}
}
看日志
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
# 统计 IP 请求次数
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# 状态码分布
sudo awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
常用命令
sudo nginx -t # 测试配置
sudo nginx -s reload # 平滑重载
sudo systemctl reload nginx # 同上
sudo systemctl restart nginx # 完整重启
sudo nginx -V # 看编译选项
实战:完整部署一个 Web 应用
# 1. 装 Nginx
sudo apt install -y nginx
# 2. 部署代码
cd /var/www
sudo git clone https://github.com/me/myapp.git
sudo chown -R www-data:www-data myapp
# 3. 配 Nginx
sudo tee /etc/nginx/sites-available/myapp <<'EOF'
server {
listen 80;
server_name myapp.example.com;
root /var/www/myapp/public;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
EOF
sudo ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# 4. HTTPS
sudo certbot --nginx -d myapp.example.com
# 5. 防火墙
sudo ufw allow 80,443/tcp
完成。
下一篇:实战数据库部署。