多个主机之间的重定向均衡器。
Requires
- php: >=8.0
- ext-ctype: *
- ext-iconv: *
- ext-pcntl: *
- ext-redis: *
- bentools/uri-factory: ^2.2
- clue/redis-react: ^2.4
- nyholm/dsn: ^2.0
- react/http: ^1.2
- symfony/console: 5.2.*
- symfony/dotenv: 5.2.*
- symfony/flex: ^1.3.1
- symfony/framework-bundle: 5.2.*
- symfony/yaml: 5.2.*
Requires (Dev)
- clue/block-react: ^1.4
- pestphp/pest: ^1.0
- phpstan/phpstan: ^0.12.79
- squizlabs/php_codesniffer: ^3.5
Conflicts
Replaces
This package is not auto-updated.
Last update: 2024-09-24 04:09:59 UTC
README
302
这是一个不作为负载均衡器的负载均衡器。
它是一个 重定向 均衡器。它不是将流量转发到特定的主机/端口,而是返回带有不同位置的302响应。
典型用法是,您的入口点是 https://example.com/foo
,您希望将流量重定向到由 https://01.example.com
和 https://02.example.com
组成的池,同时保持路径和查询字符串完整。
它是基于 ReactPHP 在 PHP 8 上构建的。因为它提供非常短的响应并在循环中运行,所以它可以轻松地处理每秒数千个请求而不会眨眼。
构建
构建是可选的(您可以简单地运行 php bin/console serve
),但将生成一个优化后的单文件可执行PHAR。
PHP 8、Composer和Box必须在您的计算机上全局安装。
要构建应用程序,请运行
./bin/build
它将位于 bin/302
中。
用法
实时平衡(无持久性 - 用于测试或原型设计)
php bin/302 serve \ --host=0.0.0.0 \ --port=8080 \ --pick=random \ # or round-robin example1.org \ example2.org \ example3.org
GET http://0.0.0.0:8080/foo?bar=baz HTTP/1.1 302 Found Location: http://example2.org/foo?bar=baz
持久存储(Redis)
# Expose the REDIS_DSN variable if necessary, default is: export REDIS_DSN="redis://localhost:6379" php bin/302 serve --host=0.0.0.0 --port=8080
应用程序将运行,但用户代理将获得503错误,因为服务器池为空。
将服务器添加到池中
php bin/302 server:add example1.org
可以在 302 serve
运行时运行此命令,无需重新启动应用程序!
从池中移除服务器
php bin/302 server:remove example1.org
可以在 302 serve
命令运行时运行此命令,无需重新启动应用程序!
列出池中的服务器
php bin/302 server:list
测试
./vendor/bin/pest
部署
示例Supervisor配置
在构建应用程序之后,您可以轻松创建一个supervisor配方以在启动时加载它
[program:302] command=php /usr/local/bin/302 serve --host=127.0.0.1 --port=80%(process_num)02d user=www-data numprocs=4 startsecs=1 autostart=true autorestart=true process_name=%(program_name)s_%(process_num)02d environment = APP_LOG_DIR=/var/log/302
使用上述配置,302将在 127.0.0.1:8000
、127.0.0.1:8001
、127.0.0.1:8002
和 127.0.0.1:8003
上运行。
轮询将在实例之间共享(因为它们共享相同的Redis实例)。
CORS / SSL终止
302没有内置的CORS或SSL终止,但这可以通过任何具有反向代理功能的Web服务器(Apache、Nginx、Caddy等)处理。
Caddyfile示例
如果您使用Caddy,这里是一个示例 Caddyfile
example.org {
@get {
method GET
}
@options {
method OPTIONS
}
header Access-Control-Allow-Origin *
header Access-Control-Allow-Redirect true
respond @options 200
reverse_proxy @get 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003
}