如何在EC2上开放8080端口用于HTTPS访问?解决Docker化Django连接问题
解决EC2上8080端口开放及Docker化Django的浏览器访问问题
1. 先搞定EC2安全组(核心环节)
EC2的入站规则必须放通8080端口,否则外部流量根本进不来:
- 登录AWS控制台,找到你的EC2实例,点进它关联的安全组
- 切换到「入站规则」标签,点「编辑入站规则」
- 加两条规则(按需选):
- 仅限自己访问:类型选「自定义TCP」,端口填
8080,源地址填你的本地公网IP(格式xxx.xxx.xxx.xxx/32) - 测试用全网访问:类型选「自定义TCP」,端口填
8080,源地址选「0.0.0.0/0」(生产环境别这么搞)
- 仅限自己访问:类型选「自定义TCP」,端口填
- 保存规则
2. 检查EC2本地防火墙
如果EC2开了本地防火墙(比如ufw或者iptables),也得给8080开绿灯:
Ubuntu/用ufw的系统:
# 允许8080的TCP流量 sudo ufw allow 8080/tcp # 重启防火墙生效 sudo ufw reload
Amazon Linux/用iptables的系统:
# 添加放行规则 sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT # 保存规则(Amazon Linux用这个) sudo service iptables save
3. 确认Docker端口映射没搞错
本地跑正常,EC2不行?大概率是容器端口映射没做对:
- 启动容器时,必须把容器内的Django端口(默认是8000)映射到EC2的8080:
docker run -d -p 8080:8000 你的Django镜像名
- 用
docker ps检查映射状态,输出里得有0.0.0.0:8080->8000/tcp这行,说明端口绑定正确
4. 让Django服务绑定0.0.0.0
Django默认只绑定127.0.0.1,只能容器内部访问,必须改成绑定所有地址:
- 用runserver启动时:
python manage.py runserver 0.0.0.0:8000
- 用Gunicorn等生产服务器的话,同样要绑定
0.0.0.0:
gunicorn --bind 0.0.0.0:8000 你的项目名.wsgi:application
5. 给8080加HTTPS的两种方式
如果要让8080走HTTPS,分两种场景:
测试用:容器内直接配HTTPS
- 修改Django的
settings.py:
SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True
- 启动时带上证书(仅测试,生产别这么干):
python manage.py runserver 0.0.0.0:8080 --cert-file /你的证书路径/cert.pem --key-file /你的密钥路径/key.pem
生产用:Nginx反向代理(推荐)
- 在EC2上装Nginx,让它处理HTTPS,再转发到Docker容器:
- 安装Nginx:Ubuntu用
sudo apt install nginx,Amazon Linux用sudo yum install nginx - 创建Nginx配置文件
/etc/nginx/sites-available/django:
server { listen 8080 ssl; server_name 你的EC2公网IP; ssl_certificate /你的证书路径/cert.pem; ssl_certificate_key /你的密钥路径/key.pem; location / { proxy_pass http://localhost:8080; # 对应Docker映射的EC2端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }- 启用配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled/ sudo nginx -t # 检查配置是否合法 sudo systemctl restart nginx - 安装Nginx:Ubuntu用
6. 最后测试
做完上面的步骤,浏览器直接访问http://<你的EC2公网IP>:8080(配了HTTPS就用https://)。如果还是连不上,排查这几点:
- 别用EC2的私有IP,一定要用公网IP
- 用
docker logs <容器ID>看容器日志,有没有报错 - 在EC2本地用
curl http://localhost:8080测试,如果能返回内容,说明本地没问题,问题出在安全组或防火墙
内容的提问来源于stack exchange,提问作者tgmjack
相关产品推荐
相关产品推荐

