小能豆

docker 里面用 gunicorn 启动Django服务 代码加载两次

javascript

docker里面用gunicorn 启动Django服务 代码加载两次

用 gunicorn 启动 django 服务

/usr/local/bin/gunicorn QaPlatform.wsgi:application -c gunicorn.conf.py

下面是gunicorn.conf.py 文件的参数

workers=1 # 并行工作进程数
threads=10 # 指定每个工作者的线程数
bind=[‘0.0.0.0:8001’] # 监听内网端口8000
proc_name=’qaServer’ # 进程名称
pidfile=’/tmp/qaServer.pid’ # 设置进程文件目录
worker_class=’gthread’ # 工作模式协程
timeout=30 # 超时
max_requests=6000 # 最大请求数

`

  • 功能: Django启动服务后 启动定时任务执行逻辑
    -本地环境用runnserver 启动会有两个进程 定时任务启动两次 查询说有一个是 检测代码自动重载的进程 加 –no reload 选项,可以解决
  • 然后是gunicorn 启动服务,gunicorn 在本地启动服务 只启动一个服务进程 定时任务只有一个,没有问题
  • 部署到服务器后 gunicorn启动 每次都是有两个服务进程,定时任务也是两个,

阅读 45

收藏
2024-06-23

共1个答案

小能豆

在 Docker 中使用 Gunicorn 启动 Django 服务时,出现了代码加载两次的问题。这通常与 Gunicorn 的配置和 Docker 的行为有关。

可能的原因

  1. Gunicorn 配置问题
  2. Gunicorn 的配置可能导致它启动多个进程或线程,从而导致代码被加载多次。

  3. Docker 容器行为

  4. Docker 容器可能被配置为自动重启,从而导致 Gunicorn 服务启动多次。

解决方案

1. 检查 Gunicorn 配置

首先,确保 Gunicorn 的配置正确,特别是 workersthreads 的设置:

  • workers 指定并行工作进程数,如果设置为 1 则只启动一个进程。
  • threads 指定每个工作者的线程数。

在你的配置中:

workers = 1  # 并行工作进程数
threads = 10  # 指定每个工作者的线程数
bind = ['0.0.0.0:8001']  # 监听内网端口8000
proc_name = 'qaServer'  # 进程名称
pidfile = '/tmp/qaServer.pid'  # 设置进程文件目录
worker_class = 'gthread'  # 工作模式协程
timeout = 30  # 超时
max_requests = 6000  # 最大请求数

确保 workers 设置为 1,以避免启动多个进程。

2. 确保 Docker 容器不自动重启

在 Docker 中,如果容器被配置为自动重启,它可能会启动多个 Gunicorn 进程。检查你的 Docker 配置,确保没有配置自动重启策略。

3. 使用 Django 的单实例启动方法

如果你在启动 Django 时有定时任务,可以使用单实例启动方法。例如,使用 runserver 时可以添加 --noreload 选项以避免代码被加载多次:

python manage.py runserver --noreload

4. 在 Docker 中使用 Gunicorn 启动 Django 服务

在 Docker 中启动 Gunicorn 时,可以确保只启动一个进程。例如,创建一个 Dockerfile 来配置你的服务:

FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . /app

# 安装依赖
RUN pip install -r requirements.txt

# 启动 Gunicorn
CMD ["gunicorn", "QaPlatform.wsgi:application", "-c", "gunicorn.conf.py"]

然后使用以下命令构建和运行 Docker 容器:

docker build -t my-django-app .
docker run -p 8001:8001 my-django-app

结论

通过正确配置 Gunicorn 和 Docker,你可以避免 Django 服务启动多次的问题。如果问题仍然存在,请检查是否有其他进程或服务在启动多个实例,或考虑在代码中添加日志记录以调试问题。

2024-06-23