You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Apache2上部署FastAPI应用?

在Apache 2.4上部署FastAPI应用的完整指南

看起来你遇到的核心问题是:FastAPI是ASGI类型的Web应用,而Apache本身并不直接支持ASGI协议——它只能处理静态文件或者通过网关转发请求给WSGI/ASGI服务器。你的现有Apache配置只是指向了目录,没有设置反向代理,所以根本没法把请求传递给你的FastAPI应用。

下面是一步步的解决方案,结合你的环境(Python 3.8.9、FastAPI 0.65.2、Apache 2.4.29)来实现:

1. 先确保你的FastAPI应用本身能正常运行

在部署到Apache之前,先验证应用单独运行没问题:

  • 进入你的项目目录,激活虚拟环境(如果用了的话)
  • 运行Uvicorn直接启动应用:
    uvicorn main:app --host 0.0.0.0 --port 8000
    
    (把main换成你的Python文件名,比如如果你的代码在bot_wrapper.py里,就写bot_wrapper:app)
  • 本地访问http://localhost:8000/docs,确认FastAPI的自动文档页面能打开,并且测试/telegram_sender/接口能正常工作(比如用页面里的"Try it out"功能)。

如果这一步有问题,先排查应用本身的错误(比如verifier模块是否能正确导入、启动事件是否报错),再继续后续步骤。

2. 用Gunicorn + Uvicorn Worker运行应用(生产环境推荐)

直接用Uvicorn虽然能跑,但生产环境更推荐用Gunicorn作为进程管理器,搭配Uvicorn的ASGI Worker,这样更稳定、能处理更多并发:

  • 安装依赖:
    pip install gunicorn uvicorn
    
  • 测试启动命令:
    gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 127.0.0.1:8000
    
    这里--workers 4可以根据你的服务器CPU核心数调整(一般是核心数×2+1),--bind 127.0.0.1:8000让服务只监听本地端口,更安全。
  • 再次访问http://localhost:8000/docs确认服务正常。

3. 配置Apache反向代理

修改你的Apache虚拟主机配置,把请求转发到Gunicorn/Uvicorn运行的8000端口:

<VirtualHost *:80>
    ServerName gargarsa.sms.local
    ServerAdmin webmaster@localhost

    # 关键:把所有请求反向代理到本地的FastAPI服务
    ProxyPass / http://127.0.0.1:8000/
    ProxyPassReverse / http://127.0.0.1:8000/

    # 日志配置(保留你原来的即可)
    ErrorLog ${APACHE_LOG_DIR}/gargarsa.sms.local-error.log
    LogLevel debug
    CustomLog ${APACHE_LOG_DIR}/gargarsa.sms.local-access.log combined
</VirtualHost>

然后启用Apache的反向代理模块:

sudo a2enmod proxy proxy_http
sudo systemctl restart apache2

4. 用Systemd管理FastAPI服务(避免Screen的不稳定)

用Screen运行服务的问题是服务器重启后进程会消失,推荐用Systemd把服务做成系统服务,开机自动启动:

  • 创建服务文件/etc/systemd/system/fastapi-sms.service:
    [Unit]
    Description=FastAPI SMS Wrapper Service
    After=network.target
    
    [Service]
    User=www-data
    Group=www-data
    WorkingDirectory=/var/www/verify_bot_api/src/app  # 替换成你的应用代码所在目录
    Environment="PATH=/var/www/verify_bot_api/venv/bin"  # 替换成你的虚拟环境bin目录路径
    ExecStart=/var/www/verify_bot_api/venv/bin/gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 127.0.0.1:8000
    
    [Install]
    WantedBy=multi-user.target
    
  • 启动并启用服务:
    sudo systemctl daemon-reload
    sudo systemctl start fastapi-sms
    sudo systemctl enable fastapi-sms
    

你可以用sudo systemctl status fastapi-sms查看服务状态,确保它正常运行。

5. 最后测试访问

现在访问http://gargarsa.sms.local/docs,应该就能看到FastAPI的文档页面,并且可以正常调用你的/telegram_sender/接口了。

常见问题排查

  • 权限问题:确保www-data用户能访问你的应用目录和虚拟环境,必要时用sudo chown -R www-data:www-data /var/www/verify_bot_api调整权限。
  • 防火墙:如果服务器有防火墙,确保80端口对外开放,8000端口只允许本地访问(不需要对外暴露)。
  • 虚拟环境路径:不要写错虚拟环境的路径,确保ExecStart里的gunicorn是虚拟环境中的版本,而不是系统全局的Python版本。

内容的提问来源于stack exchange,提问作者NegassaB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:02:54