この記事のポイント
- Ubuntu 24.04 LTS で Celery 5.4.0 + Redis + Flower 2.0.1 を実際に動かして確認
- Flower の WebUI(ポート 5555)からワーカー稼働状況・タスク履歴をブラウザで監視できる
- Celery Beat で
interval(秒数)とcrontab(曜日・時刻)の2種類のスケジュールを設定できる celery -A tasks worker --detachでバックグラウンド起動し、systemdで自動起動管理する流れを解説- 実測:
add()タスクが約 0.0015〜0.0019 秒で完了、全4タスクをキューに流して結果を確認
Celery の「タスクを投げて非同期に動かす」基礎は分かった。でも実際に本番で使おうとすると、「今ワーカーは生きているのか」「タスクがどこで詰まっているのか」が見えなくて困る——私が最初に詰まったのはここでした。
この記事では Flower を使ったリアルタイム監視とCelery Beat によるスケジューリングを実際に Ubuntu 24.04 LTS で動かして解説します。コマンドの実行ログと Flower の画面スクリーンショットも載せているので、自分の環境と照らし合わせながら読み進めてください。
動作確認済み環境
PRETTY_NAME=”Ubuntu 24.04.4 LTS”
$ python3 –version
Python 3.12.3

上表のパッケージバージョンで全手順を確認しています。redis-py(Pythonクライアント)と Redis サーバー本体はバージョンが異なるので混同しないようにしてください。
Celery の全体構成を把握する
手順に入る前に、コンポーネントの関係を整理しておきます。

登場人物は5つです。
- ブローカー(Redis):タスクを一時保管するメッセージキュー。Worker はここからタスクを取り出す
- Celery Worker:タスクを実際に実行するプロセス。複数起動して並列化できる
- Result Backend(Redis):タスクの実行結果を保存する場所。今回はブローカーと同じ Redis を使う
- Celery Beat:定期実行スケジューラ。cron のように決まったタイミングでタスクをブローカーに投入する
- Flower:Web監視ツール。ブラウザからワーカーの状態やタスク履歴を確認できる
インストール手順
手順1:Redis をインストールして起動する
$ sudo apt-get install -y redis-server
Setting up redis-server (5:7.0.15-1ubuntu0.24.04.4) …
$ sudo systemctl enable –now redis-server
$ redis-cli ping
PONG
PONG が返れば Redis は起動しています。Ubuntu 24.04 の apt パッケージは Redis 7.0.15 が入ります(2026-06-22 時点)。
手順2:Celery、Flower をインストールする
$ source ~/celery_env/bin/activate
(celery_env) $ pip install celery==5.4.0 redis==5.2.0 flower==2.0.1
Successfully installed celery-5.4.0 redis-5.2.0 flower-2.0.1
(celery_env) $ celery –version
5.4.0 (opalescent)

Ubuntu 24.04 でのパッケージ管理について
Ubuntu 24.04 以降、pip install をシステム Python に直接実行すると「externally-managed-environment」エラーが出ます。python3 -m venv ~/celery_env で仮想環境を作ってから使うか、--break-system-packages オプションをつけてください(プロダクション環境では仮想環境推奨)。
タスクの定義と Worker 起動
タスクファイルを作る
import os, time
from celery import Celery
BROKER_URL = os.environ.get(“CELERY_BROKER_URL”, “redis://localhost:6379/0”)
app = Celery(“tasks”, broker=BROKER_URL, backend=BROKER_URL)
app.conf.update(
task_serializer=”json”,
result_serializer=”json”,
timezone=”Asia/Tokyo”,
enable_utc=True,
)
@app.task
def add(x, y):
return x + y
@app.task
def multiply(x, y):
time.sleep(0.1) # 重い処理を模倣
return x * y
CELERY_BROKER_URL を環境変数で差し込む書き方にしておくと、本番環境への切り替えが楽です。
Worker をバックグラウンドで起動する
–loglevel=info \
–detach \
–logfile=/var/log/celery/worker.log \
–pidfile=/var/run/celery/worker.pid
[2026-06-22 …] celery@hostname ready.
--detach をつけるとデーモン化されます。ログは /var/log/celery/worker.log に追記されるので、tail -f で流しながら動作確認するのが私のやり方です。
タスクを投入して結果を確認する
>>> from tasks import add, multiply
>>> r1 = add.delay(10, 20)
>>> r2 = multiply.delay(6, 7)
>>> r1.get(timeout=10)
30
>>> r2.get(timeout=10)
42

実測では add() が約 0.0015〜0.0019 秒、multiply()(内部に 0.1 秒スリープあり)が約 0.102 秒で完了しました。Worker ログには Task tasks.add succeeded in 0.0015s: 300 のように実行時間が出るので、遅いタスクを特定するのに便利です。
Flower で Worker を監視する
Flower を起動する
INFO: Starting Flower 2.0.1
INFO: Operational endpoint. /healthcheck
INFO: Listening on: http://0.0.0.0:5555
ブラウザで http://<サーバーIP>:5555 にアクセスすると Flower のダッシュボードが開きます。
Flower ダッシュボード — メイン画面

ダッシュボードにはアクティブなワーカー数と、処理中・成功・失敗のタスク数がリアルタイムで表示されます。上の画面は Ubuntu 24.04 + Celery 5.4.0 + Flower 2.0.1 で実際に起動したものです。
Flower — Workers ページ

Workers ページでは 各ワーカーのホスト名・状態・処理済みタスク数を確認できます。ワーカーが落ちているとここに反映されるので、障害検知の起点として使えます。
Flower — Tasks ページ

Tasks ページにはタスク名・状態・開始時刻・実行時間が並びます。FAILURE のタスクがあれば引数とトレースバックもここで確認できます。デバッグで一番使うページです。
Flower — Monitor ページ

Monitor ページではタスク処理数の時系列グラフを確認できます。急にタスク数が増えたタイミングやワーカーの処理能力のボトルネックを視覚的に把握できます。
Flower をVPS に公開する場合の注意
デフォルトでは認証なしで誰でも閲覧できます。外部に公開する場合は --basic_auth=user:password オプションか、Nginx でリバースプロキシを立てて Basic 認証をかけてください。
Celery Beat でタスクをスケジューリングする
Celery Beat は cron に相当するスケジューラです。定期的にタスクをブローカーへ投入します。Worker と Beat は別プロセスなので、両方を起動しないとタスクは実行されません。
スケジュール設定(tasks.py に追記)
app.conf.beat_schedule = {
“add-every-30-seconds”: {
“task”: “tasks.add”,
“schedule”: 30.0, # 30秒ごとに実行
“args”: (16, 16),
},
“cleanup-every-morning”: {
“task”: “tasks.cleanup”,
“schedule”: crontab(hour=2, minute=0), # 毎朝 2:00
},
“weekly-report”: {
“task”: “tasks.send_report”,
“schedule”: crontab(day_of_week=”monday”, hour=9, minute=0),
},
}

上図は実際に Ubuntu 24.04 + Celery 5.4.0 で定義を確認したものです。crontab オブジェクトの文字列表現 <crontab: 0 2 * * * (m/h/dM/MY/d)> が Linux cron の書式と同じ順序で並んでいるのを確認できます。
Beat を起動する
–loglevel=info \
–detach \
–logfile=/var/log/celery/beat.log \
–pidfile=/var/run/celery/beat.pid
[INFO] beat: Starting…
[INFO] Scheduler: Sending due task add-every-30-seconds (tasks.add)
Beat は別ターミナルか --detach でバックグラウンド起動します。Beat ログに Sending due task ... が流れれば正常にタスクを投入できています。
Beat は必ず1プロセスだけ
Beat を複数起動すると同じタスクが重複実行されます。Worker は複数起動して構いませんが、Beat は必ず1プロセスで管理してください。celerybeat.pid ファイルが残っている場合は削除してから起動します。
systemd でプロセス管理する
VPS で本番運用する場合は systemd に登録してサーバー起動時に自動起動させます。
[Unit]
Description=Celery Worker
After=network.target redis.service
[Service]
Type=forking
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/myproject
ExecStart=/home/ubuntu/celery_env/bin/celery \
-A tasks worker –detach \
–logfile=/var/log/celery/worker.log \
–pidfile=/var/run/celery/worker.pid
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload
$ sudo systemctl enable –now celery-worker
Created symlink … → /etc/systemd/system/celery-worker.service.
After=redis.service を指定しておくと Redis 起動後に Worker が立ち上がるので、サーバー再起動時の順序問題を防げます。Beat も同じ要領で celery-beat.service を作成してください。
よくあるエラーと解決策
① Connection refused — Redis に繋がらない
redis-cli ping を実行して Redis が起動しているか確認します。Redis が落ちている場合は sudo systemctl start redis-server で起動してください。
② broker_connection_retry_on_startup 警告
longer determine whether broker connection retries are made during startup
in Celery 6.0 and above.
Celery 5.4 以降で出る警告です。app.conf.broker_connection_retry_on_startup = True を追加しておくと消えます。動作には影響しませんが、Celery 6.0 対応として入れておくと安心です。
③ タスクが Flower に表示されない
Flower はデフォルトで最近のタスク履歴だけを表示します。celery -A tasks flower --persistent=True --db=/tmp/flower.db のように永続化オプションを追加すると再起動後もタスク履歴を保持できます。
④ Beat のタスクが重複実行される
Beat が複数起動しています。ps aux | grep celery で確認し、余分なプロセスを kill してください。/var/run/celery/beat.pid が残っている場合は削除してから起動します。
まとめ
Ubuntu 24.04 LTS + Celery 5.4.0 + Redis 7.0.15 + Flower 2.0.1 の組み合わせで、実際にタスクを動かしながら確認しました。
- Celery Worker は
--detachでバックグラウンド起動、systemdで自動起動管理 - Flower(ポート 5555)でワーカー稼働状況・タスク履歴・処理グラフをブラウザで監視できる
- Celery Beat の
beat_scheduleでinterval(秒数)とcrontab(cron 書式)の2種類のスケジュールを定義できる - Beat は必ず1プロセスだけ起動する
- 外部公開するなら Flower に Basic 認証か Nginx のリバースプロキシをかける
Celery の応用として次のステップは、タスクの優先度付けとキューの分離です。重いタスクと軽いタスクを別キューに振り分けて Worker を分けると、重い処理が軽いタスクをブロックしなくなります。
VPS で本格的に Celery を動かすなら、メモリと CPU が確保できる環境が必要です。下の記事で各 VPS のスペックと料金を実測ベンチで比較しています。


コメント