901 字
5 分钟
关于nginx部署网站及申请ssl证书实记
2025-12-04

🎯 一、整体部署流程(Nginx + Vue/React SPA + Let’s Encrypt)#

步骤概览#

步骤操作
1构建前端项目,生成 dist 目录
2dist 文件上传至服务器(如 /var/www/afishblog
3编写 Nginx 站点配置(仅 HTTP,无 SSL)
4创建软链接启用站点:sites-available → sites-enabled
5安装 Certbot 并申请 Let’s Encrypt 证书(自动配置 HTTPS)
6验证 HTTPS 访问、前端路由刷新、自动跳转等
7(可选)测试自动续期

📄 二、最终生效的 Nginx 配置(由 Certbot 自动生成 + 手动优化)#

文件路径:/etc/nginx/sites-available/afishblog
软链接:/etc/nginx/sites-enabled/afishblog → ../sites-available/afishblog

server {
server_name afish.blog.xiaoyaocode.cn;
root /var/www/afishblog;
index index.html;
# ✅ 支持前端 history 路由(关键!)
location / {
try_files $uri $uri/ /index.html;
}
# ✅ 静态资源缓存(提升性能)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# ✅ 安全:隐藏 Nginx 版本号
server_tokens off;
# --- 以下由 Certbot 自动管理 ---
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/afish.blog.xiaoyaocode.cn/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/afish.blog.xiaoyaocode.cn/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
# --- HTTP 自动跳转 HTTPS(由 Certbot 自动生成)---
server {
if ($host = afish.blog.xiaoyaocode.cn) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name afish.blog.xiaoyaocode.cn;
return 404; # managed by Certbot
}

💡 注意:带 # managed by Certbot 的部分不要手动修改,否则可能被覆盖。


⚠️ 三、遇到的问题与解决方案总结#

问题原因解决方案
ssl_certificate: command not found在 shell 中误输入了 Nginx 配置语句忽略,那是配置文件内容,不是命令
Nginx 启动失败:no "ssl_certificate" is defined for listen ... ssl配置中写了 listen 443 ssl; 但未提供证书路径先完全移除 SSL 配置,仅保留 80 端口 HTTP
Certbot 报错:cannot load certificate ... No such file提前在配置中引用了不存在的证书文件同上,让 Certbot 先申请证书,再自动填入路径
前端页面刷新 404使用了 history 路由但 try_files 写成 =404改为 try_files $uri $uri/ /index.html;
域名无法访问 / Certbot 验证失败DNS 未解析 或 80 端口未开放检查 ping 域名 + 云服务商安全组放行 80/443

🔧 四、关键部署细节与最佳实践#

1. 前端文件部署#

Terminal window
# 示例:将本地 dist 上传并部署
scp -r dist/* root@your_server:/var/www/afishblog/
# 设置权限(确保 Nginx 可读)
sudo chown -R www-data:www-data /var/www/afishblog
sudo chmod -R 755 /var/www/afishblog

2. 软链接创建(启用站点)#

Terminal window
sudo ln -s /etc/nginx/sites-available/afishblog /etc/nginx/sites-enabled/

✅ 检查:ls -l /etc/nginx/sites-enabled/

3. Certbot 安装(Ubuntu/Debian)#

Terminal window
sudo apt update
sudo apt install certbot python3-certbot-nginx -y

4. 证书申请(必须在纯 HTTP 下运行)#

Terminal window
sudo certbot --nginx -d afish.blog.xiaoyaocode.cn
# 选择:2 (Redirect HTTP → HTTPS)

5. 验证与重载#

Terminal window
sudo nginx -t && sudo nginx -s reload
curl -I https://afish.blog.xiaoyaocode.cn # 应返回 200

6. 自动续期测试#

Terminal window
sudo certbot renew --dry-run

✅ 成功标志:无报错,显示模拟续期成功

7. 安全建议#

  • 不要暴露 .gitnode_modules 等目录(你的 root 指向 dist,天然安全)
  • 启用 server_tokens off; 隐藏版本信息
  • 定期更新系统和 Certbot

📦 五、目录结构参考#

/var/www/
└── afishblog/ # 前端静态文件根目录
├── index.html
├── assets/
│ ├── app.xxxx.js
│ └── style.xxxx.css
└── favicon.ico
/etc/nginx/
├── sites-available/
│ └── afishblog # 主配置文件(你编辑的地方)
└── sites-enabled/
└── afishblog → ../sites-available/afishblog # 软链接
/etc/letsencrypt/
└── live/
└── afish.blog.xiaoyaocode.cn/
├── fullchain.pem # 证书链
├── privkey.pem # 私钥
├── cert.pem
└── chain.pem

✅ 六、后续维护#

场景操作
更新前端替换 /var/www/afishblog/ 下文件即可
添加新域名重复 certbot --nginx -d 新域名
手动续期sudo certbot renew(通常不需要)
查看证书信息sudo certbot certificates

🎉 总结#

你现在拥有一个:

  • ✅ 安全(HTTPS + 自动续期)
  • ✅ 高性能(静态资源缓存 + gzip)
  • ✅ 用户友好(SPA 路由支持、自动跳转)
  • ✅ 易维护(标准 Nginx + Certbot 流程)

的现代化前端部署环境!

关于nginx部署网站及申请ssl证书实记
https://fuwari.vercel.app/posts/nginx/create_site/
作者
江湖一条鱼
发布于
2025-12-04
许可协议
CC BY-NC-SA 4.0