如何在Heroku上正确关联Python aiohttp应用端口?解决H14错误
解决Heroku H14错误:将aiohttp应用的HTTP请求正确路由
这个问题的核心是Heroku的进程类型规则——只有标记为web的进程才会被平台分配HTTP路由,你当前用的worker进程是用来处理后台任务的,Heroku不会把外部HTTP请求转发给它,哪怕你的进程已经在监听端口,也会出现H14(无Web进程运行)的错误。
下面是具体的解决步骤:
1. 修改Procfile的进程类型
把你的Procfile内容从:
worker: python index.py
改成:
web: python index.py
这一步告诉Heroku,这个进程是处理Web请求的服务进程,平台会自动将HTTP流量路由到该进程监听的端口。
2. 确认代码正确监听Heroku的PORT环境变量
确保你的aiohttp代码确实在使用Heroku动态分配的端口,而不是硬编码端口号。示例代码应该类似这样:
import os from aiohttp import web async def hello(request): return web.Response(text="Hello from aioapp!") app = web.Application() app.add_routes([web.get('/', hello)]) if __name__ == '__main__': # 从环境变量获取端口,默认8080用于本地测试 port = int(os.environ.get('PORT', 8080)) web.run_app(app, port=port)
这里的关键是os.environ.get('PORT')——Heroku会在部署时动态设置这个环境变量,你的应用必须监听这个端口才能被正确访问。
3. 重新部署并验证进程状态
- 提交修改后的Procfile到Git:
git add Procfile git commit -m "Switch process type to web for HTTP routing" - 推送到Heroku:
git push heroku main - 确保web dyno处于运行状态(如果之前可能没启动的话):
heroku ps:scale web=1
4. 验证修复效果
- 用
heroku ps查看进程状态,应该显示类似web.1: up的状态 - 用
heroku logs --tail实时查看日志,确认web进程正常启动并监听了正确的端口 - 访问你的Heroku应用URL,应该能正常返回响应
简单总结:Heroku的路由系统只认web类型的进程,把Procfile里的进程类型改成web,再确保代码监听正确的端口,就能解决H14错误了。
内容的提问来源于stack exchange,提问作者Oleksiy
相关产品推荐
相关产品推荐

