Django本地开发:如何兼顾example.com:8000访问与真实站点访问?
这个问题我之前帮朋友解决过,核心矛盾是DNS解析不区分端口——一旦把example.com指向localhost,所有端口的请求都会打到本地,自然没法访问真实站点。下面给你几个实用的解决方案,按推荐程度排序:
方案1:用子域名做开发(最简单,无冲突)
这是最省心的办法,既不影响主域名的正常访问,又能满足Django Sites框架的域名识别需求:
- 打开dnsmasq的配置文件(如果是brew安装的,一般是
/usr/local/etc/dnsmasq.conf,或者你可以在/etc/dnsmasq.d/下新建一个dev.conf文件),添加一行:address=/dev.example.com/127.0.0.1 - 重启dnsmasq生效:
sudo brew services restart dnsmasq - 去Django的后台,在Sites框架里新增一个站点,把域名设为
dev.example.com,配置好对应的站点信息。
这样你访问http://dev.example.com:8000就能直接指向本地开发服务器,而example.com仍然会正常解析到真实的线上站点,完全不会冲突。
方案2:本地反向代理(必须用主域名的情况)
如果你非得用example.com主域名做开发,那得靠Nginx这类反向代理来区分端口——让80/443端口的请求转发到真实站点,8000端口的请求转发到本地Django:
第一步:配置dnsmasq指向本地
先把example.com的DNS解析固定到localhost,在dnsmasq配置文件里加:
address=/example.com/127.0.0.1
重启dnsmasq生效。
第二步:用Nginx做端口转发
- 没装Nginx的话先装:
brew install nginx - 新建一个Nginx配置文件(比如
/usr/local/etc/nginx/servers/example.conf),内容如下:# 处理80端口请求,转发到真实的example.com server { listen 80; server_name example.com; location / { proxy_pass http://example.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # 处理8000端口请求,转发到本地Django服务器 server { listen 8000; server_name example.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # 可选:处理HTTPS请求,转发到真实站点的HTTPS server { listen 443 ssl; server_name example.com; # 可以用mkcert生成本地自签证书,填到下面的路径 ssl_certificate /path/to/your/local/cert.pem; ssl_certificate_key /path/to/your/local/key.pem; location / { proxy_pass https://example.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - 测试配置是否合法:
nginx -t - 重启Nginx:
brew services restart nginx
现在你访问http://example.com:8000就会打到本地Django,而直接访问http://example.com或https://example.com则会转发到真实的线上站点,完美兼顾两种需求。
方案3:动态切换DNS(临时开发用)
如果你只是偶尔需要用example.com指向本地,平时还是正常访问真实站点,可以写个简单脚本手动切换:
- 先准备两个状态的配置:
- 开发模式:在
/etc/dnsmasq.d/下建dev-example.conf,内容是address=/example.com/127.0.0.1 - 正常模式:把这个文件改名为
dev-example.conf.disabled(让dnsmasq忽略它)
- 开发模式:在
- 写个切换脚本
switch-dns.sh:#!/bin/bash CONF_FILE="/etc/dnsmasq.d/dev-example.conf" DISABLED_FILE="/etc/dnsmasq.d/dev-example.conf.disabled" if [ -f "$CONF_FILE" ]; then sudo mv "$CONF_FILE" "$DISABLED_FILE" echo "已切换到正常模式:example.com指向真实站点" else sudo mv "$DISABLED_FILE" "$CONF_FILE" echo "已切换到开发模式:example.com指向localhost" fi sudo brew services restart dnsmasq - 给脚本加执行权限:
chmod +x switch-dns.sh
开发前运行./switch-dns.sh切换到开发模式,用完再运行一次切回正常模式就行。
内容的提问来源于stack exchange,提问作者bodger
相关产品推荐
相关产品推荐

