タイトル: .env
SEOタイトル: Laravel .env 設定完全ガイド(DB / APP_KEY / config:cache / 複数環境)
| この記事の要点 |
|
.env ファイルの位置と役割
Laravel プロジェクトのルート(artisan と同じ階層)に置く環境変数定義ファイルです。アプリケーションが起動するときに vlucas/phpdotenv が読み込み、PHP の $_ENV / getenv() および Laravel の env() ヘルパで参照できるようになります。
プロジェクト構成
my-app/
├─ app/
├─ bootstrap/
├─ config/ ← .env を読んで実際の設定値を組み立てる
├─ database/
├─ public/
├─ resources/
├─ routes/
├─ storage/
├─ vendor/
├─ .env ← ★ ローカル / 本番ごとに異なる
├─ .env.example ← Git にコミット、サンプル
├─ artisan
└─ composer.json
必ず .gitignore に .env を含めること。クレデンシャル流出を防ぎます。代わりに .env.example を版管理し、必要キーだけ記述しておきます。
典型的な .env 例
APP_NAME=Laravel
APP_ENV=local # local / staging / production
APP_KEY=base64:xxxxxxxxxxxxxxxxxx==
APP_DEBUG=true # 本番は必ず false
APP_URL=http://localhost
APP_TIMEZONE=Asia/Tokyo
APP_LOCALE=ja
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=secret
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=database
SESSION_DRIVER=redis
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS=hello@example.com
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
APP_KEY の生成
APP_KEY はセッション暗号化・Cookie 暗号化・encrypt() ヘルパに使われる秘密鍵です。未生成だと「No application encryption key has been specified.」エラーになります:
# 鍵生成(.env の APP_KEY に自動書き込み)
php artisan key:generate
# 出力例
# Application key set successfully.
# 既にユーザーセッションがある状態で再生成すると、全ユーザーがログアウトする
# 本番では原則 1 回のみ
config() と env() の使い分け
Laravel での鉄則: env() は config 配列内のみで使い、アプリケーションコードからは config() 経由で読みます。
// config/database.php
return [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'host' => env('DB_HOST', '127.0.0.1'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
],
],
];
// アプリケーションコード
$host = config('database.connections.mysql.host');
// ❌ NG: アプリコードで env() を直接呼ぶ
$host = env('DB_HOST'); // config:cache 後に null になる!
config:cache の落とし穴
本番運用では必ず php artisan config:cache を打って設定値を 1 ファイルにキャッシュします。これにより:
- 毎リクエストの config/ ディレクトリ読み込みが消え、体感数十 ms 改善
env()は.envを読まなくなりnullを返す- そのため、
config()ヘルパ経由でしか値を取得できない
# 本番デプロイの定番
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
# 設定を変更したい場合は一度クリア
php artisan config:clear
# → .env を編集 → 再キャッシュ
php artisan config:cache
# 全部まとめて
php artisan optimize:clear # 全クリア
php artisan optimize # 全キャッシュ
.env の特殊記法
# クォート: 値に空白を含む場合
APP_NAME="My App"
# 既存変数の展開
MAIL_FROM_NAME="${APP_NAME}"
APP_URL="https://${APP_DOMAIN}"
# 真偽値(自動で boolean に)
APP_DEBUG=true
APP_DEBUG=false
APP_DEBUG=(true) # () で囲むと文字列扱い
# null
DB_PASSWORD=null
DB_PASSWORD=(null)
# 空文字
DB_PASSWORD=
# コメント
# DB_HOST=staging.example.com ← 行頭 # でコメント
| .env の値 | env() の戻り値 |
|---|---|
true | bool true |
(true) | string "true" |
null | null |
(null) | string "null" |
empty | string "empty" |
(empty) | string "" |
| (値なし) | string "" |
環境別の使い分け
# Laravel 標準は .env を 1 つだけ読む
# Docker や CI では環境別に切替
# 方法1: 環境変数 APP_ENV で .env ファイルを切替
# bootstrap/app.php や Service Provider で
$app->loadEnvironmentFrom('.env.' . env('APP_ENV', 'local'));
# 方法2: シンボリックリンクで切替
ln -sf .env.production .env
# 方法3: Docker / Kubernetes は実環境変数で上書き
# .env は無くてもよい
環境別ファイル
| ファイル | 用途 |
|---|---|
.env.example | ★ コミット。必須キーのテンプレ |
.env | 個人 / サーバごとの実値(コミット禁止) |
.env.local | ローカル開発用 |
.env.staging | ステージング |
.env.production | 本番 |
.env.testing | ★ php artisan test 実行時に自動読込 |
Laravel Vapor / Forge での運用
| サービス | .env の扱い |
|---|---|
| Laravel Forge | ダッシュボードから編集、デプロイ時にサーバへ配置 |
| Laravel Vapor | 環境別に AWS SSM Parameter Store に保存、ビルド時に .env 生成 |
| AWS ECS / Fargate | Task Definition の環境変数 or Secrets Manager 参照 |
| Heroku | heroku config:set DB_HOST=... |
| Kubernetes | Secret マウント or 環境変数注入 |
Secrets Manager / Vault 連携
// AWS Secrets Manager から取得して config に注入
// config/database.php
return [
'connections' => [
'mysql' => [
'host' => env('DB_HOST', '127.0.0.1'),
'password' => env('DB_PASSWORD') ?? aws_secret('db/mysql/password'),
],
],
];
// app/Helpers/aws.php
function aws_secret(string $name): ?string {
static $cache = [];
if (isset($cache[$name])) return $cache[$name];
$client = new \Aws\SecretsManager\SecretsManagerClient([
'region' => env('AWS_DEFAULT_REGION', 'ap-northeast-1'),
'version' => 'latest',
]);
$result = $client->getSecretValue(['SecretId' => $name]);
return $cache[$name] = $result['SecretString'] ?? null;
}
セキュリティのチェックリスト
.gitignoreに.envを必ず追加APP_DEBUG=falseを本番で徹底(true のままだと例外時に環境変数が画面に出る)- 本番
APP_ENV=production APP_KEYは環境ごとに別、絶対に共有しない- パスワード / API キーは可能なら Secrets Manager / Vault に
- サーバの
.envはパーミッション640等で読み取り制限 - 定期的に
APP_KEYをローテーション(ユーザー再ログイン許容できる場合)
よくあるトラブル
| 症状 | 原因 | 対処 |
|---|---|---|
| 「No application encryption key」 | APP_KEY 未生成 | php artisan key:generate |
| 本番でだけ env() が null | config:cache 適用済 | config() 経由で読む |
| .env を編集しても反映されない | config キャッシュ | php artisan config:clear |
値に # を含むと切れる | コメント記法と衝突 | ダブルクォートで囲む |
| テスト実行時に本番 DB を見てしまった | .env.testing 未作成 | phpunit.xml の 設定 |
FAQ
Q: .env を Git に上げたらどうする?
A: 即 APP_KEY / DB パスワード / API キーをすべてローテーション。git history から削除(git filter-repo 等)。
Q: コマンドラインから値を確認したい
A: php artisan tinker で config('database.connections.mysql.host')、または php artisan env で APP_ENV を確認できます。
Q: .env をクラウドファイルストレージで管理してもいい?
A: Drobox / Google Drive 等の共有は非推奨。Secrets Manager や 1Password / Vault などのシークレット管理ツールを使ってください。