はじめに
本ドキュメントの目的
このドキュメントは、Webサーバー上で環境変数を安全かつ適切に設定し、Webアプリケーションから利用する方法を分かりやすく解説します。IISやLinux系サーバー、PaaSやコンテナ環境での実例や、.envファイルとの使い分け、APIキーやDB接続情報の扱い方まで取り扱います。
対象読者
サーバー管理者やWeb開発者、ホスティング環境の運用担当者を想定しています。基礎的なOS操作とWebアプリの仕組みが分かれば読み進められます。
取り扱う内容(概略)
- 環境変数とは何か(簡単な例を添えて)
- アプリケーション側の読み取り方法と注意点
- Windows(IIS含む)、Linux(Apache/Nginx)での設定方法
- コンテナやクラウド(PaaS)での扱い方
- .envファイルとの使い分けやセキュリティ対策(暗号化やアクセス制御)
読み方の注意点
例は手順の骨子を示します。実運用ではバックアップとテスト環境での検証を必ず行ってください。セキュリティに関する項目は特に注意してお読みください。
Webサーバーにおける「環境変数」とは何か
概要
Webサーバーやアプリケーションサーバー上のプロセスが参照できる名前付きの設定情報です。データベース接続文字列(例: DATABASE_URL)、APIキーやシークレット、実行環境(NODE_ENV=production など)、タイムゾーン、ログ先などを格納します。
具体例と用途
DATABASE_URL: DB接続先を指定API_KEY: サードパーティAPIの認証NODE_ENV: 開発・本番の挙動切替
コードにベタ書きせず外部に置くことで、環境ごとの切替が簡単になります。
利点
- 秘匿情報をコードから分離して管理できます。
- 環境ごとの値を切り替えやすくなります。
- 設定変更で再ビルドや再デプロイを最小化できます。
参照方法(簡単な例)
- シェル:
export VAR=valueまたはset VAR=value - Node.js:
process.env.VAR - Python:
os.environ['VAR'] - PHP:
getenv('VAR')
スコープと注意点
環境変数は通常プロセス単位で有効で、子プロセスに継承されます。秘密情報はリポジトリに含めないでください。ローカル開発では .env を使うことが多く、実運用ではシークレット管理サービスを使うと安全です。
Webアプリケーションと環境変数のベストプラクティス
概要
Webアプリでは環境ごとに設定を分け、コードやイメージに秘密情報を含めない運用が基本です。ここでは具体的な手順と注意点をやさしく説明します。
ローカル開発
- .envファイルをプロジェクトルートに置き、動作に必要な値を読み込みます。例: DATABASE_URL=sqlite:///dev.db
- 実際の秘密は書かず、.env.exampleを用意して雛形を共有します。
- .gitignoreに.envを追加し、リポジトリにコミットしないようにします。
本番・ステージング
- サーバーやホスティングの管理画面、またはWebサーバーの設定で直接環境変数を定義します。コンテナなら-eオプションやデプロイ設定で注入します。
- アプリのイメージやソースを変えずに設定だけ切り替えられるため安全で便利です。
秘密情報の管理
- シークレットマネージャやキーバリューストア(例: Vaultやクラウド提供のシークレット機能)を使うと安全です。
- ファイルアクセス権を厳しくし、必要なプロセスだけが読み取れるようにします。
命名と型のルール
- 大文字スネークケース(例: APP_PORT, DB_PASSWORD)を推奨します。
- 数値や真偽値は文字列で格納し、起動時に適切な型に変換します。
運用の注意点
- 定期的に秘密をローテーションし、漏洩時は迅速に差し替えます。
- ログに環境変数を出力しないよう注意してください。
簡単チェックリスト
- .envは開発のみ、.env.exampleを共有
- 本番はサーバー側で定義
- シークレットマネージャの検討
- ログ出力とファイル権限の確認
これらを守ると、安全で運用しやすい環境変数運用ができます。
Windowsサーバー(IISを含む)での環境変数設定
GUIでの設定
コントロールパネル→システム→「システムの詳細設定」→環境変数から、システム(全ユーザー)またはユーザー単位で変数を追加・編集できます。わかりやすいので管理者が手動で少数の値を設定する場合に便利です。
コマンドでの設定(一時/永続)
- 一時的:コマンドプロンプトで set MY_VAR=value、PowerShellでは $Env:MY_VAR = ‘value’ を使います。これはそのシェルやプロセスだけ有効です。
- 永続的:setx コマンドや PowerShell の [Environment]::SetEnvironmentVariable を使います。例:setx MY_VAR “value” /M(/Mでシステム全体)。永続化後は新しいプロセスで有効になるため、既存のプロセスは再起動が必要です。
IIS(FastCGI)での設定
PHPなどをFastCGIで動かす場合は、applicationhost.config の 配下の に個別に定義できます。appcmd.exe や IIS 管理ツールから設定可能です。これにより CGI 実行時に渡す環境変数をアプリ単位で制御できます。
見える環境変数の構成と注意点
IIS上では、OSレベル(システム/ユーザー)、アプリケーションプールの実行ユーザー、FastCGI の環境変数が組み合わさってアプリケーションが参照する値になります。優先順位や適用範囲を意識して設定してください。設定変更後はアプリケーションプールの再起動、または IIS の再起動で反映されます。
セキュリティ上の配慮として、秘密情報は可能なら専用のシークレット管理を使い、環境変数には最低限の情報だけを置くことをおすすめします。
Linuxサーバー(Apache / Nginx等)での環境変数設定
前提
Linuxでは環境変数はシェルやプロセス単位で保持されます。Webサーバープロセスを起動する方法に応じて設定場所を選びます。
一時的な設定(デバッグ用)
シェルで一時的に設定するには export VAR=value を使います。再起動すると消えるので、確認や一時変更に向きます。例: export DB_PASS=secret。
永続化(ユーザー単位・システム単位)
ユーザー単位は ~/.bashrc や ~/.bash_profile に書きます。システム全体では /etc/environment や /etc/profile.d/*.sh を使います。権限に注意して書き込みます。
systemd を使う場合
多くの最近のディストリでは systemd がプロセスを管理します。ユニットファイルに Environment=KEY=value や EnvironmentFile=/etc/myapp/env を追加すると、そのサービス全体に渡ります。編集後は systemctl daemon-reload と systemctl restart SERVICE を実行します。
Apache の設定例
- 設定ファイルや VirtualHost 内で
SetEnv KEY valueを使うと、Apache の子プロセスやCGIに渡せます。 - 既にシェルにある変数を渡す場合は
PassEnv KEYを使います。
ただし、Apache を systemd で起動している場合は systemd 側で渡す方が確実です。
Nginx の設定例
- Nginx 本体は
env KEY;を main コンテキストに書くとワーカープロセスに環境変数を渡します。 - FastCGI/PHP-FPM などに渡す際は
fastcgi_paramや PHP-FPM のenv[KEY] = valueを使います。 - systemd 管理下なら前述の
Environment=も有効です。
セキュリティと運用上の注意
- パスワードなどの機密値はリポジトリにコミットしないでください。
- ファイルに保存する場合はアクセス権を厳しく設定してください(例: 600)。
- 設定を変更したら、どのプロセスが参照するかを確認してから再起動します。
実際の環境に合わせて、systemd 設定かサーバー設定のどちらで管理するかを統一すると運用が楽になります。
コンテナ・クラウド環境における環境変数
Dockerでの基本
Dockerでは、docker run の -e オプションで個別に渡せます。例:
docker run -e ZBX_SERVER=10.0.0.1 -e ZBX_HOSTNAME=web01 zabbix/zabbix-agent:latest
複数をまとめるときは –env-file を使います。ファイル(.env)は KEY=VALUE を1行ずつ書きます。
docker run --env-file .env zabbix/zabbix-agent:latest
docker-composeでのまとめ方
docker-compose.yml では env_file や environment を使います。例:
services:
web:
image: myapp
env_file: .env
environment:
- TZ=Asia/Tokyo
Kubernetesでの扱い
ConfigMap と Secret を用いて環境変数を注入します。ConfigMap は設定向け、Secret は機密向けです。manifestでは envFrom や個別の env を使います。例:
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
マネージドサービス(例: Cloud Run)
Cloud Run や類似のマネージドサービスでは、管理画面でキーと値を登録できます。複数ある場合は .env ファイルや YAML を一括でアップロードして設定することも可能です。CLI では gcloud run deploy –image IMAGE –set-env-vars KEY=VALUE のように渡せます。
運用上の注意点
- 機密は環境変数に平文で置かないようにし、Secrets Manager やクラウドの秘匿機能を使って管理してください。
- 変更を反映する際は再起動や再デプロイが必要です。設定の差分管理は .env や YAML をバージョン管理せず、テンプレートだけ管理するのが安全です。












