ec2 尝试使用 systemd 启动守护进程时出现 Django celery worker 错误

Django celery worker error on ec2 trying to start daemon process with systemd

我正在尝试在我的 ec2 服务器上使用 celery 作为守护进程,并且到目前为止一直在遵循 this 教程。每次我尝试启动 celery worker 守护进程时,日志 returns 都会出现以下错误:

systemd[1]: celery.service: Failed to load environment files: No such file or directory
systemd[1]: celery.service: Failed to run 'start' task: No such file or directory
systemd[1]: celery.service: Failed with result 'resources'.
systemd[1]: Failed to start Celery Service.

当我运行工作人员使用

celery -A project_name worker --loglevel=INFO

celery 运行s 符合预期,但在我退出服务器时关闭。任何解决此错误的帮助将不胜感激,因为我是这里的初学者。所有相关文件如下:

celery.conf

# celery.conf

CELERYD_NODES="w1"
CELERY_BIN="path/to/project/directory/env/bin/celery"
CELERY_APP="project_name"
CELERYD_MULTI="multi"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"

celery.service

[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking
User=username
Group=groupname
EnvironmentFile=/path/to/environmentfile/celery.conf
WorkingDirectory=path/to/project/directory/env/bin/
ExecStart=/bin/sh -c '${CELERY_BIN} -A ${CELERY_APP} multi start ${CELERYD_NODES} \
  --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
  --pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} -A ${CELERY_APP} multi restart ${CELERYD_NODES} \
  --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'

[Install]
WantedBy=multi-user.target

django 设置:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
    'profiles_api',
    "push_notifications",

]

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ]
}


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'profiles_project.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'profiles_project.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'name',
        'USER': 'name',
        'PASSWORD': '***',
        'HOST': '', # Or an IP Address that your DB is hosted on
        'PORT': '',
    },
}
#

# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'

AUTH_USER_MODEL = 'profiles_api.UserProfile'

STATIC_ROOT = 'static/'

# celery
BROKER_URL = 'redis://localhost:5555'
RESULT_BACKEND = 'redis://localhost:5555'
ACCEPT_CONTENT = ['application/json']
RESULT_SERIALIZER = 'json'
TASK_SERIALIZER = 'json'

我已通过编辑我的 celery.service 文件来解决问题

celery.service

[Unit]
Description=Celery Service
After=network.target

    [Service]
    #Type=forking
    User=username
    Group=groupname
    KillMode=control-group
    RemainAfterExit=yes
    WorkingDirectory=path/to/project/directory
    Restart=yes
    #PassEnvironment=CELERYD_NODES CELERY_BIN CELERY_APP CELERYD_MULTI CELERYD_PID_FILE CELERYD_LOG_FILE CELERYD_LOG_LEVEL
    
    ExecStart=path/to/project/directory/env/bin/celery -A project_name worker --loglevel=INFO
    
    ExecStop=path/to/project/directory/env/bin/celery -A project_name worker --loglevel=INFO
    
    
    
    ExecReload=path/to/project/directory/env/bin/celery -A project_name worker --loglevel=INFO
    
    
    [Install]
    WantedBy=multi-user.target