다중 도메인 설정에서 Laravel을 사용하기 위한 확장
이 패키지를 사용하면 단일 Laravel 설치로 여러 HTTP 도메인을 사용할 수 있습니다.
서로 다른 고객이 코드 측면에서는 동일한 애플리케이션을 사용하지만 데이터베이스, 스토리지, 구성 측면에서는 그렇지 않은 경우가 많습니다.
이 패키지는 각 고객에 대해 특정 환경 파일, 특정 스토리지 경로 및 특정 데이터베이스를 얻는 매우 간단한 방법을 제공합니다.
라라벨 | 다중 도메인 |
---|---|
11.x | 11.x |
10.x | 10.x |
9.x | 5.x |
8.x | 4.x |
7.x | 3.x |
6.x | 2.x |
5.8.x | 1.4.x |
5.7.x | 1.3.x |
5.6.x | 1.2.x |
5.5.x | 1.1.x |
v1.1.x 릴리스:
현재까지 v1.1.6+, v1.2.x, v1.3.x, v1.4.x, v2.x 및 v3.x 릴리스는 기능적으로 동일합니다. 해당 버전의 Laravel 프레임워크와의 통합 테스트를 실행하기 위해 릴리스가 분리되었습니다.
그러나 Laravel 8 릴리스에서는 v1.1.14, v1.2.8, v1.3.8 및 v1.4.8 릴리스가 해당 Laravel 5.x 버전의 새로운 기능을 포함하는 마지막 릴리스입니다(해당 버전에 대한 버그 수정 지원은 여전히 활성화되어 있습니다). . 2021-02-13 업데이트 : v1.1+ 릴리스의 일부 마지막 기능은 아직 진행 중입니다 :)
v1.0에는 Laravel 5.1, 5.2, 5.3 및 5.4가 필요합니다(laravel 5.4에 비해 더 이상 유지 관리 및 테스트되지 않지만 패키지 사용법은 1.1과 동일합니다).
2023-02-20 업데이트 : Laravel 10.x부터 패키지 버전은 동일한 번호를 따릅니다.
Composer.json에 요구 사항으로 gecche/laravel-multidomain을 추가합니다.
{
"require" : {
"gecche/laravel-multidomain" : "11.*"
}
}
작곡가 업데이트로 패키지를 업데이트하거나 작곡가 설치로 설치하세요.
또한 composer require gecche/laravel-multidomain
사용하여 패키지를 추가하고 나중에 원하는 버전을 지정할 수도 있습니다.
이 패키지는 특정 환경 파일을 얻기 위해 부트스트랩 프로세스 시작 시 Laravel 핵심 기능의 최소 집합에서 HTTP 도메인 감지를 재정의해야 합니다. 따라서 이 패키지는 대부분의 Laravel 패키지보다 몇 가지 구성 단계가 더 필요합니다.
설치 단계:
bootstrap/app.php
파일의 맨 위에 있는 다음 줄을 수정하여 전체 Laravel 컨테이너를 교체합니다. //use Illuminate F oundation A pplication
use Gecche Multidomain Foundation Application
config/app.php
파일의 확장된 항목으로 QueueServiceProvider
를 재정의합니다. ' providers ' => Illuminate Support ServiceProvider:: defaultProviders ()-> merge ([
// Package Service Providers . . .
])-> replace ([
Illuminate Queue QueueServiceProvider::class => Gecche Multidomain Queue QueueServiceProvider::class,
])-> merge ([
// Added Service Providers ( Do not remove this line ) . . .
])-> toArray (),
다른 이유로 config/app.php
파일을 변경한 경우 해당 파일에 위의 providers
항목이 이미 있을 수 있으며 중요한 줄은 QueueServiceProvider
를 대체하는 줄뿐입니다.
php artisan vendor:publish
(이 패키지는 검색 기능을 사용합니다.)
위 단계를 따르면 애플리케이션은 대기열 지원을 포함하여 HTTP 및 CLI 요청 모두에 대해 실행 중인 HTTP 도메인을 인식하게 됩니다.
참고: Laravel 11에서는 설치가 이전보다 간단합니다. 이전 버전의 Laravel을 사용하는 경우 설명서에서 설치 단계를 확인하세요.
이 패키지는 커뮤니티 기여에 따른 Horizon과 호환됩니다. 이 패키지를 Horizon과 함께 사용해야 하는 경우 다른 두 가지 설치 단계를 따라야 합니다.
평소대로 Laravel Horizon을 설치하세요.
app/Providers/HorizonServiceProvider.php 파일의 맨 위에 있는 Laravel Horizon 가져오기를 교체하세요.
//use Laravel H orizon H orizonApplicationServiceProvider ;
use Gecche Multidomain Horizon HorizonApplicationServiceProvider ;
이 패키지는 애플리케이션 HTTP 도메인을 관리하는 세 가지 명령을 추가합니다.
domain.add
artisan 명령 기본 명령은 애플리케이션에 추가할 HTTP 도메인의 이름을 인수로 사용하는 domain:add
명령입니다. 동일한 코드를 공유하는 site1.com
및 site2.com
두 개의 도메인이 있다고 가정해 보겠습니다.
우리는 단순히 다음을 수행합니다.
php artisan domain:add site1.com
그리고
php artisan domain:add site2.com
이 명령은 두 개의 새로운 환경 파일인 .env.site1.com
및 .env.site2.com
을 생성합니다. 여기에 각 사이트에 대한 특정 구성(예: 일반적으로 환경에서 발견되는 데이터베이스 구성, 캐시 구성 및 기타 구성)을 넣을 수 있습니다. 파일).
이 명령은 또한 config/domains.php
파일의 domains
키에 항목을 추가합니다.
또한 storage/site1_com/
및 storage/site2_com/
두 개의 새 폴더가 생성됩니다. 메인 저장소와 동일한 폴더 구조를 가지고 있습니다.
이 storage
하위 구조에 대한 사용자 정의는 config/domain.php
파일의 값과 일치해야 합니다.
domain.remove
artisan 명령 domain:remove
명령은 해당 환경 파일을 삭제하여 애플리케이션에서 지정된 HTTP 도메인을 제거합니다. 예:
php artisan domain:remove site2.com
force
옵션을 추가하면 도메인 저장소 폴더가 삭제됩니다.
또한 이 명령은 config/domains.php
파일의 domains
키에서 적절한 항목을 제거합니다.
domain.update_env
장인 명령 domain:update_env
명령은 json으로 인코딩된 데이터 배열을 전달하여 환경 파일 중 하나 또는 모두를 업데이트합니다. 이러한 값은 해당 .env 끝에 추가됩니다.
domain
인수를 추가하여 단일 도메인 환경 파일을 업데이트합니다.
domain
인수가 없으면 명령은 표준 .env
파일을 포함하여 모든 환경 파일을 업데이트합니다.
업데이트할 도메인 목록은 domain.php
구성 파일에 유지됩니다.
예:
php artisan domain:update_env --domain_values='{"TOM_DRIVER":"TOMMY"}'
모든 도메인 환경 파일에 TOM_DRIVER=TOMMY
줄을 추가합니다.
domain.list
장인 명령 domain:list
명령은 현재 설치된 도메인을 해당 .env 파일 및 스토리지 경로 디렉토리와 함께 나열합니다.
목록은 config/domain.php
구성 파일의 domains
키에 유지됩니다.
이 목록은 domain:add
및 domain:remove
명령이 실행될 때마다 자동으로 업데이트됩니다.
config:cache
장인 명령config:cache artisan 명령은 다른 artisan 명령과 동일한 방식으로 이 패키지와 함께 사용할 수 있습니다.
이 명령은 명령이 실행된 각 도메인에 대해 config.php 파일을 생성합니다. 즉, 명령
php artisan config:cache --domain=site2.com
파일을 생성합니다
config-site2_com.php
런타임 시 현재 HTTP 도메인은 laravel 컨테이너에 유지되며 이 패키지에 추가된 domain()
메서드를 통해 액세스할 수 있습니다.
domainList()
메소드를 사용할 수 있습니다. 위의 domain.list
명령과 유사하게 설치된 도메인 정보가 포함된 연관 배열을 반환합니다.
예:
[
site1.com => [
'storage_path' => <LARAVEL-STORAGE-PATH>/site1_com,
'env' => '.env.site1.com'
]
]
애플리케이션이 수신한 각 HTTP 요청에 대해 특정 환경 파일이 로드되고 특정 스토리지 폴더가 사용됩니다.
특정 환경 파일 및/또는 저장 폴더가 발견되지 않으면 표준 환경 파일 및/또는 저장 폴더가 사용됩니다.
올바른 HTTP 도메인 감지는 $_SERVER['SERVER_NAME']
PHP 변수를 사용하여 수행됩니다.
중요 참고 사항: 일부 실행 환경에서는 $_SERVER['SERVER_NAME']이 인스턴스화되지 않으므로 아래 설명된 대로 HTTP 도메인 감지를 사용자 정의할 때까지 이 패키지가 제대로 작동하지 않습니다.
릴리스 1.1.15부터 HTTP 도메인 감지는 Application
생성자의 새 domainParams
인수에 대한 domain_detection_function_web
항목으로 Closure
전달하여 사용자 정의할 수 있습니다. 다음 예에서 HTTP 도메인 감지는 $_SERVER['HTTP_HOST']
$_SERVER['SERVER_NAME']
HTTP_HOST']를 사용합니다.
//use Illuminate F oundation A pplication ;
use Gecche Multidomain Foundation Application ;
use Illuminate Foundation Configuration Exceptions ;
use Illuminate Foundation Configuration Middleware ;
$ environmentPath = null ;
$ domainParams = [
' domain_detection_function_web ' => function () {
return Illuminate Support Arr:: get ( $ _SERVER , ' HTTP_HOST ' );
}
];
return Application:: configure (basePath: dirname ( __DIR__ ),
environmentPath: $ environmentPath ,
domainParams: $ domainParams )
-> withRouting (
web: __DIR__ . ' /../routes/web.php ' ,
commands: __DIR__ . ' /../routes/console.php ' ,
health: ' /up ' ,
)
-> withMiddleware ( function ( Middleware $ middleware ) {
//
})
-> withExceptions ( function ( Exceptions $ exceptions ) {
//
})-> create ();
도메인을 구별하기 위해 각 artisan 명령은 domain
새로운 옵션을 허용합니다. 예:
php artisan list --domain=site1.com
이 명령은 해당 도메인 설정을 사용합니다.
artisan 명령 queue:work
및 queue:listen
명령이 새로운 domain
옵션을 허용하도록 업데이트되었습니다.
php artisan queue:work --domain=site1.com
평소와 같이 위 명령은 해당 도메인 설정을 사용합니다.
예를 들어, database
드라이버를 사용 중이고 동일한 db를 공유하는 두 개의 도메인이 있는 경우 각 도메인의 작업을 별도로 관리하려면 두 개의 고유한 대기열을 사용해야 한다는 점을 명심하십시오.
예를 들어 다음과 같이 할 수 있습니다.
QUEUE_DEFAULT=default1
, site2.com의 경우 QUEUE_DEFAULT=default2
).queue.php
구성 파일을 업데이트합니다. 'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => env('QUEUE_DEFAULT','default'),
'retry_after' => 90,
],
php artisan queue:work --domain=site1.com --queue=default1
그리고
php artisan queue:work --domain=site1.com --queue=default2
분명히 sync
드라이버를 제외하고 서로 다른 큐 드라이버에 대해서도 동일한 작업을 수행할 수 있습니다.
storage:link
명령 storage:link
명령을 사용하고 각 도메인에 대해 고유한 심볼릭 링크를 원하는 경우 현재까지 해당 명령은 항상 storage
라는 링크를 생성하고 해당 이름이 명령에 하드 코딩되어 있으므로 이를 수동으로 생성해야 합니다. 이름을 선택할 수 있는 storage:link
명령을 확장하는 것은 이 패키지의 범위를 벗어납니다(그리고 이것이 향후 버전의 Laravel에서 직접 수행되기를 바랍니다).
여러 저장소 링크를 얻는 방법은 다음과 같습니다. 두 개의 도메인( site1.com
및 site2.com
과 관련 저장소 폴더 storage/site1_com
및 storage/site2_com
가 있다고 가정해 보겠습니다.
ln -s storage/site1_com/app/public public/storage-site1_com
ln -s storage/site2_com/app/public public/storage-site2_com
.env.site1.com
및 .env.site2.com
에 첫 번째 도메인에 대한 항목을 추가합니다. APP_PUBLIC_STORAGE=-site1_com
filesystems.php
구성 파일에서 다음과 같이 변경합니다. 'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage'.env('APP_PUBLIC_STORAGE'),
'visibility' => 'public',
],
또한 SPA(단일 페이지 응용 프로그램) 설정에서 패키지를 사용하는 경우 .htaccess 또는 Scaenicus가 .htaccess 솔루션에서 지적한 유사한 솔루션을 통해 각 도메인에 대한 고유한 공용 리소스를 더 잘 처리할 수 있습니다.
버전 1.1.11부터 환경 파일을 저장할 폴더를 선택하기 위해 응용 프로그램 생성자에 두 번째 인수가 추가되었습니다. 수십 개의 도메인이 있는 경우 루트 Laravel의 앱에 환경 파일을 두는 것은 그리 즐겁지 않습니다. 접는 사람.
따라서 다른 폴더를 사용하려면 bootstrap/app.php
파일 맨 위에 추가하면 됩니다. 예를 들어, envs
하위 폴더에 환경 파일을 추가하려면 다음을 수행하면 됩니다.
//use Illuminate F oundation A pplication ;
use Gecche Multidomain Foundation Application ;
use Illuminate Foundation Configuration Exceptions ;
use Illuminate Foundation Configuration Middleware ;
$ environmentPath = dirname ( __DIR__ ) . DIRECTORY_SEPARATOR . ' envs ' ;
$ domainParams = [];
return Application:: configure (basePath: dirname ( __DIR__ ),
environmentPath: $ environmentPath ,
domainParams: $ domainParams )
-> withRouting (
web: __DIR__ . ' /../routes/web.php ' ,
commands: __DIR__ . ' /../routes/console.php ' ,
health: ' /up ' ,
)
-> withMiddleware ( function ( Middleware $ middleware ) {
//
})
-> withExceptions ( function ( Exceptions $ exceptions ) {
//
})-> create ();
두 번째 인수를 지정하지 않으면 표준 폴더로 간주됩니다. 폴더를 지정하는 경우 표준 .env
파일도 해당 폴더에 배치되어야 합니다.
특정 도메인(예: sub1.site1.com
에서 웹 페이지 또는 셸 명령을 실행하려고 하는데 해당 도메인에 대한 특정 환경 파일이 없는 경우, 즉 .env.sub1.site1.com
파일이 존재하지 않는 경우 패키지는 도메인 이름을 점으로 분할하여 사용 가능한 첫 번째 환경 파일을 사용합니다. 이 예에서 패키지는 다음 중에서 첫 번째 환경 파일을 검색합니다.
.env.site1.com
.env.com
.env
저장소 폴더에도 동일한 논리가 적용됩니다.
설정에서 Laravel의 스케줄러를 사용하는 경우, schedule:run
명령도 도메인 옵션과 함께 실행되어야 한다는 점을 기억하십시오. 따라서 각 도메인에 대해 스케줄러를 시작해야 합니다. 처음에는 하나의 Scheduler 인스턴스가 모든 도메인에 대해 시작된 명령을 처리해야 한다고 생각할 수 있지만 Scheduler 자체는 Laravel 애플리케이션 내에서 실행되므로 실행되는 "env"는 예약된 각 명령에 자동으로 적용되며 --domain
옵션은 전혀 효과가 없습니다.
Supervisor와 같은 외부 도구에도 동일하게 적용됩니다. 예를 들어 queue:work
명령과 같은 장인 명령에 Supervisor를 사용하는 경우 처리하려는 각 도메인에 대한 명령을 준비하십시오.
위와 같은 이유로 인해 패키지가 작동하지 않는 경우가 있습니다. 예를 들어 스케줄러의 crontab
항목이 아닌 감독자 구성을 변경할 가능성이 없는 설정에서는 그렇습니다. Docker 인스턴스가 사용된 이러한 예가 여기에서 지적되었습니다.
마지막으로, 일부 Laravel 명령은 분명히 --domain
옵션 없이 내부에서 다른 Artisan 명령을 호출한다는 점에 유의하세요. 위의 상황은 하위 명령이 표준 환경 파일과 함께 작동하기 때문에 제대로 작동하지 않습니다. 예를 들어 --seed
옵션을 사용할 때의 migrate
명령이 있습니다.