นี่เป็นข้อพิสูจน์แนวคิดมากกว่าโครงการที่ทำงานอย่างเต็มที่ สิ่งนี้พยายามที่จะทำซ้ำโครงสร้าง 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 ();ซึ่งจะส่งผลให้ Caddy config ต่อไปนี้:
{
"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 ลองใช้กรณีที่คุณต้องการมีส่วนหน้าโหนดและแบ็กเอนด์ PHP รับคำขอบนเส้นทาง /api/* ในกรณีนี้ตัวอย่างจะแบ่งพร็อกซีย้อนกลับ 2 รายการด้วยตัวจับคู่เส้นทางเพื่อกรอง /api/* ไปยัง PHP ต้นน้ำ
สิ่งนี้ถือว่าโฮสต์ทั้ง 3 (แคดดี้, โหนด, 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 ();สิ่งนี้จะโพสต์ caddy config ต่อไปนี้:
{
"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}
ลองดูตัวอย่างเพิ่มเติม