外观
Verdaccio 私有源部署文档
约 778 字大约 3 分钟
2025-07-30
本文档将指导你如何将 Verdaccio 服务通过 Nginx 代理绑定到 https://npm.xxxx.cyou
子域名,并配置 HTTPS 证书与自动续期。
📦 前提条件
- 一台已开放 80/443 端口的服务器(CentOS)
- 已部署并运行 Verdaccio(默认监听端口 4873)
- 已安装 Nginx
- 已将子域名
npm.xxxx.cyou
解析到服务器公网 IP - 系统时间准确(推荐使用 NTP)
🔐 第一步:申请 SSL 证书(使用 certbot standalone 模式)
注意:此方式会暂时占用 80 端口,请确保 Nginx 暂时关闭
1. 停止 Nginx 占用
sudo systemctl stop nginx
2. 使用 Certbot 申请证书
sudo certbot certonly --standalone -d npm.xxxx.cyou
证书申请成功后,会生成在以下路径:
/etc/letsencrypt/live/npm.xxxx.cyou/fullchain.pem
/etc/letsencrypt/live/npm.xxxx.cyou/privkey.pem
3. 重启 Nginx
sudo systemctl start nginx
🛠️ 第二步:Nginx 配置文件示例
路径建议使用 /etc/nginx/conf.d/npm.xxxx.cyou.conf
:
# HTTP -> HTTPS 重定向
server {
listen 80;
server_name npm.xxxx.cyou;
return 301 https://$host$request_uri;
}
# Verdaccio HTTPS 服务
server {
listen 443 ssl;
server_name npm.xxxx.cyou;
ssl_certificate /etc/letsencrypt/live/npm.xxxx.cyou/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/npm.xxxx.cyou/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://127.0.0.1:4873/;
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
检查并重载配置:
sudo nginx -t && sudo systemctl reload nginx
🔁 第三步:配置自动续期
Let's Encrypt 签发的证书有效期为 90 天,建议每 60 天自动续签一次。
手动测试续期:
sudo certbot renew --dry-run
设置定时任务(每日凌晨 3 点尝试续签):
编辑定时任务:
sudo crontab -e
添加:
0 3 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
🧪 附加:检查 HTTPS 状态与证书链
使用 OpenSSL 命令查看证书是否正确部署:
openssl s_client -connect npm.xxxx.cyou:443 -servername npm.xxxx.cyou
确认返回中包含:
Certificate chain
完整Verify return code: 0 (ok)
🧼 浏览器出现“不安全”提示的排查建议
- 清除浏览器缓存或使用无痕模式访问
- 使用 https://www.ssllabs.com/ssltest/ 测试证书链完整性
- 检查 Nginx 是否加载了旧证书
- 查看证书是否确实包含
npm.xxxx.cyou
域名
✅ 完整部署后效果
打开浏览器访问:
https://npm.xxxx.cyou/
应该可以看到 Verdaccio 首页,地址栏左侧有 🔒 小锁图标,表示证书安全有效。
📌 其他子域名配置
若你有其他子域名(如 blog.xxxx.cyou
、admin.xxxx.cyou
),可重复以上流程,只需换成对应域名即可。
✅【推荐方案】用 nginx 模式申请+续期证书
你既然已经用 Nginx,在续期的时候用 --nginx
模式就不需要释放 80 端口了,Certbot 会自动和 nginx 配合。
🔁 操作步骤:
1.先备份原有证书(可选)
sudo cp -r /etc/letsencrypt /etc/letsencrypt-bak
2.重新申请一遍证书,用 nginx 模式(替代 --standalone)
sudo certbot --nginx -d npm.xxxx.cyou
3.验证 nginx 配置是否加了自动更新 hook Certbot 会自动在 /etc/letsencrypt/renewal/npm.xxxx.cyou.conf
里写好使用 nginx 模式。
4.测试自动续期是否能跑通
sudo certbot renew --dry-run