caddy php
1.0.0
這更多是概念的證明,而不是一個工作齊全的項目。這試圖複製Caddy JSON API結構以通過可連鎖的PHP類工作。
目前,Caddy 2.0中只有一小部分命令涵蓋了我當前需要的用例。
composer require mattvb91/caddy-php具有靜態響應的HTTP服務器的基本示例:
$ caddy = new Caddy ();
$ caddy -> addApp (
( new Http ())-> addServer (
' server1 ' , ( new Http Server ())-> addRoute (
( new Route ())-> addHandle (
new StaticResponse ( ' Hello world ' , 200 )
)
))
);
$ caddy -> load ();這將導致以下球童配置:
{
"admin" : {
"disabled" : false ,
"listen" : " :2019 "
},
"apps" : {
"http" : {
"servers" : {
"server1" : {
"listen" : [
" :80 "
],
"routes" : [
{
"handle" : [
{
"handler" : " static_response " ,
"body" : " Hello world " ,
"status_code" : 200
}
]
}
]
}
}
}
}
}curl -v localhost
-----
< HTTP/1.1 200 OK
< Server: Caddy
Hello world 如果您要動態管理主機名(在數據庫中),並且無法使用現有主機名列表構建配置,因為您需要在運行時管理它們,您可以執行以下操作:
此示例中的重要部分是host_group_name標識符,後來用於將 /刪除域添加到此主機。
$ caddy = new Caddy ();
$ caddy -> addApp (
( new Http ())-> addServer (
' server1 ' , ( new Http Server ())-> addRoute (
( new Route ())-> addHandle (
new StaticResponse ( ' host test ' , 200 )
)-> addMatch (( new Host ( ' host_group_name ' ))
-> setHosts ([ ' localhost ' ])
)
)-> addRoute (( new Route ())
-> addHandle ( new StaticResponse ( ' Not found ' , 404 ))
-> addMatch (( new Host ( ' notFound ' ))
-> setHosts ([ ' *.localhost ' ])
)
))
);
$ caddy -> load ();現在,以後在系統上的腳本或事件中,您可以獲取您的球童配置對象,並在該路線下向其發布一個新域:
$ caddy -> addHostname ( ' host_group_name ' , ' new.localhost ' )
$ caddy -> addHostname ( ' host_group_name ' , ' another.localhost ' )curl -v new.localhost
> GET / HTTP/1.1
> Host: new.localhost
>
< HTTP/1.1 200 OK
curl -v another.localhost
> GET / HTTP/1.1
> Host: another.localhost
>
< HTTP/1.1 200 OK $ caddy -> syncHosts ( ' host_group_name ' ); //Sync from caddy current hostname list
$ caddy -> removeHostname ( ' host_group_name ' , ' new.localhost ' );
$ caddy -> removeHostname ( ' host_group_name ' , ' another.localhost ' );curl -v new.localhost
> GET / HTTP/1.1
> Host: new.localhost
>
< HTTP/1.1 404 Not Found
curl -v another.localhost
> GET / HTTP/1.1
> Host: another.localhost
>
< HTTP/1.1 404 Not Found讓我們以一個您想要在/api/*路由上的php後端進行節點前端和PHP後端的情況。在這種情況下,該示例將與路由匹配器分解為2反向代理,以將/api/*過濾到上游的PHP。
假設3個主機(CADDY,NODE,PHP)都是Docker容器,並且可以在同一Docker網絡中的容器名稱訪問,因此您可能必鬚根據需要調整主機名。
use mattvb91 CaddyPhp Caddy ;
use mattvb91 CaddyPhp Config Apps Http ;
use mattvb91 CaddyPhp Config Apps Http Server ;
use mattvb91 CaddyPhp Config Apps Http Server Route ;
use mattvb91 CaddyPhp Config Apps Http Server Routes Handle ReverseProxy ;
use mattvb91 CaddyPhp Config Apps Http Server Routes Handle ReverseProxy Transport FastCGI ;
use mattvb91 CaddyPhp Config Apps Http Server Routes Handle ReverseProxy Upstream ;
use mattvb91 CaddyPhp Config Apps Http Server Routes Handle Subroute ;
use mattvb91 CaddyPhp Config Apps Http Server Routes Match Host ;
use mattvb91 CaddyPhp Config Apps Http Server Routes Match Path ;
$ apiReverseProxy = ( new ReverseProxy ())
-> addUpstream (( new Upstream ())
-> setDial ( ' laravel-api:9000 ' )
)-> addTransport (( new FastCGI ())
-> setRoot ( ' /app/public/index.php ' )
-> setSplitPath ([ '' ])
);
$ apiMatchPath = ( new Path ())
-> setPaths ([
' /api/* ' ,
]);
$ backendAPIRoute = ( new Route ())
-> addHandle ( $ apiReverseProxy )
-> addMatch ( $ apiMatchPath );
$ route = new Route ();
$ route -> addHandle (( new Subroute ())
-> addRoute ( $ backendAPIRoute )
-> addRoute (( new Route ())
-> addHandle (( new ReverseProxy ())
-> addUpstream (( new Upstream ())
-> setDial ( ' nextjs:3000 ' )
)
)
)
)-> addMatch (( new Host ())
-> setHosts ([
' localhost ' ,
])
)-> setTerminal ( true );
$ caddy = new Caddy ();
$ caddy -> addApp (( new Http ())
-> addServer ( ' myplatform ' , ( new Server ())
-> addRoute ( $ route )
)
);
$ caddy -> load ();這將發布以下球童配置:
{
"admin" : {
"disabled" : false ,
"listen" : " :2019 "
},
"apps" : {
"http" : {
"servers" : {
"myplatform" : {
"listen" : [
" :80 "
],
"routes" : [
{
"handle" : [
{
"handler" : " subroute " ,
"routes" : [
{
"handle" : [
{
"handler" : " reverse_proxy " ,
"transport" : {
"protocol" : " fastcgi " ,
"root" : " /app/public/index.php " ,
"split_path" : [
" "
]
},
"upstreams" : [
{
"dial" : " laravel-api:9000 "
}
]
}
],
"match" : [
{
"path" : [
" /api/* "
]
}
]
},
{
"handle" : [
{
"handler" : " reverse_proxy " ,
"upstreams" : [
{
"dial" : " nextjs:3000 "
}
]
}
]
}
]
}
],
"match" : [
{
"host" : [
" localhost "
]
}
],
"terminal" : true
}
]
}
}
}
}
}curl -v localhost
< HTTP/1.1 200 OK
< Content-Type: text/html ; charset=utf-8
< Server: Caddy
< X-Powered-By: Next.js
< Transfer-Encoding: chunked
<
< ! DOCTYPE html><html > ....curl -v localhost/api/testroute
< HTTP/1.1 200 OK
< Content-Type: application/json
< Server: Caddy
< X-Powered-By: PHP/8.1.7
<
{ " status " :200}
看看測試以獲取更多示例。