如何通过NGINX+UWSGI实现本地IP服务映射公网IP/端口访问
公网访问本地Django应用配置方案
核心故障原因
公网IP访问返回页面找不到,是请求匹配规则未覆盖公网请求、转发规则配置方向错误共同导致的,按以下步骤修改即可:
1. 调整Nginx服务配置
当前Nginx的server_name仅配置了内网IP,公网请求携带的Host头为你的公网IP,无法命中当前server块,会被Nginx默认站点返回404。
- 找到Nginx配置中server块的
server_name配置项,将公网IP加入匹配列表,临时调试也可以直接用通配符_匹配所有未命中其他规则的请求:
upstream django { server unix:///my_path/my_project.sock; } server { listen 80; # 替换为你实际的内网IP、公网IP,后续绑定域名可直接追加在后面 server_name 你的内网IP 你的公网IP; # 临时调试可直接写 server_name _; charset utf-8; client_max_body_size 75M; location /media { alias /my_path/media; } location /static { alias /my_path/static; } location / { uwsgi_pass django; include /my_path/uwsgi_params; } }
- 配置修改完成后先执行
nginx -t检查语法正确性,确认无报错后执行nginx -s reload重载配置生效。
2. 更新Django白名单配置
Django的ALLOWED_HOSTS配置会对请求的Host头做白名单校验,当前仅配置内网IP的情况下,公网IP发起的请求会被Django直接拦截返回错误。
- 打开项目的
settings.py文件,将公网IP加入ALLOWED_HOSTS列表:
# 替换为实际的IP值,本地回环地址可一并加上方便本地调试 ALLOWED_HOSTS = ['你的内网IP', '你的公网IP', '127.0.0.1', 'localhost']
- 修改完成后重启uWSGI进程,让Django配置生效。
3. 修正防火墙/端口映射规则
你之前配置的“本地IP到公网IP的转发规则”方向错误,正确的规则配置要求:
- 在出口网关/防火墙配置入方向DNAT规则:将公网IP的80端口TCP请求,转发到内网服务器的本地IP 80端口
- 放开网关/防火墙公网入方向80端口的访问权限,不要拦截公网来源的80端口请求
- 检查服务器本地系统防火墙(firewalld/ufw/iptables)的入站规则,确认80端口对所有来源放开,不要仅限制内网段访问
4. 访问验证
按顺序做连通性校验:
- 在本地服务器执行
curl 127.0.0.1,确认本地服务正常 - 同内网其他设备访问
http://你的内网IP,确认内网访问正常 - 手机断开内网WiFi、使用移动流量访问
http://你的公网IP,确认公网访问正常
注意:如果运营商分配的IP是100.64开头的地址,属于运营商级NAT的内网地址,不是真正可直接映射的公网IP,需要联系运营商调整。
内容的提问来源于stack exchange,提问作者Mohamed Abdillah
相关产品推荐
相关产品推荐

