我已经设法让它发挥作用,尽管我对此不太满意。我很快就会转向 postgreSQL 数据库。这是我所做的:
wsgi_mod-express 有一个名为 service-script 的选项,它除了实际应用程序之外还启动一个附加进程。所以我更新了我的app.sh:
#!/bin/bash
ARGS=""
ARGS="$ARGS --log-to-terminal"
ARGS="$ARGS --port 8080"
ARGS="$ARGS --url-alias /static wsgi/static"
ARGS="$ARGS --service-script celery_starter scripts/startCelery.py"
exec mod_wsgi-express start-server $ARGS wsgi/application
请注意最后 ARGS=... 行。
我创建了一个 python 脚本来启动我的 celery 工作程序并进行节拍。
启动Celery.py:
import subprocess
OPENSHIFT_REPO_DIR="/opt/app-root/src"
OPENSHIFT_DATA_DIR="/opt/app-root/src/data"
pathToManagePy=OPENSHIFT_REPO_DIR + "/wsgi/podpub"
worker_cmd = [
"python",
pathToManagePy + "/manage.py",
"celery",
"worker",
"--pidfile="+OPENSHIFT_REPO_DIR+"/%n.pid",
"--logfile="+OPENSHIFT_DATA_DIR+"/celery/log/%n.log",
"-c 1",
"--autoreload"
]
print(worker_cmd)
subprocess.Popen(worker_cmd, close_fds=True)
beat_cmd = [
"python",
pathToManagePy + "/manage.py",
"celery",
"beat",
"--pidfile="+OPENSHIFT_REPO_DIR+"/celeryd.pid",
"--logfile="+OPENSHIFT_DATA_DIR+"/celery/log/celeryd.log",
]
print(beat_cmd)
subprocess.Popen(beat_cmd)
这实际上是有效的,但是当我尝试启动 celery 工作程序时,我不断收到一条消息说
”当工作程序接受用 pickle 序列化的消息时,以超级用户权限运行工作程序是一个非常糟糕的主意!
如果您确实想继续,则必须设置 C_FORCE_ROOT 环境变量(但请在执行此操作之前考虑一下)。"
尽管我将这些配置添加到我的settings.py中以删除pickle序列化器,但它仍然给我同样的错误消息。
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACEEPT_CONTENT = ['json']
我不知道为什么。
最后我将 C_FORCE_ROOT 添加到我的 .s2i/environment
C_FORCE_ROOT=true
现在它正在发挥作用,至少我是这么认为的。我的下一份工作将在几个小时内完成。我仍然愿意接受任何进一步的建议和提示。