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

Django+Gunicorn+Nginx环境下Django Admin删用户超时求助

解决Django Admin删除大量关联数据时的504超时问题

嘿,我之前处理过完全一样的场景!你已经调整了Gunicorn和Nginx的超时参数,但依然卡在60秒,说明还有隐藏的超时控制环节没覆盖到,咱们逐一排查解决:

1. 检查systemd的超时配置(如果用systemd管理Gunicorn)

很多人用systemd作为Gunicorn的启动管理器,但systemd默认有超时限制(部分发行版默认60秒),如果Gunicorn的worker处理请求时间超过这个值,systemd会直接杀掉进程,导致Nginx返回504。

  • 找到你的Gunicorn systemd配置文件(通常在/etc/systemd/system/gunicorn.service)
  • 添加或修改以下参数:
    [Service]
    # 禁用超时限制,或者设为足够大的值(比如30分钟)
    TimeoutStartSec=infinity
    TimeoutStopSec=infinity
    
  • 重新加载systemd配置并重启Gunicorn:
    sudo systemctl daemon-reload
    sudo systemctl restart gunicorn
    

2. 检查数据库的语句超时设置

如果你的数据库(比如PostgreSQL、MySQL)有默认的语句超时限制,比如PostgreSQL的statement_timeout默认可能是60秒,当删除大量关联数据的SQL语句执行超过这个时间,数据库会主动断开连接,导致Gunicorn的请求失败。

PostgreSQL示例:

  • 进入数据库控制台,修改超时设置:
    -- 临时设置会话级超时(30分钟,单位毫秒)
    SET statement_timeout = 1800000;
    -- 永久修改(需编辑postgresql.conf文件后重启数据库)
    statement_timeout = 1800000
    

MySQL示例:

  • 修改连接超时参数:
    SET GLOBAL wait_timeout = 1800;
    SET GLOBAL interactive_timeout = 1800;
    
    也可以编辑my.cnf配置文件后重启数据库,永久生效。

3. 从根源优化:异步处理删除任务

同步删除大量关联数据本身就不是最优方案,哪怕调大超时,也可能占用过多资源影响其他请求。更合理的做法是把删除操作放到后台异步执行:

  • 用Celery实现异步删除(需要先配置Redis/RabbitMQ作为消息队列):
    1. 编写异步任务:
      # tasks.py
      from celery import shared_task
      from django.contrib.auth.models import User
      
      @shared_task
      def bulk_delete_users(user_ids):
          # 批量删除,自动处理Django的级联删除逻辑
          User.objects.filter(id__in=user_ids).delete()
      
    2. 在Admin中自定义删除动作,替换默认的同步删除:
      # admin.py
      from django.contrib import admin
      from django.contrib.auth.models import User
      from .tasks import bulk_delete_users
      
      class UserAdmin(admin.ModelAdmin):
          actions = ['bulk_delete_async']
      
          def bulk_delete_async(self, request, queryset):
              user_ids = list(queryset.values_list('id', flat=True))
              bulk_delete_users.delay(user_ids)
              self.message_user(request, "删除任务已提交到后台,稍后完成")
      
      admin.site.unregister(User)
      admin.site.register(User, UserAdmin)
      
    这样用户在Admin点击删除后会立即收到反馈,后台异步执行删除,完全避免超时问题。

4. 检查其他中间件/代理的超时

如果你的部署架构中还有其他中间件(比如Cloudflare、负载均衡器),这些服务也可能有默认的60秒超时限制,需要进入对应控制台调整超时参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:33:48