如何为DigitalOcean Droplet上的Docker化Python REST API配置HTTPS?
配置Docker化Python REST API + Nginx启用HTTPS
以下是针对你的场景的具体配置步骤,全程基于DigitalOcean Droplet环境:
1. 调整Docker API的端口映射
首先确保你的Python API容器仅监听本地主机(避免直接暴露公网),修改Docker启动命令或docker-compose.yml:
- 如果用
docker run:docker run -d -p 127.0.0.1:8000:8000 --name your-api-container your-api-image - 如果用
docker-compose.yml,修改ports字段:services: api: image: your-api-image ports: - "127.0.0.1:8000:8000"
这里把API的容器端口(假设是8000)映射到主机的127.0.0.1:8000,仅允许Nginx本地转发请求。
2. 安装Nginx与Certbot
在Droplet上执行以下命令安装依赖:
sudo apt update && sudo apt install -y nginx certbot python3-certbot-nginx
Certbot用于自动获取Let's Encrypt免费SSL证书,并自动配置Nginx。
3. 配置Nginx反向代理
创建Nginx站点配置文件:
sudo nano /etc/nginx/sites-available/api.yourdomain.com
粘贴以下配置(替换api.yourdomain.com为你的实际域名):
# HTTP 服务,用于Certbot验证与重定向到HTTPS server { listen 80; server_name api.yourdomain.com; # 所有HTTP请求重定向到HTTPS return 301 https://$host$request_uri; } # HTTPS 服务,反向代理到Python API server { listen 443 ssl; server_name api.yourdomain.com; # SSL 证书路径(后续Certbot会自动填充) ssl_certificate /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.yourdomain.com/privkey.pem; # 反向代理配置 location / { proxy_pass http://127.0.0.1:8000; 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; } }
4. 启用配置并验证Nginx
创建软链接启用站点:
sudo ln -s /etc/nginx/sites-available/api.yourdomain.com /etc/nginx/sites-enabled/
测试Nginx配置是否合法:
sudo nginx -t
如果输出test is successful,重启Nginx生效:
sudo systemctl restart nginx
5. 获取并配置SSL证书
运行Certbot自动获取证书并更新Nginx配置:
sudo certbot --nginx -d api.yourdomain.com
按照终端提示操作:
- 输入邮箱接收证书过期提醒
- 同意服务条款
- 选择是否共享邮箱(可选)
- Certbot会自动配置SSL证书,并更新Nginx的HTTPS规则
6. 验证HTTPS访问
访问https://api.yourdomain.com/(替换为你的API实际端点),确认返回正常的API响应。同时检查HTTP请求(http://api.yourdomain.com)是否自动跳转到HTTPS。
7. (可选)NextJS前端的HTTPS配置
如果NextJS也部署在同一台Droplet,可以新增一个Nginx站点配置(比如/etc/nginx/sites-available/yourdomain.com),反向代理到NextJS的运行端口(假设是3000),同样用Certbot配置SSL:
server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; 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; } }
重复启用配置、验证Nginx、获取证书的步骤即可。
关键注意事项
- 确保DigitalOcean Droplet的防火墙(或Ufw)开放80和443端口:
sudo ufw allow 'Nginx Full' - 定期更新Certbot证书(默认自动续期,可通过
sudo certbot renew --dry-run测试) - 如果API容器使用自定义Docker网络,可直接用容器名作为
proxy_pass目标(比如http://api:8000),无需映射主机端口
内容的提问来源于stack exchange,提问作者Cole
相关产品推荐
相关产品推荐

