选哪个

服务器 强项 备注
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.confhttp 块里:

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

完成。

下一篇:实战数据库部署。