웹사이트 검색

Ubuntu 16.04에서 Nginx로 Laravel 애플리케이션을 배포하는 방법


Laravel은 PHP로 작성된 가장 인기 있는 오픈 소스 웹 애플리케이션 프레임워크 중 하나입니다. 자주 사용하는 애플리케이션 작업(예: 캐싱 및 인증)을 더 쉽게 만들어 개발자가 간단하고 복잡한 애플리케이션을 모두 구축할 수 있도록 지원하는 것을 목표로 합니다.

이 튜토리얼에서는 프로덕션 환경을 염두에 두고 몇 가지 일반적인 단계가 필요한 간단한 Laravel 애플리케이션을 배포합니다. 예를 들어 애플리케이션은 필요한 데이터베이스에만 액세스할 수 있는 전용 데이터베이스 사용자를 사용해야 합니다. 파일 권한은 필요한 디렉토리와 파일만 쓰기 가능하도록 보장해야 합니다. 응용 프로그램 구성 세부 정보를 노출할 수 있는 디버깅 정보가 최종 사용자에게 표시되지 않도록 응용 프로그램 설정을 고려해야 합니다.

이 자습서는 기존 애플리케이션 배포에 관한 것입니다. 대신 Laravel 프레임워크 자체를 사용하는 방법에 대해 배우고 싶다면 Laravel 자체 Laravel from Scratch 시리즈에서 시작하는 것이 좋습니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • 루트가 아닌 sudo 사용자 및 방화벽을 포함하여 이 초기 서버 설정 자습서로 설정된 Ubuntu 16.04 서버 1대
  • Ubuntu 16.04 튜토리얼의 Linux, Nginx, MySQL, PHP(LEMP 스택)에 따라 설치된 LEMP 스택.
  • DigitalOcean으로 호스트 이름을 설정하는 방법에 설명된 대로 서버를 가리키는 도메인 이름입니다. 이 자습서에서는 전체적으로 example.com을 사용합니다. 이는 TLS 암호화로 애플리케이션을 안전하게 제공할 수 있도록 웹사이트에 대한 SSL 인증서를 얻는 데 필요합니다.

1단계 - 패키지 종속성 설치

Laravel 애플리케이션을 실행하려면 기본 LEMP 스택 외에도 일부 PHP 확장과 Composer라는 PHP 종속성 관리자가 필요합니다.

패키지 관리자 캐시를 업데이트하여 시작하십시오.

  1. sudo apt-get update

필요한 PHP 확장은 멀티바이트 문자열 지원 및 XML 지원을 위한 것입니다. 이러한 확장, Composer 및 unzip(Composer가 zip 파일을 처리할 수 있도록 함)을 동시에 설치할 수 있습니다.

  1. sudo apt-get install php7.0-mbstring php7.0-xml composer unzip

이제 패키지 종속성이 설치되었으므로 앱에 대한 전용 사용자 계정과 MySQL 데이터베이스를 만들고 구성합니다.

2단계 - MySQL 구성

Laravel은 다양한 데이터베이스 서버를 지원합니다. 이 튜토리얼은 LEMP 스택을 사용하기 때문에 MySQL은 애플리케이션에 대한 데이터를 저장합니다.

기본 설치에서 MySQL은 루트 관리 계정만 생성합니다. 데이터베이스 서버에 대한 무제한 권한이 있기 때문에 웹 사이트 내에서 루트 데이터베이스 사용자를 사용하는 것은 나쁜 보안 관행입니다. 대신 Laravel 애플리케이션이 사용할 전용 데이터베이스 사용자와 Laravel 사용자가 액세스할 수 있는 새 데이터베이스를 생성해 보겠습니다.

MySQL root 관리 계정에 로그인합니다.

  1. mysql -u root -p

설치하는 동안 MySQL 루트 계정에 대해 설정한 암호를 입력하라는 메시지가 표시됩니다.

웹 사이트에 사용할 laravel이라는 새 데이터베이스를 생성하여 시작합니다. 다른 이름을 선택할 수 있지만 나중에 필요하므로 기억해 두십시오.

  1. CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

다음으로 이 데이터베이스에 액세스할 수 있는 새 사용자를 만듭니다. 여기서는 laraveluser를 사용자 이름으로 사용하지만 이것도 사용자 정의할 수 있습니다. 다음 줄의 password를 강력하고 안전한 암호로 바꾸십시오.

  1. GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';

권한을 플러시하여 MySQL 서버에 변경 사항을 알립니다.

  1. FLUSH PRIVILEGES;

그리고 MySQL을 종료합니다.

  1. EXIT;

이제 Laravel이 사용할 전용 데이터베이스와 사용자 계정을 구성했습니다. 데이터베이스 구성 요소가 준비되었으므로 다음으로 데모 애플리케이션을 설정합니다.

3단계 - 데모 애플리케이션 설정

GitHub의 Laravel이 배포한 데모 빠른 시작 애플리케이션은 간단한 작업 목록입니다. 할 일 항목을 추가 및 제거하고 작업을 MySQL 데이터베이스에 저장할 수 있습니다.

먼저 애플리케이션을 저장할 Nginx 웹 루트 내에 디렉토리를 만듭니다. 데모 애플리케이션의 이름은 quickstart이므로 /var/www/html/quickstart를 사용하겠습니다.

  1. sudo mkdir -p /var/www/html/quickstart

다음으로 새로 만든 디렉터리의 소유권을 사용자로 변경하여 sudo를 사용하지 않고 내부 파일로 작업할 수 있도록 합니다.

  1. sudo chown sammy:sammy /var/www/html/quickstart

새 디렉터리로 이동하고 Git을 사용하여 데모 애플리케이션을 복제합니다.

  1. cd /var/www/html/quickstart
  2. git clone https://github.com/laravel/quickstart-basic .

Git은 데모 애플리케이션 저장소에서 모든 파일을 다운로드합니다. 다음과 같은 출력이 표시됩니다.

Git output
Cloning into '.'... remote: Counting objects: 263, done. remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263 Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done. Resolving deltas: 100% (72/72), done. Checking connectivity... done.

다음으로 프로젝트 종속성을 설치해야 합니다. 라라벨은 Composer를 활용하여 종속성 관리를 처리하므로 필요한 패키지를 한 번에 쉽게 설치할 수 있습니다.

  1. composer install

다소 긴 출력에는 모든 프로젝트 종속성에 대한 설치 진행률이 표시됩니다.

Composer output
Loading composer repositories with package information Installing dependencies (including require-dev) from lock file . . . Generating autoload files > php artisan clear-compiled > php artisan optimize Generating optimized class loader

앱 자체가 설정되었으므로 다음 단계는 앱 환경 구성입니다. 여기에는 애플리케이션과 데이터베이스를 연결하고 프로덕션을 위한 일부 설정을 사용자 지정하는 작업이 포함됩니다.

4단계 - 애플리케이션 환경 구성

이 단계에서는 일부 보안 관련 애플리케이션 설정을 수정하고, 애플리케이션이 데이터베이스에 연결하도록 허용하고, 데이터베이스 사용을 준비합니다. 이것은 우리가 여기에서 사용하고 있는 데모 애플리케이션뿐만 아니라 모든 LEMP 지원 Laravel 애플리케이션에 필요한 단계입니다.

nano 또는 선호하는 텍스트 편집기로 Laravel 환경 구성 파일을 엽니다.

  1. sudo nano /var/www/html/quickstart/.env

파일을 다음과 같이 변경해야 합니다. passwordexample.com과 같은 자리 표시자 변수를 적절한 값으로 업데이트해야 합니다.

APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://example.com

DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password

. . .

파일을 저장하고 종료합니다.

이러한 변경 사항을 자세히 살펴보겠습니다. 여기에는 두 개의 구성 블록이 있습니다. 첫 번째는 애플리케이션 구성용이고 두 번째는 데이터베이스 구성용입니다.

애플리케이션 구성 섹션에서:

  • APP_ENV 변수는 애플리케이션이 실행되는 시스템 환경을 나타냅니다. 기본값은 로컬 개발 환경에 사용되는 local입니다. 프로덕션 배포의 경우 여기에서 수행한 것처럼 production로 변경해야 합니다.\n이 변수를 변경하면 로그 상세도, 캐싱 설정 및 오류 표시 방법(앱에 따라 다름)이 제어됩니다. 로컬 설정을 사용하면 개발 및 디버깅을 쉽게 할 수 있도록 설정되어 있습니다. 이는 앱에서 작업할 때 편리하지만 프로덕션 설정에서는 사용하면 안 됩니다.\n
  • APP_DEBUG 변수는 APP_ENV를 보완하고 디버깅 정보 및 자세한 오류 표시를 명시적으로 활성화 또는 비활성화합니다. 프로덕션 설정에서 디버깅 정보가 사용자에게 표시되지 않도록 하려면 이 값을 false로 설정해야 합니다.\n
  • APP_URL 변수는 사이트에 액세스할 수 있는 IP 주소 또는 도메인 이름을 지정합니다. 여기서는 example.com 도메인 이름을 사용했지만 웹 사이트에 액세스해야 하는 자신의 도메인으로 대체해야 합니다.\n

데이터베이스 구성 섹션은 좀 더 간단합니다.

  • DB_DATABASE는 데이터베이스의 이름입니다.
  • DB_USERNAME은 앱이 사용해야 하는 MySQL 사용자의 이름입니다.
  • DB_PASSWORD는 해당 사용자의 데이터베이스 암호입니다.

다음으로 데이터베이스 마이그레이션을 실행해야 합니다. 그러면 새로 생성된 데이터베이스가 데모 애플리케이션이 제대로 실행되는 데 필요한 테이블로 채워집니다.

  1. php artisan migrate

Artisan은 프로덕션 모드에서 실행할 것인지 확인을 요청할 것입니다. 질문에 y라고 답하세요. 나중에 필요한 데이터베이스 작업을 실행합니다.

Artisan output
************************************** * Application In Production! * ************************************** Do you really wish to run this command? [y/N] (yes/no) [no]: > y Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2015_10_27_141258_create_tasks_table

이제 Laravel이 완전히 설치되고 구성되었습니다. 다음으로 애플리케이션을 제공하도록 Nginx를 구성해야 합니다.

5단계 - Nginx 구성

애플리케이션 디렉토리는 시스템 사용자인 sammy가 소유하며 웹 서버에서 읽을 수는 있지만 쓸 수는 없습니다. 이것은 대부분의 응용 프로그램 파일에 적합하지만 특별한 처리가 필요한 디렉터리는 거의 없습니다. 특히, 라라벨이 업로드된 미디어와 캐싱된 데이터를 저장하는 곳이라면 웹 서버는 여기에 액세스할 수 있을 뿐만 아니라 파일을 쓸 수 있어야 합니다.

storagebootstrap/cache 디렉토리의 그룹 소유권을 www-data로 변경해 보겠습니다.

  1. sudo chgrp -R www-data storage bootstrap/cache

그런 다음 쓰기 및 실행을 포함한 모든 권한을 그룹에 재귀적으로 부여합니다.

  1. sudo chmod -R ug+rwx storage bootstrap/cache

이제 적절한 권한을 가진 모든 데모 애플리케이션 파일이 준비되었습니다. 다음으로 Nginx 구성을 변경하여 Laravel 설치와 올바르게 작동하도록 해야 합니다. 먼저 기본 파일을 복사하여 애플리케이션에 대한 새 서버 블록 구성 파일을 생성해 보겠습니다.

  1. sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

새로 만든 구성 파일을 엽니다.

  1. sudo nano /etc/nginx/sites-available/example.com

몇 가지 필요한 변경 사항이 있습니다.

  • listen 지시문에서 default_server 지정 제거,
  • root 지시문을 변경하여 웹 루트 업데이트
  • 서버의 도메인 이름을 올바르게 가리키도록 server_name 지시문 업데이트
  • try_files 지시문을 변경하여 요청 URI 처리를 업데이트합니다.

수정된 Nginx 구성 파일은 다음과 같습니다.

server {
    listen 80;
    listen [::]:80;
    
    . . .

    root /var/www/html/quickstart/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    . . .
}

이러한 변경 사항에 대해 자세히 설명하겠습니다.

기본 구성 파일의 listen 지시문에는 default_server 옵션이 활성화되어 있어 다른 서버 블록이 적합하지 않은 경우 서버 블록이 요청을 처리해야 함을 지정합니다. 활성화된 서버 블록 중 하나만 이 옵션을 활성화할 수 있습니다. 기본 서버 블록을 그대로 두었기 때문에 이 두 번째 구성 파일에서 default_server 지정을 제거합니다.

root 지시문은 응용 프로그램 파일이 저장되는 위치를 지정합니다. Laravel 애플리케이션은 /var/www/html/quickstart에 저장되지만 /public 하위 디렉토리만 인터넷에 노출되어야 합니다. 다른 모든 응용 프로그램 파일은 브라우저를 통해 전혀 액세스할 수 없어야 합니다. 이러한 모범 사례를 준수하기 위해 웹 루트를 /var/www/html/quickstart/public로 설정했습니다.

server_name 지시문은 서버 블록이 응답할 도메인 이름 목록을 지정합니다. 여기서는 example.comwww.example.com을 사용했지만 이를 도메인 이름으로 바꿔야 합니다. 당신은 당신의 웹 사이트에 사용하고 싶습니다.

요청 URI 처리도 변경했습니다. 기본 설정은 웹 서버가 기존 파일을 찾은 다음 기존 디렉토리를 찾거나 마지막으로 404 Not Found 오류를 발생시키도록 지시합니다(내장 =404 설정 사용). Laravel이 제대로 작동하려면 모든 요청이 Laravel 자체로 라우팅되어야 합니다. 즉, Nginx의 기본 404 오류 처리기를 제거하고 /index.php?$query_string로 설정하여 요청 쿼리를 주요 Laravel 애플리케이션인 index.php 파일로 전달합니다. 파일.

위와 같이 변경했으면 파일을 저장하고 닫을 수 있습니다. 이 파일에서 sites-enabled 디렉토리로의 심볼릭 링크를 생성하여 새 구성 파일을 활성화해야 합니다.

  1. sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

마지막으로 Nginx를 다시 로드하여 변경 사항을 적용합니다.

  1. sudo systemctl reload nginx

이제 Nginx가 데모 Laravel 애플리케이션을 제공하도록 구성되었으므로 모든 구성 요소가 설정되었습니다.

이 시점에서 배포가 작동하는지 확인하는 것은 쉽습니다. 선호하는 브라우저에서 http://example.com을 방문하기만 하면 됩니다. 간단한 작업 앱이 있는 페이지가 표시되며 작업을 추가하거나 제거할 수 있습니다. 모든 변경 사항은 데이터베이스에 저장되고 이후 웹 사이트 방문을 위해 유지되며 브라우저를 닫고 사이트를 다시 열면 확인할 수 있습니다.

다음 및 마지막 단계에서는 보안 연결을 통해 애플리케이션을 제공하도록 TLS 암호화를 구성합니다.

6단계 - TLS로 애플리케이션 보안

프로덕션 설정을 완료하려면 TLS를 사용하는 보안 HTTPS를 통해 애플리케이션을 제공하는 것이 좋습니다. 이렇게 하면 응용 프로그램과 방문자 간의 모든 통신이 암호화되며 응용 프로그램이 로그인이나 암호와 같은 민감한 정보를 요구하는 경우 특히 중요합니다.

Ubuntu 16.04 튜토리얼에서 Let's Encrypt로 Nginx를 보호하는 방법 이 특정 Laravel 앱 설정에 맞게 약간 수정했습니다.

유일한 변경 사항은 다음과 같습니다.

  • 기본 웹 루트(/var/www/html) 대신 Laravel 애플리케이션의 위치(/var/www/html/quickstart) 사용) SSL 인증서를 요청할 때.
  • 기본 서버 블록 파일 대신 /etc/nginx/sites-available/example.com 구성 파일 수정

특히 인증서를 얻기 위한 명령은 다음과 같습니다.

  1. sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com

그리고 /etc/nginx/sites-available/example.com 구성 파일의 최종 버전은 다음과 같습니다.

server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        root /var/www/html/quickstart/public;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

        location ~ /.well-known {
                allow all;
        }
}

구성에 구문 오류가 없는지 확인하십시오.

  1. sudo nginx -t

모든 변경이 성공적이면 다음과 같은 결과가 나타납니다.

Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

이 경우 Nginx를 안전하게 다시 시작하여 변경 사항을 적용할 수 있습니다.

  1. sudo systemctl restart nginx

Let’s Encrypt TLS/SSL 인증서가 완전히 준비되고 보안 연결을 통해 애플리케이션을 사용할 수 있습니다. 모든 것이 예상대로 작동하는지 확인하려면 https://example.com을 방문하십시오. 이전과 동일한 신청서가 표시되지만 이번에는 연결이 완전히 보호됩니다.

결론

이제 Laravel과 함께 제공되는 데모 애플리케이션을 LEMP 스택을 사용하여 프로덕션 환경에 성공적으로 배포했습니다. 실제 응용 프로그램의 경우 구성 작업 목록에 더 많은 단계와 응용 프로그램별 작업이 포함될 수 있습니다. 확실하지 않은 경우 항상 배포 중인 애플리케이션의 문서를 참조하십시오. 하지만 공식 Laravel 문서에서도 많은 유용한 정보를 찾을 수 있습니다.