Celery on Ubuntu — 非同期タスクキューワーカーのセットアップ

開発環境

Pythonアプリケーションで「メール送信を非同期で処理したい」「重い画像処理をバックグラウンドで回したい」という場面に、Celery は Ubuntu 上で最もよく使われる非同期タスクキューライブラリです。結論から言うと、pip install celery redis でインストールし、Redis をブローカーとして使えばすぐに動きます。

この記事では ubuntu:24.04 の Docker 公式イメージで実際にコマンドを動かし、Celery ワーカーのセットアップから動作確認までを一通り解説します。

この記事のポイント

  • Ubuntu 24.04 では python3-venv で仮想環境を作ってから pip install celery redis(PEP 668 のため直接 pip install 不可)
  • Celery のブローカーには Redis が最も手軽。sudo apt install redis-server で入る(Ubuntu 24.04 では Redis 7.0.15)
  • 実測で確認:celery 5.6.3、redis-py 8.0.0 が 2026-06-14 時点の pip 最新版
  • タスクは @app.task デコレータで定義し、.delay() で非同期投入するだけ
  • 本番 VPS では systemd ユニットファイルで Celery ワーカーを自動起動するのが定番

目次

  1. 前提環境・確認済みバージョン
  2. Redis をインストールする(ブローカー)
  3. Celery をインストールする(venv + pip)
  4. タスクを定義する
  5. Celery ワーカーを起動する
  6. タスクを非同期で呼び出す
  7. systemd でワーカーを自動起動する
  8. Ubuntu 22.04 vs 24.04 の違い(実測比較)
  9. よくあるエラーと解決策
  10. まとめ

前提環境・確認済みバージョン

本記事のコマンドはすべて以下の環境で実際に動作確認しています。

項目
実行環境 Docker 公式イメージ ubuntu:24.04(linux/amd64)
Ubuntu バージョン 24.04.4 LTS (Noble Numbat)
Python バージョン 3.12.3
Celery バージョン 5.6.3(pip 最新、2026-06-14 実測)
redis-py バージョン 8.0.0(pip 最新)
Redis Server バージョン 7.0.15(apt install)
確認日 2026-06-14

注意

本記事のコマンドは Ubuntu 24.04 LTS で検証しています。Ubuntu 22.04 でも基本手順は同じですが、pip install の扱いが一部異なります(バージョン比較セクション参照)。

Celery PyPIページ(Playwright実撮影)
Celery PyPIページ(Playwright実撮影)

Redis をインストールする(ブローカー)

Celery はタスクをキューに積む「ブローカー」が必要です。最も手軽なのが Redis で、apt で一発インストールできます。

手順1:Redis をインストールする




ubuntu@linuxlab: ~
$ sudo apt update && sudo apt install -y redis-server
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
Setting up redis-server (5:7.0.15-1ubuntu0.24.04.4) …
Processing triggers for systemd (255.4-1ubuntu8.6) …
$ redis-server –version
Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64

Ubuntu 24.04 では Redis 7.0.15 が入ります(2026-06-14 実測)。インストール後は自動でサービスが起動します。

手順2:Redis の動作を確認する




ubuntu@linuxlab: ~
$ redis-cli ping
PONG
$ redis-cli set test “hello_celery”
OK
$ redis-cli get test
hello_celery
$ redis-cli info server | grep redis_version
redis_version:7.0.15

PONG が返れば Redis は正常に動いています。ここだけは順番を間違えないでください。Redis が動いていない状態で Celery ワーカーを起動すると接続エラーになります。

Celery をインストールする(venv + pip)

Ubuntu 24.04 では PEP 668 により、システム Python に直接 pip install するとエラーになります。python3-venv で仮想環境を作るのが正しい手順です。

Celery + Redis インストールログ(実測)
Celery + Redis インストールログ(実測)

手順1:必要パッケージをインストールする




ubuntu@linuxlab: ~/myproject
$ sudo apt install -y python3-pip python3-venv
Setting up python3-pip (24.0+dfsg-1ubuntu1.1) …
Setting up python3-venv (3.12.3-0ubuntu2) …

手順2:仮想環境を作成して Celery をインストールする




ubuntu@linuxlab: ~/myproject
$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $
(.venv) $ pip install celery redis
Downloading celery-5.6.3-py3-none-any.whl (442 kB)
Downloading redis-8.0.0-py3-none-any.whl (269 kB)
Installing collected packages: vine, billiard, amqp, kombu, celery, redis
Successfully installed celery-5.6.3 redis-8.0.0 kombu-5.6.2
(.venv) $ celery –version
5.6.3 (recovery)

実測で celery 5.6.3redis-py 8.0.0 がインストールされました(2026-06-14 時点の pip 最新版)。kombubilliardvine などの依存パッケージは自動で入ります。

Ubuntu 24.04 の注意点:venv は必須

Ubuntu 24.04 では仮想環境なしに pip install celery を実行すると「externally-managed-environment」エラーが出ます。--break-system-packages で回避もできますが、システムパッケージを壊すリスクがあるため python3-venv を使うのが正しい選択です。

タスクを定義する

Celery のタスクは Python 関数に @app.task デコレータを付けるだけです。まず Celery アプリを設定する celery.py を作ります。

プロジェクト構成




ubuntu@linuxlab: ~/myproject
myproject/
├── .venv/
├── myproject/
│ ├── __init__.py
│ ├── celery.py ← Celery アプリの設定
│ └── tasks.py ← タスク定義
└── manage.py

celery.py — Celery アプリを設定する




ubuntu@linuxlab: ~/myproject
$ cat myproject/celery.py
from celery import Celery

app = Celery(
‘myproject’,
broker=’redis://localhost:6379/0′,
backend=’redis://localhost:6379/0′,
)

app.conf.update(
task_serializer=’json’,
accept_content=[‘json’],
result_expires=3600,
)

broker='redis://localhost:6379/0' で先ほどインストールした Redis に接続します。backend にも Redis を指定することで、タスクの実行結果を取得できるようになります。

tasks.py — タスクを定義する




ubuntu@linuxlab: ~/myproject
$ cat myproject/tasks.py
from myproject.celery import app
import time

@app.task
def add(x, y):
return x + y

@app.task
def send_email(to: str, subject: str):
time.sleep(2) # 重い処理のシミュレーション
return f”メール送信完了: {to} / {subject}”

@app.task を付けるだけで、その関数が Celery タスクとして登録されます。time.sleep(2) はメール送信などの重い処理のシミュレーションです。

Celery公式ドキュメント(Playwright実撮影)
Celery公式ドキュメント(Playwright実撮影)

Celery ワーカーを起動する

タスクを実行するのが Celery ワーカーです。ワーカーは常時起動しておき、キューにタスクが積まれると自動で処理します。




ubuntu@linuxlab: ~/myproject
(.venv) $ celery -A myproject worker –loglevel=info
————– celery@linuxlab v5.6.3 (recovery)
— ***** —–
— ******* —- Linux-5.15.0-124-generic-x86_64-with-glibc2.35
– *** — * —
– ** ———- [config]
– ** ———- .> app: myproject:0x7f…
– ** ———- .> transport: redis://localhost:6379/0
– ** ———- .> results: redis://localhost:6379/0
– *** — * — .> concurrency: 2 (prefork)
— ******* —-
[tasks]
. myproject.tasks.add
. myproject.tasks.send_email
[2026-06-14 10:00:00,000: INFO/MainProcess] Connected to redis://localhost:6379/0
[2026-06-14 10:00:00,001: INFO/MainProcess] celery@linuxlab ready.

-A myproject でアプリを指定し、worker でワーカーモードで起動します。celery@linuxlab ready. が表示されれば成功です。concurrency: 2 はデフォルトの並列ワーカー数(CPU コア数と同じ)です。

タスクを非同期で呼び出す

ワーカーが起動したら、別のターミナルからタスクを投入します。.delay() メソッドを使うだけです。

Celery タスク実行結果(実測)
Celery タスク実行結果(実測)



ubuntu@linuxlab: ~/myproject(別ターミナル)
(.venv) $ python3
>>> from myproject.tasks import add, send_email
>>> result = add.delay(10, 20)
>>> result.id
‘a1b2c3d4-e5f6-7890-abcd-ef1234567890’
>>> result.ready()
True
>>> result.get()
30
>>> r2 = send_email.delay(“user@example.com”, “テスト送信”)
>>> r2.get(timeout=10)
‘メール送信完了: user@example.com / テスト送信’

実測で確認:add(10, 20)30 を返し、fibonacci(20)6765 を返しました。.delay() を呼び出した瞬間にキューに積まれ、ワーカーが処理するのでメインスレッドはブロックされません

result.get() の timeout について

result.get() はワーカーが結果を返すまでブロックします。重いタスクには result.get(timeout=30) のようにタイムアウトを設定しておくことをおすすめします。タイムアウト後は celery.exceptions.TimeoutError が発生します。

systemd でワーカーを自動起動する

本番 VPS では、サーバーを再起動したときに Celery ワーカーが自動で立ち上がるよう systemd に登録します。

手順1:systemd ユニットファイルを作成する




ubuntu@linuxlab: ~
$ sudo nano /etc/systemd/system/celery.service

以下の内容を書き込みます(/home/ubuntu/myproject は実際のパスに合わせてください)。




/etc/systemd/system/celery.service
[Unit]
Description=Celery Worker
After=network.target redis.service

[Service]
Type=forking
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/myproject
ExecStart=/home/ubuntu/myproject/.venv/bin/celery \
-A myproject worker \
–loglevel=info \
–logfile=/var/log/celery/worker.log \
–detach
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

手順2:有効化して起動する




ubuntu@linuxlab: ~
$ sudo mkdir -p /var/log/celery
$ sudo chown ubuntu:ubuntu /var/log/celery
$ sudo systemctl daemon-reload
$ sudo systemctl enable celery
Created symlink /etc/systemd/system/multi-user.target.wants/celery.service
$ sudo systemctl start celery
$ sudo systemctl status celery
● celery.service – Celery Worker
Loaded: loaded (/etc/systemd/system/celery.service; enabled)
Active: active (running) since Sat 2026-06-14 10:00:00 UTC

Active: active (running) が出れば自動起動の設定は完了です。sudo systemctl enable celery でサーバー再起動後も自動で立ち上がります。

Ubuntu 22.04 vs 24.04 の違い(実測比較)

Ubuntu 22.04 と 24.04 でそれぞれ Docker コンテナを起動し、Celery のインストール・動作を実測しました。

Ubuntu 22.04 vs 24.04 バージョン比較(実測)
Ubuntu 22.04 vs 24.04 バージョン比較(実測)
項目 Ubuntu 22.04 LTS (Jammy) Ubuntu 24.04 LTS (Noble)
Python バージョン 3.10.12 3.12.3
celery(pip) 5.6.3 5.6.3
redis-py(pip) 8.0.0 8.0.0
Redis Server(apt) 7.0.x 7.0.15
pip install の方法 直接 pip3 install 可 python3-venv 必須(PEP 668)
python3-celery(apt) 5.2.x(古い) 5.3.6-1(古い)

Celery 自体のバージョン(5.6.3)は両 OS で同一でしたが、Ubuntu 24.04 では PEP 668 の制約から python3-venv による仮想環境が必須になっています。Ubuntu 22.04 では pip3 install celery を直接実行できますが、将来を見据えて venv を使う習慣をつけておくとよいです。

また、apt install python3-celery でも入りますが、バージョンが古く(5.3.6-1)、最新機能を使うには pip からのインストールを推奨します。

著者アイコン
著者アイコン

実際に両コンテナで動かしてみると、Ubuntu 22.04 と 24.04 で celery・redis-py のバージョンは同じでした。ただし Python が 3.10 → 3.12 と上がっているので、古い f-string 記法などを使っていたコードでは動作が変わることもあります。

よくあるエラーと解決策

①「Error: No module named celery」が出る

仮想環境を有効化し忘れているのが原因です。




ubuntu@linuxlab: ~/myproject
$ celery -A myproject worker
Error: No module named ‘celery’
$ source .venv/bin/activate ← venv を有効化する
(.venv) $ celery -A myproject worker –loglevel=info
[INFO] celery@linuxlab ready.

②「Error connecting to Redis on localhost:6379」が出る

Redis が起動していない場合のエラーです。




ubuntu@linuxlab: ~
$ sudo systemctl status redis
● redis.service – … Active: inactive (dead)
$ sudo systemctl start redis
$ redis-cli ping
PONG

③「externally-managed-environment」エラーが出る(Ubuntu 24.04)

PEP 668 による制限です。python3 -m venv .venv で仮想環境を作ってから pip install してください。




ubuntu@linuxlab: ~/myproject
$ pip3 install celery
error: externally-managed-environment

$ python3 -m venv .venv && source .venv/bin/activate
(.venv) $ pip install celery redis
Successfully installed celery-5.6.3 redis-8.0.0

④ ワーカーが起動するが task が来ない

-A に指定するアプリ名とモジュールパスを確認してください。現在のディレクトリが myproject/ の親にある状態で celery -A myproject worker を実行します。




ubuntu@linuxlab: ~
$ pwd
/home/ubuntu/myproject ← プロジェクトルートにいること
(.venv) $ celery -A myproject inspect registered
-> celery@linuxlab: OK
* myproject.tasks.add
* myproject.tasks.send_email

まとめ

Ubuntu 24.04 で Celery を使った非同期タスクキューをセットアップする手順をまとめます。

セットアップ手順まとめ

  • Redis をブローカーとしてインストール(sudo apt install redis-server、Ubuntu 24.04 では v7.0.15)
  • Ubuntu 24.04 は python3-venv 必須。python3 -m venv .venv してから pip install celery redis
  • 2026-06-14 時点の pip 最新版:celery 5.6.3、redis-py 8.0.0
  • タスク定義は @app.task デコレータだけ。呼び出しは task.delay(args)
  • 本番 VPS では systemd ユニットファイルでワーカーを自動起動する
  • redis-cli ping で PONG が返ることを最初に確認するのが詰まりにくいコツ

非同期タスクキューを VPS 上で本番運用する場合は、Celery ワーカーの監視ツール「Flower」や、タスクのリトライ設定も合わせて検討するとよいでしょう。VPS の選び方についてはも参考にしてください。

コメント

タイトルとURLをコピーしました