1. 程式人生 > >使用supervisor 啟動 celery 並根據不同的環境需求,配置環境變數

使用supervisor 啟動 celery 並根據不同的環境需求,配置環境變數

以為在做公司專案,所以當然有開發環境和生產環境。我們公司使用 Jenkins來實現自動部署,將 Jenkins 生成的 docker部署到AWS上.

我們專案使用supervisor來啟動服務。

但是由於同一個專案要做開發環境進行開發測試,然後再能部署到生產環境,而且我們公司的開發環境和生產環境是物理隔離的,所以必須要有兩套不一樣的環境。

查了很久 最終還是在官網上查到了配置方法。(不過官網文件有些混亂 等我想第二次查詢時 已經找不到了。)

不多說 直接上程式碼

在主要的task 檔案中需要加上預設的環境配置

from celery import Celery
import os

#: Set default configuration module name
os.environ.setdefault('CELERY_CONFIG_MODULE', 'celerytask.celeryconfig')
celery_environment =os.environ.setdefault('CELERY_CONFIG_MODULE', 'celerytask.celeryconfig')

if celery_environment=="celerytask.celeryconfig-dev":
    rw.set_conf_name("develop")
app = Celery()
app.config_from_envvar('CELERY_CONFIG_MODULE')


@app.task()
def run_algorithm(a, b):
    return a+b

然後就是兩個不一樣的配置檔案 celeryconfig.py 以及celeryconfig-dev.py (這個名字隨意起)

celeryconfig.py (prod 環境的 配置檔案)

from kombu import Exchange, Queue

BROKER_URL = '你的 prod BROKER_URL'
RESULT_BACKEND = '你的 prod RESULT_BACKEND'

# defintion a exchange
default_exchange = Exchange('dedfault', type='direct')
my_exchange = Exchange('routeExchange', type='direct')

#一些其他配置引數

CELERY_QUEUES = (
    Queue('default', default_exchange, routing_key='default'),
    Queue('routeAlgorithm', my_exchange, routing_key='routeAlgorithm')
)


CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = 'default'
CELERY_DEFAULT_ROUTING_KEY = 'default'

CELERY_ROUTES = (
    {'tasks.run_algorithm': {
        'queue': 'routeAlgorithm',
        'routing_key': 'routeAlgorithm'
    }
    },
)

CELERY_IMPORTS = ("tasks",)

celeryconfig-dev.py (dev 環境的 配置檔案) 

from kombu import Exchange, Queue

BROKER_URL = '你的 dev BROKER_URL'
RESULT_BACKEND = '你的 dev RESULT_BACKEND'

# defintion a exchange
default_exchange = Exchange('dedfault', type='direct')
my_exchange = Exchange('routeExchange', type='direct')

#一些其他配置引數

CELERY_QUEUES = (
    Queue('default', default_exchange, routing_key='default'),
    Queue('routeAlgorithm', my_exchange, routing_key='routeAlgorithm')
)


CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = 'default'
CELERY_DEFAULT_ROUTING_KEY = 'default'

CELERY_ROUTES = (
    {'tasks.run_algorithm': {
        'queue': 'routeAlgorithm',
        'routing_key': 'routeAlgorithm'
    }
    },
)

CELERY_IMPORTS = ("tasks",)

這裡是 Dev環境中需要啟動的 supervisord.conf

[supervisord]
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx
[program:uwsgi]
command =/usr/local/bin/uwsgi --ini  /var/www/app/conf/uwsgi-dev.ini

[program:celery]
#Set full path to celery program if using virtualenv
command=celery worker -A tasks --loglevel=INFO
directory=/var/www/app/celerytask
environment=CELERY_CONFIG_MODULE="celerytask.celeryconfig-dev"

autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600

下面是 prod環境中的 supervisord.conf

[supervisord]
nodaemon=true

[program:nginx]
command=/usr/sbin/nginx

[program:uwsgi]
command =/usr/local/bin/uwsgi --ini  /var/www/app/conf/uwsgi.ini

[program:celery]
; Set full path to celery program if using virtualenv
command=celery worker -A tasks --loglevel=INFO

directory=/var/www/app/celerytask
environment=CELERY_CONFIG_MODULE="celerytask.celeryconfig"

autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600

唯一的區別就是  在這裡改成你專案的配置檔名,分清不同環境。

environment=CELERY_CONFIG_MODULE="celerytask.celeryconfig"