@robiki/proxy 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +639 -0
- package/README.es.md +639 -0
- package/README.ja.md +639 -0
- package/README.md +55 -4
- package/README.pl.md +639 -0
- package/README.ru.md +639 -0
- package/README.zh.md +639 -0
- package/dist/config-CQ7zIaQt.d.ts +172 -0
- package/dist/config-CeJ1tf8T.d.ts +174 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +79 -38
- package/dist/utils/config.d.ts +1 -1
- package/dist/utils/config.js +5 -16
- package/package.json +7 -3
- package/tests/README.md +293 -0
- package/tests/docker/README.md +303 -0
package/README.ja.md
ADDED
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
# 🚀 Robiki プロキシ
|
|
2
|
+
|
|
3
|
+
> WebSocket サポート、設定可能なルーティング、CORS、リクエスト検証を備えた高性能で柔軟な HTTP/2 リバースプロキシ。Node.js アプリケーションの npm パッケージとして、またはスタンドアロンの Docker コンテナとして使用できます。ローカル開発環境専用のドメインプロキシとしての使用を想定しています。
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@robiki/proxy)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## 🌍 言語 / Languages / Sprachen / 语言 / Języki / Idiomas / Языки
|
|
9
|
+
|
|
10
|
+
[English](README.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Español](README.es.md) | [Русский](README.ru.md)
|
|
11
|
+
|
|
12
|
+
## ✨ 機能
|
|
13
|
+
|
|
14
|
+
- **🔒 HTTP/2 & SSL/TLS サポート**:完全な HTTP/2 プロトコルサポートと自動 HTTP/1.1 フォールバック
|
|
15
|
+
- **🔌 WebSocket プロキシ**:シームレスな WebSocket 接続処理とプロキシ
|
|
16
|
+
- **🌐 柔軟なルーティング**:ワイルドカードサポート付きのドメイン/ホスト別ルート設定
|
|
17
|
+
- **🛡️ CORS 管理**:グローバルおよびルート別の CORS 設定
|
|
18
|
+
- **✅ リクエスト検証**:認証、レート制限などのカスタム検証ロジック
|
|
19
|
+
- **🔄 URL リマッピング**:ターゲットサービスに転送する前に URL を変換
|
|
20
|
+
- **📦 デュアル使用**:npm パッケージまたは Docker コンテナとして使用
|
|
21
|
+
- **🎯 マルチポートサポート**:複数のポートで同時にリッスン
|
|
22
|
+
- **⚡ 高性能**:Node.js ネイティブ HTTP/2 実装に基づく
|
|
23
|
+
|
|
24
|
+
## 📦 インストール
|
|
25
|
+
|
|
26
|
+
### npm パッケージとして
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @robiki/proxy
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
yarn add @robiki/proxy
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Docker コンテナとして
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
docker pull robiki/proxy:latest
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Docker Compose サービスとして
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
services:
|
|
46
|
+
proxy:
|
|
47
|
+
image: robiki/proxy:latest
|
|
48
|
+
container_name: robiki-proxy
|
|
49
|
+
restart: unless-stopped
|
|
50
|
+
ports:
|
|
51
|
+
- '443:443'
|
|
52
|
+
- '8080:8080'
|
|
53
|
+
- '9229:9229'
|
|
54
|
+
volumes:
|
|
55
|
+
- ./proxy.config.json:/app/proxy.config.json:ro
|
|
56
|
+
- ./certs:/app/certs:ro
|
|
57
|
+
networks:
|
|
58
|
+
- app-network
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 注意事項
|
|
62
|
+
|
|
63
|
+
- ローカルで設定されたホストは、ローカルの `hosts` ファイルに追加する必要があります。
|
|
64
|
+
- カスタム証明書を使用する場合は、証明書ファイルを `certs` ディレクトリに追加する必要があります。
|
|
65
|
+
|
|
66
|
+
## 🚀 クイックスタート
|
|
67
|
+
|
|
68
|
+
### npm パッケージとして使用
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
import { createProxy } from '@robiki/proxy';
|
|
72
|
+
|
|
73
|
+
const proxy = await createProxy({
|
|
74
|
+
ports: [443, 8080],
|
|
75
|
+
ssl: {
|
|
76
|
+
key: './certs/key.pem',
|
|
77
|
+
cert: './certs/cert.pem',
|
|
78
|
+
allowHTTP1: true,
|
|
79
|
+
},
|
|
80
|
+
routes: {
|
|
81
|
+
'api.example.com': {
|
|
82
|
+
target: 'localhost:3000',
|
|
83
|
+
ssl: true,
|
|
84
|
+
},
|
|
85
|
+
'example.com': {
|
|
86
|
+
target: 'localhost:8080',
|
|
87
|
+
ssl: false,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
console.log('プロキシサーバーが実行中です!');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Docker で使用
|
|
96
|
+
|
|
97
|
+
1. `proxy.config.json` ファイルを作成:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"ports": [443, 8080],
|
|
102
|
+
"ssl": {
|
|
103
|
+
"key": "/app/certs/key.pem",
|
|
104
|
+
"cert": "/app/certs/cert.pem",
|
|
105
|
+
"allowHTTP1": true
|
|
106
|
+
},
|
|
107
|
+
"routes": {
|
|
108
|
+
"api.example.com": {
|
|
109
|
+
"target": "backend-service:3000",
|
|
110
|
+
"ssl": true
|
|
111
|
+
},
|
|
112
|
+
"example.com": {
|
|
113
|
+
"target": "frontend-service:8080",
|
|
114
|
+
"ssl": false
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
2. `docker-compose.yml` を作成:
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
version: '3.8'
|
|
124
|
+
|
|
125
|
+
services:
|
|
126
|
+
proxy:
|
|
127
|
+
image: robiki/proxy:latest
|
|
128
|
+
ports:
|
|
129
|
+
- '443:443'
|
|
130
|
+
- '8080:8080'
|
|
131
|
+
volumes:
|
|
132
|
+
- ./proxy.config.json:/app/proxy.config.json:ro
|
|
133
|
+
- ./certs:/app/certs:ro
|
|
134
|
+
environment:
|
|
135
|
+
- PROXY_CONFIG=/app/proxy.config.json
|
|
136
|
+
networks:
|
|
137
|
+
- app-network
|
|
138
|
+
|
|
139
|
+
backend-service:
|
|
140
|
+
image: your-backend-image
|
|
141
|
+
networks:
|
|
142
|
+
- app-network
|
|
143
|
+
|
|
144
|
+
frontend-service:
|
|
145
|
+
image: your-frontend-image
|
|
146
|
+
networks:
|
|
147
|
+
- app-network
|
|
148
|
+
|
|
149
|
+
networks:
|
|
150
|
+
app-network:
|
|
151
|
+
driver: bridge
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
3. サービスを起動:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
docker-compose up -d
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 📖 設定
|
|
161
|
+
|
|
162
|
+
### 設定ファイル
|
|
163
|
+
|
|
164
|
+
次の構造で `proxy.config.json` ファイルを作成:
|
|
165
|
+
|
|
166
|
+
```json
|
|
167
|
+
{
|
|
168
|
+
"ports": [443, 8080],
|
|
169
|
+
"ssl": {
|
|
170
|
+
"key": "./certs/key.pem",
|
|
171
|
+
"cert": "./certs/cert.pem",
|
|
172
|
+
"ca": "./certs/ca.pem",
|
|
173
|
+
"allowHTTP1": true
|
|
174
|
+
},
|
|
175
|
+
"cors": {
|
|
176
|
+
"origin": "*",
|
|
177
|
+
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
|
178
|
+
"allowedHeaders": ["Content-Type", "Authorization"],
|
|
179
|
+
"credentials": true,
|
|
180
|
+
"maxAge": 86400
|
|
181
|
+
},
|
|
182
|
+
"routes": {
|
|
183
|
+
"api.example.com": {
|
|
184
|
+
"target": "backend-service:3000",
|
|
185
|
+
"ssl": true,
|
|
186
|
+
"cors": {
|
|
187
|
+
"origin": ["https://example.com"],
|
|
188
|
+
"credentials": true
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"*.example.com": {
|
|
192
|
+
"target": "wildcard-service:4000",
|
|
193
|
+
"ssl": true
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 環境変数
|
|
200
|
+
|
|
201
|
+
環境変数を使用してプロキシを設定することもできます:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# SSL 設定
|
|
205
|
+
SSL_KEY=/app/certs/key.pem
|
|
206
|
+
SSL_CERT=/app/certs/cert.pem
|
|
207
|
+
SSL_CA=/app/certs/ca.pem
|
|
208
|
+
SSL_ALLOW_HTTP1=true
|
|
209
|
+
|
|
210
|
+
# CORS 設定
|
|
211
|
+
CORS_ORIGIN=*
|
|
212
|
+
CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
|
|
213
|
+
CORS_HEADERS=Content-Type,Authorization
|
|
214
|
+
CORS_CREDENTIALS=true
|
|
215
|
+
|
|
216
|
+
# デバッグモード
|
|
217
|
+
DEBUG=true # プロキシ接続とエラーの詳細なログを有効にする
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## 🎯 高度な使用法
|
|
221
|
+
|
|
222
|
+
### URL リマッピング
|
|
223
|
+
|
|
224
|
+
ターゲットサービスに転送する前に URL を変換:
|
|
225
|
+
|
|
226
|
+
```javascript
|
|
227
|
+
const config = {
|
|
228
|
+
routes: {
|
|
229
|
+
'api.example.com': {
|
|
230
|
+
target: 'backend:3000',
|
|
231
|
+
ssl: true,
|
|
232
|
+
remap: (url) => {
|
|
233
|
+
// /api プレフィックスを削除
|
|
234
|
+
return url.replace(/^\/api/, '');
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### リクエスト検証
|
|
242
|
+
|
|
243
|
+
認証、レート制限などのカスタム検証ロジックを追加:
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
const config = {
|
|
247
|
+
// グローバル検証
|
|
248
|
+
validate: async (info) => {
|
|
249
|
+
if (!info.headers.authorization) {
|
|
250
|
+
return {
|
|
251
|
+
status: false,
|
|
252
|
+
code: 401,
|
|
253
|
+
message: '認証されていません',
|
|
254
|
+
headers: { 'www-authenticate': 'Bearer' },
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return { status: true };
|
|
258
|
+
},
|
|
259
|
+
routes: {
|
|
260
|
+
'api.example.com': {
|
|
261
|
+
target: 'backend:3000',
|
|
262
|
+
ssl: true,
|
|
263
|
+
// ルート固有の検証
|
|
264
|
+
validate: async (info) => {
|
|
265
|
+
const rateLimit = await checkRateLimit(info.remoteAddress);
|
|
266
|
+
if (!rateLimit.allowed) {
|
|
267
|
+
return {
|
|
268
|
+
status: false,
|
|
269
|
+
code: 429,
|
|
270
|
+
message: 'リクエストが多すぎます',
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
return { status: true };
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### カスタム CORS 設定
|
|
281
|
+
|
|
282
|
+
CORS をグローバルまたはルート別に設定:
|
|
283
|
+
|
|
284
|
+
```javascript
|
|
285
|
+
const config = {
|
|
286
|
+
// グローバル CORS
|
|
287
|
+
cors: {
|
|
288
|
+
origin: ['https://example.com', 'https://www.example.com'],
|
|
289
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
290
|
+
allowedHeaders: ['Content-Type', 'Authorization'],
|
|
291
|
+
credentials: true,
|
|
292
|
+
maxAge: 86400,
|
|
293
|
+
},
|
|
294
|
+
routes: {
|
|
295
|
+
'api.example.com': {
|
|
296
|
+
target: 'backend:3000',
|
|
297
|
+
ssl: true,
|
|
298
|
+
// ルート固有の CORS(グローバルを上書き)
|
|
299
|
+
cors: {
|
|
300
|
+
origin: '*',
|
|
301
|
+
credentials: false,
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### カスタムハンドラー
|
|
309
|
+
|
|
310
|
+
高度なユースケース用のカスタムリクエストハンドラーを作成:
|
|
311
|
+
|
|
312
|
+
```javascript
|
|
313
|
+
import { createCustomProxy } from '@robiki/proxy';
|
|
314
|
+
|
|
315
|
+
const customRestHandler = async (req, res) => {
|
|
316
|
+
if (req.url === '/health') {
|
|
317
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
318
|
+
return res.end(JSON.stringify({ status: 'ok' }));
|
|
319
|
+
}
|
|
320
|
+
// デフォルトのプロキシ動作にフォールバック
|
|
321
|
+
const { restAPIProxyHandler } = await import('@robiki/proxy/connections');
|
|
322
|
+
return restAPIProxyHandler(req, res);
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const proxy = await createCustomProxy(config, {
|
|
326
|
+
rest: customRestHandler,
|
|
327
|
+
websocket: customWebSocketHandler,
|
|
328
|
+
stream: customStreamHandler,
|
|
329
|
+
});
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## 🔧 API リファレンス
|
|
333
|
+
|
|
334
|
+
### `createProxy(config: ServerConfig): Promise<ProxyServer>`
|
|
335
|
+
|
|
336
|
+
指定された設定でプロキシサーバーを作成して起動します。
|
|
337
|
+
|
|
338
|
+
**パラメータ:**
|
|
339
|
+
|
|
340
|
+
- `config`:サーバー設定オブジェクト
|
|
341
|
+
|
|
342
|
+
**戻り値:** `ProxyServer` インスタンスに解決される Promise
|
|
343
|
+
|
|
344
|
+
### `ProxyServer`
|
|
345
|
+
|
|
346
|
+
**メソッド:**
|
|
347
|
+
|
|
348
|
+
- `start()`:プロキシサーバーを起動
|
|
349
|
+
- `stop()`:プロキシサーバーを停止
|
|
350
|
+
- `getConfig()`:現在の設定を取得
|
|
351
|
+
|
|
352
|
+
### 設定タイプ
|
|
353
|
+
|
|
354
|
+
#### `ServerConfig`
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
interface ServerConfig {
|
|
358
|
+
ports?: number[];
|
|
359
|
+
ssl?: CertificateConfig;
|
|
360
|
+
routes: Record<string, RouteConfig>;
|
|
361
|
+
cors?: CorsConfig;
|
|
362
|
+
validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
#### `RouteConfig`
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
interface RouteConfig {
|
|
370
|
+
target: string;
|
|
371
|
+
ssl?: boolean;
|
|
372
|
+
remap?: (url: string) => string;
|
|
373
|
+
cors?: CorsConfig;
|
|
374
|
+
validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
#### `CorsConfig`
|
|
379
|
+
|
|
380
|
+
```typescript
|
|
381
|
+
interface CorsConfig {
|
|
382
|
+
origin?: string | string[];
|
|
383
|
+
methods?: string[];
|
|
384
|
+
allowedHeaders?: string[];
|
|
385
|
+
exposedHeaders?: string[];
|
|
386
|
+
credentials?: boolean;
|
|
387
|
+
maxAge?: number;
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
#### `ConnectionInfo`
|
|
392
|
+
|
|
393
|
+
```typescript
|
|
394
|
+
interface ConnectionInfo {
|
|
395
|
+
id: number;
|
|
396
|
+
method: string;
|
|
397
|
+
path: string;
|
|
398
|
+
remoteAddress: string;
|
|
399
|
+
scheme: string;
|
|
400
|
+
authority: string;
|
|
401
|
+
origin: string;
|
|
402
|
+
headers: IncomingHttpHeaders;
|
|
403
|
+
query: URLSearchParams;
|
|
404
|
+
type: RequestType;
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## 🐳 Docker の使用
|
|
409
|
+
|
|
410
|
+
### 別のプロジェクトで使用
|
|
411
|
+
|
|
412
|
+
1. `docker-compose.yml` にプロキシを追加:
|
|
413
|
+
|
|
414
|
+
```yaml
|
|
415
|
+
services:
|
|
416
|
+
proxy:
|
|
417
|
+
image: robiki/proxy:latest
|
|
418
|
+
ports:
|
|
419
|
+
- '443:443'
|
|
420
|
+
- '8080:8080'
|
|
421
|
+
volumes:
|
|
422
|
+
- ./proxy.config.json:/app/proxy.config.json:ro
|
|
423
|
+
- ./certs:/app/certs:ro
|
|
424
|
+
networks:
|
|
425
|
+
- your-network
|
|
426
|
+
|
|
427
|
+
your-service:
|
|
428
|
+
image: your-service-image
|
|
429
|
+
networks:
|
|
430
|
+
- your-network
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
2. `proxy.config.json` でサービスを指すようにルートを設定
|
|
434
|
+
|
|
435
|
+
3. スタックを起動:
|
|
436
|
+
|
|
437
|
+
```bash
|
|
438
|
+
docker-compose up -d
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### カスタムイメージのビルド
|
|
442
|
+
|
|
443
|
+
カスタム Dockerfile を作成:
|
|
444
|
+
|
|
445
|
+
```dockerfile
|
|
446
|
+
FROM robiki/proxy:latest
|
|
447
|
+
|
|
448
|
+
# 設定をコピー
|
|
449
|
+
COPY proxy.config.json /app/proxy.config.json
|
|
450
|
+
COPY certs /app/certs
|
|
451
|
+
|
|
452
|
+
# 環境変数を設定
|
|
453
|
+
ENV PROXY_CONFIG=/app/proxy.config.json
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
## 📚 例
|
|
457
|
+
|
|
458
|
+
より多くの使用例については、`examples/` ディレクトリを確認してください:
|
|
459
|
+
|
|
460
|
+
- `basic-usage.js` - シンプルなプロキシ設定
|
|
461
|
+
- `advanced-usage.js` - 高度な機能(検証、CORS、リマッピング)
|
|
462
|
+
- `custom-handlers.js` - カスタムリクエストハンドラー
|
|
463
|
+
- `docker-compose.example.yml` - 完全な Docker 設定
|
|
464
|
+
|
|
465
|
+
## 🔐 SSL/TLS 証明書
|
|
466
|
+
|
|
467
|
+
### 自己署名証明書の生成
|
|
468
|
+
|
|
469
|
+
開発用:
|
|
470
|
+
|
|
471
|
+
```bash
|
|
472
|
+
mkdir -p certs
|
|
473
|
+
openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### Let's Encrypt の使用
|
|
477
|
+
|
|
478
|
+
本番環境では、Let's Encrypt 証明書を使用:
|
|
479
|
+
|
|
480
|
+
```bash
|
|
481
|
+
certbot certonly --standalone -d example.com
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
次に、設定で参照:
|
|
485
|
+
|
|
486
|
+
```json
|
|
487
|
+
{
|
|
488
|
+
"ssl": {
|
|
489
|
+
"key": "/etc/letsencrypt/live/example.com/privkey.pem",
|
|
490
|
+
"cert": "/etc/letsencrypt/live/example.com/fullchain.pem"
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
## 🤝 貢献
|
|
496
|
+
|
|
497
|
+
貢献を歓迎します!お気軽にプルリクエストを送信してください。
|
|
498
|
+
|
|
499
|
+
## 📄 ライセンス
|
|
500
|
+
|
|
501
|
+
MIT © Robiki sp. z o.o.
|
|
502
|
+
|
|
503
|
+
## 🔗 リンク
|
|
504
|
+
|
|
505
|
+
- [GitHub リポジトリ](https://github.com/robiki-ai/robiki-proxy)
|
|
506
|
+
- [npm パッケージ](https://www.npmjs.com/package/@robiki/proxy)
|
|
507
|
+
- [イシュートラッカー](https://github.com/robiki-ai/robiki-proxy/issues)
|
|
508
|
+
|
|
509
|
+
## 💡 ユースケース
|
|
510
|
+
|
|
511
|
+
- **マイクロサービスアーキテクチャ**:ドメイン/パスに基づいて異なるサービスにリクエストをルーティング
|
|
512
|
+
- **開発環境**:複数のサービスをテストするためのローカルプロキシ
|
|
513
|
+
- **API ゲートウェイ**:認証とレート制限を備えた集中エントリポイント
|
|
514
|
+
- **SSL ターミネーション**:プロキシレベルで SSL/TLS を処理
|
|
515
|
+
- **CORS 管理**:集中型 CORS 設定
|
|
516
|
+
- **ロードバランシング**:複数のインスタンスにトラフィックを分散(カスタムハンドラーを使用)
|
|
517
|
+
|
|
518
|
+
## 🛠️ トラブルシューティング
|
|
519
|
+
|
|
520
|
+
### デバッグモード
|
|
521
|
+
|
|
522
|
+
接続の問題をトラブルシューティングするために詳細なログを有効にする:
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
# デバッグモードを有効にする
|
|
526
|
+
DEBUG=true node your-proxy-script.js
|
|
527
|
+
|
|
528
|
+
# または Docker で
|
|
529
|
+
docker run -e DEBUG=true robiki/proxy:latest
|
|
530
|
+
|
|
531
|
+
# または docker-compose.yml で
|
|
532
|
+
services:
|
|
533
|
+
proxy:
|
|
534
|
+
image: robiki/proxy:latest
|
|
535
|
+
environment:
|
|
536
|
+
- DEBUG=true
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
`DEBUG=true` の場合、プロキシは以下をログに記録します:
|
|
540
|
+
- すべてのプロキシ接続試行(REST、WebSocket、HTTP/2 ストリーム)
|
|
541
|
+
- リクエストとレスポンスの詳細
|
|
542
|
+
- 接続エラーとタイムアウト
|
|
543
|
+
- プロキシエラーとクライアントエラー
|
|
544
|
+
|
|
545
|
+
### ポートが既に使用中
|
|
546
|
+
|
|
547
|
+
プロキシは、設定されたポートのプロセスを自動的に終了しようとします。失敗した場合は、手動でポートを解放:
|
|
548
|
+
|
|
549
|
+
```bash
|
|
550
|
+
lsof -ti:443 | xargs kill -9
|
|
551
|
+
lsof -ti:8080 | xargs kill -9
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### SSL 証明書エラー
|
|
555
|
+
|
|
556
|
+
証明書ファイルが読み取り可能で、正しい形式(PEM)であることを確認してください。開発では、自己署名証明書を使用します。
|
|
557
|
+
|
|
558
|
+
### WebSocket 接続の問題
|
|
559
|
+
|
|
560
|
+
WebSocket ルートが正しいプロトコル(ws/wss)で設定されており、ターゲットサービスが WebSocket 接続をサポートしていることを確認してください。
|
|
561
|
+
|
|
562
|
+
## 🧪 テスト
|
|
563
|
+
|
|
564
|
+
Robiki Proxy には、ユニットテスト、統合テスト、高度なシナリオをカバーする包括的なテストスイートが含まれています。
|
|
565
|
+
|
|
566
|
+
### テストの実行
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
# すべてのテストを実行
|
|
570
|
+
yarn test
|
|
571
|
+
|
|
572
|
+
# ウォッチモードでテストを実行
|
|
573
|
+
yarn test:watch
|
|
574
|
+
|
|
575
|
+
# カバレッジ付きでテストを実行
|
|
576
|
+
yarn test:coverage
|
|
577
|
+
|
|
578
|
+
# UI でテストを実行
|
|
579
|
+
yarn test:ui
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
### テストカバレッジ
|
|
583
|
+
|
|
584
|
+
テストスイートには以下が含まれます:
|
|
585
|
+
|
|
586
|
+
- **ユニットテスト**:設定、ユーティリティ、ヘッダー変換、CORS 処理
|
|
587
|
+
- **統合テスト**:HTTP プロキシ、ルート解決、検証、設定読み込み
|
|
588
|
+
- **高度なテスト**:WebSocket プロキシ、HTTP/2 ストリーム、同時接続
|
|
589
|
+
- **Docker テスト**:コンテナビルド、設定読み込み、ランタイム動作
|
|
590
|
+
|
|
591
|
+
### Docker テスト
|
|
592
|
+
|
|
593
|
+
Docker 統合テストを実行:
|
|
594
|
+
|
|
595
|
+
```bash
|
|
596
|
+
# 完全な Docker 統合テスト
|
|
597
|
+
yarn test:docker
|
|
598
|
+
|
|
599
|
+
# 設定読み込みを特にテスト
|
|
600
|
+
yarn test:docker:config
|
|
601
|
+
|
|
602
|
+
# すべてのテストを実行(ユニット + 統合 + Docker)
|
|
603
|
+
yarn test:all
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
または Make を使用:
|
|
607
|
+
|
|
608
|
+
```bash
|
|
609
|
+
# クイック Docker ビルドテスト
|
|
610
|
+
make test-docker
|
|
611
|
+
|
|
612
|
+
# 完全な統合テストスイート
|
|
613
|
+
make test-docker-full
|
|
614
|
+
|
|
615
|
+
# 設定読み込みテスト
|
|
616
|
+
make test-docker-config
|
|
617
|
+
|
|
618
|
+
# Docker Compose テスト
|
|
619
|
+
make test-docker-compose
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
詳細については、[Docker テスト README](tests/docker/README.md) を参照してください。
|
|
623
|
+
|
|
624
|
+
## 📊 パフォーマンス
|
|
625
|
+
|
|
626
|
+
このプロキシは Node.js ネイティブ HTTP/2 実装に基づいており、高性能向けに設計されています:
|
|
627
|
+
|
|
628
|
+
- 効率的なストリーム処理
|
|
629
|
+
- 最小限のオーバーヘッド
|
|
630
|
+
- コネクションプーリング
|
|
631
|
+
- 自動 HTTP/1.1 フォールバック
|
|
632
|
+
|
|
633
|
+
本番環境デプロイメントでは、以下を検討してください:
|
|
634
|
+
|
|
635
|
+
- プロセスマネージャーの使用(PM2、systemd)
|
|
636
|
+
- マルチコアシステム用のクラスタリングの有効化
|
|
637
|
+
- ヘルスチェックによる監視
|
|
638
|
+
- 適切なログ記録の設定
|
|
639
|
+
|