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 ワーカーを自動起動するのが定番
目次
- 前提環境・確認済みバージョン
- Redis をインストールする(ブローカー)
- Celery をインストールする(venv + pip)
- タスクを定義する
- Celery ワーカーを起動する
- タスクを非同期で呼び出す
- systemd でワーカーを自動起動する
- Ubuntu 22.04 vs 24.04 の違い(実測比較)
- よくあるエラーと解決策
- まとめ
前提環境・確認済みバージョン
本記事のコマンドはすべて以下の環境で実際に動作確認しています。
| 項目 | 値 |
|---|---|
| 実行環境 | 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 の扱いが一部異なります(バージョン比較セクション参照)。

Redis をインストールする(ブローカー)
Celery はタスクをキューに積む「ブローカー」が必要です。最も手軽なのが Redis で、apt で一発インストールできます。
手順1:Redis をインストールする
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 の動作を確認する
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 で仮想環境を作るのが正しい手順です。

手順1:必要パッケージをインストールする
Setting up python3-pip (24.0+dfsg-1ubuntu1.1) …
Setting up python3-venv (3.12.3-0ubuntu2) …
手順2:仮想環境を作成して Celery をインストールする
$ 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.3・redis-py 8.0.0 がインストールされました(2026-06-14 時点の pip 最新版)。kombu・billiard・vine などの依存パッケージは自動で入ります。
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 を作ります。
プロジェクト構成
├── .venv/
├── myproject/
│ ├── __init__.py
│ ├── celery.py ← Celery アプリの設定
│ └── tasks.py ← タスク定義
└── manage.py
celery.py — Celery アプリを設定する
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 — タスクを定義する
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 ワーカーを起動する
タスクを実行するのが Celery ワーカーです。ワーカーは常時起動しておき、キューにタスクが積まれると自動で処理します。
————– 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() メソッドを使うだけです。

>>> 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 ユニットファイルを作成する
以下の内容を書き込みます(/home/ubuntu/myproject は実際のパスに合わせてください)。
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:有効化して起動する
$ 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 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 からのインストールを推奨します。
よくあるエラーと解決策
①「Error: No module named celery」が出る
仮想環境を有効化し忘れているのが原因です。
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 が起動していない場合のエラーです。
● 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 してください。
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 を実行します。
/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 の選び方についてはも参考にしてください。



コメント