如何为GCP Ubuntu18.04上用npm serve托管的React应用配置免费SSL
纯serve静态服务栈下配置Certbot SSL证书的可落地方案
完全匹配你当前无Nginx/Apache、直接用serve托管React构建产物的部署场景,有两种经过生产验证的实现路径:
方案1:零额外组件安装,全程沿用现有Node.js服务栈
不需要加装任何Web服务器,仅通过Certbot独立验证模式完成证书申请,再直接调整serve启动参数实现HTTPS访问:
- 安装Certbot本体,无需安装Nginx/Apache对应的Certbot插件
执行命令:sudo apt update && sudo apt install certbot -y - 临时释放80端口
先终止当前占用80端口的serve进程,通过sudo lsof -i :80定位进程PID,执行kill <PID>结束进程,避免Certbot域名验证时发生端口冲突 - 用Certbot独立模式完成域名所有权验证和证书申请
替换为你的实际域名执行命令:sudo certbot certonly --standalone -d your-domain.com -d www.your-domain.com
验证通过后证书会默认存储在/etc/letsencrypt/live/your-domain.com/路径下,包含HTTPS配置所需的全量证书文件 - 调整serve启动命令,直接绑定HTTPS默认端口
传入证书路径参数,让serve直接监听443端口提供HTTPS服务:sudo serve -s build --listen 443 --ssl-key /etc/letsencrypt/live/your-domain.com/privkey.pem --ssl-cert /etc/letsencrypt/live/your-domain.com/fullchain.pem - 配置证书自动续期逻辑
Certbot安装完成后默认会启动系统定时任务自动续期证书,需要添加部署钩子,在证书更新完成后自动重启serve进程,避免新证书不生效。可在/etc/letsencrypt/renewal-hooks/deploy/路径下新建重启脚本,写入serve进程的重启命令,给脚本添加可执行权限即可。 - 可额外启动一个轻量的80端口服务进程,把所有HTTP请求做301永久跳转到HTTPS地址,保障用户输入非加密地址时也能正常访问。
方案2:补充Nginx反向代理层,降低长期运维成本
如果觉得手动维护证书路径、进程重启逻辑繁琐,这个方案更适配长期运行的公开站点:
- 把原本监听80端口的serve服务调整到本地回环地址的非公开端口,比如3000端口:
sudo serve -s build --listen 127.0.0.1:3000 - 安装Nginx作为对外统一入口,配置站点将80端口的所有请求转发到本地的3000端口
- 直接运行带Nginx插件的Certbot命令,自动完成SSL证书申请、HTTPS加密配置、HTTP强制跳转、证书续期后自动重载的全流程,后续不需要手动调整任何证书相关的配置。
高频踩坑提示
- 谷歌云控制台的防火墙规则需要确保放通80、443端口的入站流量,否则Certbot的HTTP域名验证会因为连接超时失败
- 证书私钥文件默认仅root用户可读,启动serve服务时需要带sudo权限,否则进程会因为无法读取证书文件启动失败
- 不要把证书文件复制到React项目的build目录下,既容易被后续的构建流程覆盖,也容易因为目录权限设置不当引发安全风险
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

