一、 问题描述:
1. 在服务器已经成功开启Django项目镜像,将容器8000端口映射到服务器的8000端口。
[root@hcss-ecs-2ed1 Django]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c220bea13b90 my_django_app "python manage.py ..." 32 minutes ago Up 20 minutes 0.0.0.0:8000->8000/tcp competent_dubinsky
2. 但是通过公网IP加端口进行访问时,总是连接超时。
(Django) C:\Users\29735> curl -I http://1.92.100.245:8000/admin/
curl: (28) Failed to connect to 1.92.100.245 port 8000 after 21050 ms: Couldn't connect to server
3. 尝试进入镜像内部命令行进行访问,访问成功。
[root@hcss-ecs-2ed1 Django]# docker exec -it c220bea13b90 bash
root@c220bea13b90:/app# curl -I http://localhost:8000/admin
HTTP/1.1 301 Moved Permanently
Date: Mon, 06 May 2024 16:18:13 GMT
Server: WSGIServer/0.2 CPython/3.10.1
Content-Type: text/html; charset=utf-8
Location: /admin/
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
Vary: Origin
二、 解决思路:
1. 首先检测服务器公网IP是否可访问,可采用ping进行检测:
(Django) C:\Users\29735>ping 1.92.100.245
Pinging 1.92.100.245 with 32 bytes of data:
Reply from 1.92.100.245: bytes=32 time=62ms TTL=42
Reply from 1.92.100.245: bytes=32 time=56ms TTL=42
Reply from 1.92.100.245: bytes=32 time=69ms TTL=42
Reply from 1.92.100.245: bytes=32 time=52ms TTL=42
Ping statistics for 1.92.100.245:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 52ms, Maximum = 69ms, Average = 59ms
2. 若公网IP可访问,可进入项目内部bash,使用 curl -I 指令进行非跨域访问,检测项目是否正常运行。
root@c220bea13b90:/app# curl -I http://localhost:8000/admin
3. 若项目也正常运行,还可以检测源代码是否已经实现跨域,若一切都正常,可以查看是否为服务器防火墙未开放指定端口,可尝试直接关闭防火墙。使用以下代码可以开放指定端口8000。
sudo firewall-cmd --zone=public --add-port=8000/tcp --permanent
sudo firewall-cmd --reload
sudo systemctl status firewalld
4. 若以上方法都没有用,就得检查服务器的安全组是否开放了指定端口(笔者就是这个问题),进入服务器的管理界面,查看安全组设置。以华为云为例:
如果没有开放指定端口,可以自行添加。以Django后台8000端口为例:
5.Django后台添加指定端口后,如果出现拒绝访问,如下结果:
[root@hcss-ecs-2ed1 ~]# curl -I http://1.92.100.245:8000/admin/
curl: (7) Failed connect to 1.92.100.245:8000; Connection refused
需要进入Django项目根目录,有manage.py文件存在的目录,运行以下代码,允许所有ip访问该端口:
root@c220bea13b90:/app# python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
May 07, 2024 - 00:35:03
Django version 5.0.4, using settings 'Django.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
三、 总结:
经过以上的方法解决,就可以正常访问了。希望能解决你的问题。