Nginx API ゲートウェイ設計:auth_request/サーキットブレーカ/レート制限の組み合わせ

API ゲートウェイの設計において、セキュリティとパフォーマンスのバランスを取ることは非常に重要です。特に Nginx を利用した API ゲートウェイでは、認証、サーキットブレーカ、レート制限という 3 つの要素を適切に組み合わせることで、堅牢で効率的なシステムを構築できます。
本記事では、Nginx の auth_request
、サーキットブレーカ、レート制限を組み合わせた実践的な API ゲートウェイ設計を解説していきます。初心者の方でも実装できるよう、段階的に丁寧に説明していきますので、ぜひ最後までお付き合いください。
背景
API ゲートウェイの役割
API ゲートウェイは、クライアントとバックエンドサービスの間に位置し、リクエストの中継やセキュリティ、トラフィック管理などを一手に担う重要なコンポーネントです。
複数のマイクロサービスが存在する環境では、各サービスへのアクセスを一元管理し、認証・認可、リクエスト制限、障害対応などを統一的に処理することで、システム全体の品質と保守性を向上させられます。
以下の図で、API ゲートウェイの基本的な位置づけとデータフローを確認しましょう。
mermaidflowchart LR
client["クライアント<br/>(ブラウザ/アプリ)"]
gateway["API ゲートウェイ<br/>(Nginx)"]
auth["認証サービス"]
service1["サービス A"]
service2["サービス B"]
service3["サービス C"]
client -->|リクエスト| gateway
gateway -->|認証確認| auth
gateway -->|転送| service1
gateway -->|転送| service2
gateway -->|転送| service3
gateway -->|レスポンス| client
この図から分かるように、API ゲートウェイはすべてのリクエストを受け取り、必要な処理を行った上で適切なバックエンドサービスに転送します。
Nginx を API ゲートウェイとして利用する利点
Nginx は高いパフォーマンスと柔軟な設定が特徴の Web サーバー/リバースプロキシです。
API ゲートウェイとして利用する際には、以下のような利点があります。
# | 項目 | 説明 |
---|---|---|
1 | 高性能 | 非同期イベント駆動アーキテクチャにより、大量の同時接続を効率的に処理できます |
2 | 柔軟性 | モジュールを組み合わせることで、認証、レート制限、ロードバランシングなど多様な機能を実現可能です |
3 | 軽量 | メモリ使用量が少なく、リソース効率が高いため、コスト削減にもつながります |
4 | 豊富な実績 | 世界中で広く利用されており、コミュニティも活発で情報が豊富です |
5 | モジュール拡張 | サードパーティモジュールにより、標準機能にない機能も追加できます |
課題
API ゲートウェイで対処すべき課題
API ゲートウェイを設計する際、以下のような課題に直面します。
認証・認可の一元管理
各マイクロサービスで個別に認証を実装すると、コードの重複が発生し、セキュリティポリシーの統一が困難になります。また、認証ロジックの変更が必要になった場合、すべてのサービスを修正しなければなりません。
サービス障害の波及防止
バックエンドサービスの 1 つが障害を起こした場合、そのサービスへのリクエストがタイムアウトするまで待機することになり、API ゲートウェイ全体のパフォーマンスが低下してしまいます。
トラフィックの過負荷対策
特定のクライアントからの大量リクエストや、DDoS 攻撃などにより、バックエンドサービスが過負荷状態になるリスクがあります。
以下の図で、これらの課題がどのように発生するかを確認しましょう。
mermaidflowchart TB
subgraph problems["課題の発生パターン"]
direction TB
problem1["課題 1:認証の分散<br/>各サービスで個別実装"]
problem2["課題 2:障害の連鎖<br/>1 つの障害が全体に影響"]
problem3["課題 3:過負荷<br/>無制限なリクエスト"]
end
subgraph impacts["システムへの影響"]
direction TB
impact1["保守性の低下<br/>セキュリティリスク"]
impact2["可用性の低下<br/>パフォーマンス劣化"]
impact3["サービス停止<br/>リソース枯渇"]
end
problem1 -.->|導く| impact1
problem2 -.->|導く| impact2
problem3 -.->|導く| impact3
これらの課題を解決するために、次のセクションで説明する 3 つの仕組みを組み合わせていきます。
解決策
auth_request による認証の一元化
Nginx の auth_request
ディレクティブを使用すると、リクエストを処理する前に外部の認証サービスに問い合わせを行い、認証・認可を一元的に管理できます。
この仕組みにより、バックエンドサービス側では認証ロジックを実装する必要がなくなり、認証ポリシーの変更も API ゲートウェイ側のみで対応可能になります。
サーキットブレーカによる障害の隔離
サーキットブレーカパターンは、障害が発生しているサービスへのリクエストを一時的に遮断し、システム全体への影響を最小限に抑える仕組みです。
Nginx では、proxy_next_upstream
や max_fails
、fail_timeout
などのディレクティブを組み合わせることで、サーキットブレーカの動作を実現できます。
レート制限によるトラフィック制御
limit_req
モジュールを使用することで、クライアント単位やエンドポイント単位でリクエスト数を制限し、過負荷を防ぎます。
これにより、正常なユーザーへの影響を最小限に抑えつつ、悪意のあるトラフィックや想定外の負荷からシステムを保護できます。
以下の図で、3 つの解決策がどのように連携するかを確認しましょう。
mermaidflowchart TB
request["クライアント<br/>リクエスト"]
subgraph nginx_gateway["Nginx API ゲートウェイ"]
direction TB
ratelimit["1. レート制限<br/>(limit_req)"]
authreq["2. 認証確認<br/>(auth_request)"]
circuit["3. サーキットブレーカ<br/>(max_fails)"]
end
authservice["認証サービス"]
backend["バックエンド<br/>サービス"]
response["レスポンス"]
request --> ratelimit
ratelimit -->|制限内| authreq
ratelimit -->|制限超過| reject1["429 Too Many Requests"]
authreq -->|確認| authservice
authservice -->|認証成功| circuit
authservice -->|認証失敗| reject2["401 Unauthorized"]
circuit -->|正常| backend
circuit -->|障害検知| reject3["503 Service Unavailable"]
backend --> response
この図が示すように、リクエストは段階的にチェックされ、各層で適切な制御が行われます。
図で理解できる要点
- リクエストは「レート制限 → 認証 → サーキットブレーカ」の順で処理される
- 各段階で問題があれば、適切なステータスコードでリクエストを拒否できる
- バックエンドサービスには、すべてのチェックを通過した正当なリクエストのみが届く
具体例
Docker 環境の構築
まずは、実際に動作する環境を Docker で構築しましょう。
以下は、Docker Compose を使った構成例です。API ゲートウェイ(Nginx)、認証サービス、バックエンドサービスの 3 つのコンテナを起動します。
yaml# docker-compose.yml
version: '3.8'
services:
# API ゲートウェイ(Nginx)
nginx:
image: nginx:alpine
ports:
- '80:80'
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./conf.d:/etc/nginx/conf.d:ro
depends_on:
- auth-service
- backend-service
networks:
- api-network
# 認証サービス
auth-service:
image: node:18-alpine
working_dir: /app
volumes:
- ./auth-service:/app
command: node server.js
networks:
- api-network
environment:
- PORT=3001
# バックエンドサービス
backend-service:
image: node:18-alpine
working_dir: /app
volumes:
- ./backend-service:/app
command: node server.js
networks:
- api-network
environment:
- PORT=3002
networks:
api-network:
driver: bridge
このファイルでは、3 つのサービスを api-network
という共通のネットワークで接続しています。Nginx はポート 80 で外部からのリクエストを受け付けます。
認証サービスの実装
次に、認証を担当するシンプルな Node.js サービスを作成しましょう。
このサービスは、リクエストヘッダーに含まれる API キーを検証し、有効な場合は 200、無効な場合は 401 を返します。
javascript// auth-service/server.js
// 必要なモジュールをインポート
const http = require('http');
// 有効な API キーのリスト(実際の運用では DB や環境変数から取得)
const VALID_API_KEYS = new Set([
'key-12345-valid',
'key-67890-valid',
'key-abcde-valid',
]);
javascript// リクエストハンドラーの定義
const requestHandler = (req, res) => {
// リクエスト情報をログ出力
console.log(`[Auth] ${req.method} ${req.url}`);
console.log(`[Auth] Headers:`, req.headers);
// Authorization ヘッダーから API キーを取得
const apiKey = req.headers['x-api-key'];
if (!apiKey) {
console.log('[Auth] API キーが見つかりません');
res.writeHead(401, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'API キーが必要です' }));
return;
}
javascript // API キーの検証
if (VALID_API_KEYS.has(apiKey)) {
console.log('[Auth] 認証成功');
// 認証成功時は、ユーザー情報をヘッダーに追加して返す
res.writeHead(200, {
'Content-Type': 'application/json',
'X-User-Id': 'user-123',
'X-User-Role': 'admin'
});
res.end(JSON.stringify({ status: 'authorized' }));
} else {
console.log('[Auth] 認証失敗:無効な API キー');
res.writeHead(401, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: '無効な API キーです' }));
}
};
javascript// サーバーの起動
const PORT = process.env.PORT || 3001;
const server = http.createServer(requestHandler);
server.listen(PORT, () => {
console.log(
`認証サービスがポート ${PORT} で起動しました`
);
});
このコードでは、x-api-key
ヘッダーの値を検証し、有効な場合はユーザー情報を含むヘッダーも返しています。このユーザー情報は、Nginx を経由してバックエンドサービスに渡されます。
バックエンドサービスの実装
バックエンドサービスは、実際のビジネスロジックを処理するサービスです。
ここでは、簡単な API エンドポイントを作成し、認証情報を受け取って処理する例を示します。
javascript// backend-service/server.js
// 必要なモジュールをインポート
const http = require('http');
// リクエストカウンター(障害シミュレーション用)
let requestCount = 0;
javascript// リクエストハンドラーの定義
const requestHandler = (req, res) => {
requestCount++;
console.log(`[Backend] ${req.method} ${req.url}`);
console.log(`[Backend] リクエスト数: ${requestCount}`);
// Nginx から渡されたユーザー情報を取得
const userId = req.headers['x-user-id'];
const userRole = req.headers['x-user-role'];
console.log(`[Backend] User ID: ${userId}, Role: ${userRole}`);
javascript// 障害シミュレーション(10 回に 1 回は遅延を発生させる)
if (requestCount % 10 === 0) {
console.log('[Backend] 遅延をシミュレート中...');
setTimeout(() => {
res.writeHead(200, {
'Content-Type': 'application/json',
});
res.end(
JSON.stringify({
message: 'データ取得成功(遅延あり)',
userId: userId,
userRole: userRole,
timestamp: new Date().toISOString(),
})
);
}, 5000); // 5 秒遅延
return;
}
javascript // 通常のレスポンス
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
message: 'データ取得成功',
userId: userId,
userRole: userRole,
data: [
{ id: 1, name: '商品 A', price: 1000 },
{ id: 2, name: '商品 B', price: 2000 },
{ id: 3, name: '商品 C', price: 3000 }
],
timestamp: new Date().toISOString()
}));
};
javascript// サーバーの起動
const PORT = process.env.PORT || 3002;
const server = http.createServer(requestHandler);
server.listen(PORT, () => {
console.log(
`バックエンドサービスがポート ${PORT} で起動しました`
);
});
このサービスでは、10 回に 1 回、意図的に 5 秒の遅延を発生させています。これにより、サーキットブレーカの動作をテストできます。
Nginx 設定ファイルの作成
ここからが本題です。Nginx の設定ファイルで、レート制限、認証、サーキットブレーカを組み合わせていきます。
まず、基本的な設定とレート制限のゾーン定義から始めましょう。
nginx# nginx.conf
# ワーカープロセスの数(CPU コア数に合わせる)
worker_processes auto;
events {
# 1 つのワーカーが処理できる最大接続数
worker_connections 1024;
}
http {
# ログフォーマットの定義
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
nginx # レート制限のゾーン定義
# クライアント IP アドレスごとに、10MB のメモリを使用して状態を保存
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
# バースト制限用のゾーン(より厳しい制限)
limit_req_zone $binary_remote_addr zone=api_limit_burst:10m rate=2r/s;
limit_req_zone
では、IP アドレス($binary_remote_addr
)をキーとして、秒間 10 リクエストまでを許可するゾーンを定義しています。
次に、アップストリームサーバー(バックエンドサービス)の設定を行います。ここでサーキットブレーカの設定も含めます。
nginx # アップストリームサーバーの定義
upstream backend {
# サーキットブレーカの設定
# 30 秒以内に 3 回失敗したら、30 秒間そのサーバーを使用しない
server backend-service:3002 max_fails=3 fail_timeout=30s;
# 複数のバックエンドがある場合は追加可能
# server backend-service-2:3002 max_fails=3 fail_timeout=30s;
# キープアライブ接続を有効化(パフォーマンス向上)
keepalive 32;
}
max_fails=3
は「3 回連続で失敗したら」、fail_timeout=30s
は「30 秒間そのサーバーを使用しない」という設定です。
続いて、仮想サーバーの設定を行います。
nginx # 仮想サーバーの定義
server {
listen 80;
server_name localhost;
# 共通のプロキシ設定
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
nginx # サーキットブレーカのタイムアウト設定
# バックエンドからの応答を 10 秒待つ
proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# エラー時の動作設定
# タイムアウトやエラー時は次のサーバーを試す
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_next_upstream_tries 2;
proxy_next_upstream_timeout 20s;
これらの設定により、バックエンドが応答しない場合は 10 秒でタイムアウトし、次のサーバーを試すか、エラーを返します。
次に、内部の認証エンドポイントを定義します。
nginx # 内部の認証エンドポイント
# external からのアクセスは不可
location = /auth {
internal;
# 認証サービスへプロキシ
proxy_pass http://auth-service:3001/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
# 元のリクエストの API キーを転送
proxy_set_header X-Api-Key $http_x_api_key;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Original-Method $request_method;
}
internal
ディレクティブにより、このエンドポイントは外部から直接アクセスできず、Nginx 内部からのみ呼び出せるようになります。
いよいよ、実際の API エンドポイントの設定です。ここで 3 つの仕組みをすべて組み合わせます。
nginx # API エンドポイント
location /api/ {
# ステップ 1: レート制限の適用
# 秒間 10 リクエストまで、バーストで 20 リクエストまで許可
limit_req zone=api_limit burst=20 nodelay;
# レート制限超過時のステータスコード
limit_req_status 429;
nginx # ステップ 2: 認証の実行
# /auth エンドポイントで認証を確認
auth_request /auth;
# 認証サービスから返されたヘッダーをバックエンドに転送
auth_request_set $user_id $upstream_http_x_user_id;
auth_request_set $user_role $upstream_http_x_user_role;
proxy_set_header X-User-Id $user_id;
proxy_set_header X-User-Role $user_role;
auth_request /auth
により、リクエストを処理する前に /auth
エンドポイントで認証を確認します。認証が成功(200)した場合のみ、後続の処理が実行されます。
nginx # ステップ 3: バックエンドへプロキシ(サーキットブレーカ適用済み)
proxy_pass http://backend;
# エラーハンドリング
proxy_intercept_errors on;
}
このように、1 つのロケーションブロック内で 3 つの仕組みが順番に適用されます。
最後に、エラーページの設定を追加しましょう。
nginx # エラーページのカスタマイズ
error_page 401 /errors/401.json;
error_page 429 /errors/429.json;
error_page 502 503 504 /errors/50x.json;
location /errors/ {
internal;
default_type application/json;
}
}
}
エラーが発生した場合、適切な JSON レスポンスを返すようにしています。
エラーレスポンスファイルの作成
エラー時に返す JSON ファイルも用意しましょう。
json# conf.d/errors/401.json
{
"error": {
"code": 401,
"message": "認証に失敗しました",
"details": "有効な API キーをリクエストヘッダー(X-Api-Key)に含めてください"
}
}
json# conf.d/errors/429.json
{
"error": {
"code": 429,
"message": "リクエスト制限を超過しました",
"details": "しばらく時間をおいてから再度お試しください",
"retry_after": 60
}
}
json# conf.d/errors/50x.json
{
"error": {
"code": 503,
"message": "サービスが一時的に利用できません",
"details": "バックエンドサービスに接続できませんでした"
}
}
これらのファイルにより、エラー時にもユーザーフレンドリーなメッセージを返せます。
動作確認とテスト
それでは、実際に動作を確認してみましょう。
まず、Docker 環境を起動します。
bash# Docker コンテナの起動
yarn docker-compose up -d
# ログの確認
yarn docker-compose logs -f
次に、正常なリクエストを送信してみます。
bash# 正常なリクエスト(有効な API キー)
curl -H "X-Api-Key: key-12345-valid" http://localhost/api/products
# 期待される結果: 200 OK と商品データ
認証エラーのテストです。
bash# 認証エラーのテスト(API キーなし)
curl -i http://localhost/api/products
# 期待される結果: 401 Unauthorized
# 認証エラーのテスト(無効な API キー)
curl -i -H "X-Api-Key: invalid-key" http://localhost/api/products
# 期待される結果: 401 Unauthorized
レート制限のテストを行います。
bash# レート制限のテスト(短時間に大量リクエスト)
for i in {1..30}; do
curl -H "X-Api-Key: key-12345-valid" http://localhost/api/products
echo "Request $i"
done
# 期待される結果: 最初の数件は成功、その後 429 Too Many Requests
サーキットブレーカのテストは、バックエンドサービスが遅延を起こすまでリクエストを繰り返します。
bash# サーキットブレーカのテスト
# 10 回に 1 回遅延が発生するため、複数回リクエストを送る
for i in {1..15}; do
echo "Request $i"
time curl -H "X-Api-Key: key-12345-valid" http://localhost/api/products
sleep 1
done
# 期待される動作:
# - 通常は即座にレスポンス
# - 遅延発生時(10 秒タイムアウト)後、503 が返る
# - 連続で失敗すると、サーキットブレーカが作動して即座に 503 を返す
以下の図で、リクエストがどのように処理されるかの全体フローを確認しましょう。
mermaidsequenceDiagram
participant C as クライアント
participant N as Nginx
participant A as 認証サービス
participant B as バックエンド
C->>N: GET /api/products<br/>X-Api-Key: key-12345
Note over N: 1. レート制限チェック
alt 制限超過
N-->>C: 429 Too Many Requests
end
Note over N: 2. 認証確認
N->>A: GET /auth<br/>X-Api-Key: key-12345
alt 認証失敗
A-->>N: 401 Unauthorized
N-->>C: 401 Unauthorized
else 認証成功
A-->>N: 200 OK<br/>X-User-Id: user-123
Note over N: 3. サーキットブレーカ確認
alt サーキット OPEN
N-->>C: 503 Service Unavailable
else サーキット CLOSED
N->>B: GET /api/products<br/>X-User-Id: user-123
alt タイムアウト/エラー
B-->>N: timeout / error
Note over N: max_fails カウント増加
N-->>C: 503 Service Unavailable
else 正常
B-->>N: 200 OK + data
N-->>C: 200 OK + data
end
end
end
図で理解できる要点
- リクエストは「レート制限 → 認証 → サーキットブレーカ → バックエンド」の順で処理される
- 各段階でエラーが発生すると、そこで処理が中断され、適切なエラーレスポンスが返される
- サーキットブレーカが OPEN 状態の場合、バックエンドへのリクエストは行われず即座にエラーが返る
監視とロギング
本番環境では、これらの仕組みが正しく機能しているかを監視することが重要です。
Nginx のログを活用して、レート制限や認証エラー、サーキットブレーカの動作を追跡しましょう。
nginx# カスタムログフォーマットの定義
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time" '
'limit_req_status=$limit_req_status '
'upstream_addr=$upstream_addr '
'upstream_status=$upstream_status';
access_log /var/log/nginx/api_access.log detailed;
このログフォーマットでは、以下の情報を記録します。
# | 項目 | 説明 |
---|---|---|
1 | request_time | リクエスト全体の処理時間 |
2 | upstream_connect_time | バックエンドへの接続時間 |
3 | upstream_response_time | バックエンドからのレスポンス時間 |
4 | limit_req_status | レート制限の状態(PASSED, DELAYED, REJECTED など) |
5 | upstream_addr | 実際にリクエストを処理したバックエンドのアドレス |
6 | upstream_status | バックエンドが返したステータスコード |
ログを分析することで、どのエンドポイントでレート制限が頻繁に発生しているか、サーキットブレーカがどの程度作動しているかを把握できます。
パフォーマンスチューニング
実際の運用では、システムの特性に応じて各パラメータをチューニングする必要があります。
レート制限の調整
トラフィックパターンに応じて、レート制限の値を調整しましょう。
nginx# 通常の API エンドポイント(秒間 10 リクエスト)
limit_req_zone $binary_remote_addr zone=api_standard:10m rate=10r/s;
# 負荷の高いエンドポイント(秒間 5 リクエスト)
limit_req_zone $binary_remote_addr zone=api_heavy:10m rate=5r/s;
# 認証エンドポイント(秒間 20 リクエスト)
limit_req_zone $binary_remote_addr zone=api_auth:10m rate=20r/s;
エンドポイントごとに異なるレート制限を適用することで、より細かい制御が可能になります。
サーキットブレーカのパラメータ調整
バックエンドサービスの特性に応じて、サーキットブレーカの感度を調整します。
nginxupstream backend_stable {
# 安定したサービス: 5 回失敗で 1 分間遮断
server backend-1:3002 max_fails=5 fail_timeout=60s;
}
upstream backend_unstable {
# 不安定なサービス: 2 回失敗で 10 秒間遮断(早期発見)
server backend-2:3003 max_fails=2 fail_timeout=10s;
}
応答が遅いサービスには短いタイムアウトを、安定したサービスには長めのタイムアウトを設定することで、最適なバランスを見つけられます。
まとめ
本記事では、Nginx を API ゲートウェイとして活用し、auth_request
、サーキットブレーカ、レート制限という 3 つの重要な仕組みを組み合わせた実践的な設計を解説しました。
これらの仕組みを組み合わせることで、以下のメリットが得られます。
# | メリット | 詳細 |
---|---|---|
1 | セキュリティの向上 | 認証を一元管理し、不正なリクエストを確実にブロックできます |
2 | 可用性の確保 | サーキットブレーカにより、障害の影響を最小限に抑えられます |
3 | パフォーマンスの安定化 | レート制限により、過負荷を防ぎ、正常なユーザーへのサービスを維持できます |
4 | 保守性の向上 | API ゲートウェイで一元管理することで、変更が容易になります |
5 | 運用コストの削減 | Nginx の高いパフォーマンスにより、少ないリソースで大量のリクエストを処理できます |
実際の運用では、ログの分析やモニタリングを行いながら、各パラメータを継続的にチューニングしていくことが重要です。特に、レート制限の閾値やサーキットブレーカの感度は、トラフィックパターンやバックエンドサービスの特性に応じて調整が必要でしょう。
今回紹介した設計パターンは、マイクロサービスアーキテクチャにおける API ゲートウェイの基本的な構成として、多くの場面で活用できます。ぜひ、ご自身のプロジェクトに合わせてカスタマイズしてみてください。
関連リンク
- article
Nginx API ゲートウェイ設計:auth_request/サーキットブレーカ/レート制限の組み合わせ
- article
Nginx ディレクティブ早見表:server/location/if/map の評価順序と落とし穴
- article
Nginx を macOS で本番級に構築:launchd/ログローテーション/権限・署名のベストプラクティス
- article
Nginx Unit と Node(+ PM2)/Passenger を比較:再読み込み・可用性・性能の実測
- article
Nginx 499/444/408 の謎を解く:クライアント切断と各種タイムアウトの実態
- article
Nginx リクエスト処理の舞台裏:フェーズ/ハンドラ/モジュール連携を図解で理解
- article
Obsidian Vault 設計の教科書:個人用とチーム用を両立する情報区画
- article
Claude Code で発生する API Error: 401·{"type":"error", ...} Please run /login の対処法
- article
Nuxt クリーンアーキテクチャ実践:UI・ドメイン・インフラを composable で分離
- article
オフラインファースト設計:Zustand で楽観的 UI とロールバックを実現
- article
Nginx API ゲートウェイ設計:auth_request/サーキットブレーカ/レート制限の組み合わせ
- article
CI/CD で更新を自動化:GitHub Actions と WordPress の安全デプロイ
- blog
iPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
- blog
Googleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
- blog
【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
- blog
Googleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
- blog
Pixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
- blog
フロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
- review
今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
- review
ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
- review
愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
- review
週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
- review
新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来