在Hetzner托管服务器部署Django应用的问题排查
问题分析与解决方案
核心问题
你当前的部署逻辑完全错误:定时任务无法维持Django服务持续运行——它只是周期性执行脚本(甚至你的命令没加runserver参数,连开发服务器都没启动)。你看到的index页面要么是静态文件,要么是Apache直接返回的文件内容,但Django的路由系统根本没在工作。点击/reg/这类路径时,Apache会去文件系统找对应的目录/文件,找不到就返回404。
关于Docker和Nginx的说明
Hetzner的WordPress托管属于共享Web托管,这类环境默认用Apache+Passenger(或WSGI模块)部署Python应用:
- 不需要Docker:共享托管服务商几乎不允许使用Docker,且完全没必要用它部署简单的Django应用
- 不需要自行配置Nginx:服务商已经配置好Web服务器,你只需要让服务器把请求转发给Django即可
正确部署步骤
1. 删除无效定时任务
直接删掉执行manage.py的定时任务——它除了浪费资源毫无作用,定时任务是用来跑周期性脚本(比如定时清理数据),不是用来维持Web服务的。
2. 配置Passenger WSGI入口文件
在你的Django项目根目录(/usr/home/username/public_html/testbox/)创建passenger_wsgi.py文件,内容如下:
import sys, os # 将项目根目录加入Python路径 sys.path.insert(0, os.path.dirname(__file__)) # 设置Django的配置模块 os.environ['DJANGO_SETTINGS_MODULE'] = 'testbox.settings' # 初始化Django WSGI应用 from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
3. 调整Django项目配置
修改testbox/settings.py:
- 允许你的子域名访问:
ALLOWED_HOSTS = ['your-subdomain.example.com', 'localhost'] # 替换成你的实际子域名 - 设置静态文件收集目录(确保Apache能正确加载CSS):
STATIC_ROOT = os.path.join(BASE_DIR, 'static') - 执行静态文件收集:
执行时输入cd /usr/home/username/public_html/testbox/ python3 manage.py collectstaticyes确认,静态文件会被统一收集到static/目录。
4. 配置托管面板的子域名设置
登录Hetzner控制面板,找到你的子域名管理:
- 将子域名的文档根目录设置为Django项目的根目录(
/usr/home/username/public_html/testbox/) - 确保选择的Python版本和你安装Django的版本匹配
5. 添加.htaccess触发Passenger重启
在项目根目录创建.htaccess文件,内容:
# 指定Python解释器路径 PassengerPython /usr/bin/python3 # 指定Django应用根目录 PassengerAppRoot /usr/home/username/public_html/testbox/
修改这个文件会触发Passenger自动重启应用,加载你的Django配置。
验证部署
完成上述步骤后,访问你的子域名:
- 首页会由Django渲染(而非静态文件)
- 点击
/reg/等路径时,Django路由系统会正常处理请求,不会再返回404
内容的提问来源于stack exchange,提问作者DerJK
相关产品推荐
相关产品推荐

