php 5.5.38에 Legacy Code로 코딩된 다수의 프로젝트들과 nginx 1.16.1
그리고 Aurora RDS를 사용하는 서버에 Laravel(라라벨)을 설치하여 간단한 프로젝트를 진행하기 위한 서버 셋팅 작업입니다.
본 작업에서 핵심은 Docker에 설치한 php73-fpm을 컨테이너 외부로 뻬내고 Composer와 Laravel 설치 후 작업 공간 또한 외부로 빼서 수정된 소스가 도커가 꺼져도 문제 없게 하는 것이다.
- 서버(위에서는 외부라고 불린)에 작업공간 생성
- docker 및 docker-compose 설치
- Dockerfile 생성
- docker-compose.yml 생성
- Laravel docker build
- docker 실행
- Laravel 설치
- nginx 설정 파일 생성 및 확인
- laravel 권한 설정
- docker 로그파일 보기
- Nginx 재시작 및 확인
- 자주 쓰는 명령
- 그밖에..
One. 서버에 작업공간 생성
mkdir /home/docker/laravel/html # 원하시는 곳으로 설정하셔도 됩니다.
cd /home/docker/laravel # 라라벨 도커 및 작업공간이 생성될 위치
Two. docker 및 docker-compose 설치
# 아래 명령은 어디서 해도 상관 없음
sudo yum -y update
sudo yum -y install docker docker-compose
Three. Dockerfile 생성
# 현재 위치 - /home/docker/laravel
vi Dockerfile
------------------------- cut here ----------------------------
# 1. 라라벨 설치를 시작할 도커 이미지
FROM php:7.3-fpm
# 2. 패키지를 구성할 작업공간 및 초기화 작업
WORKDIR /root
RUN apt-get update
RUN apt-get install -y curl
# 3. Composer 설치
RUN export COMPOSER_ALLOW_SUPERUSER=1
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/bin/composer
# 4. Laravel 설치를 위한 사전작업
RUN apt-get install -y zlib1g-dev && apt-get install -y libzip-dev
RUN docker-php-ext-install zip pdo_mysql mysqli
# 5. Laravel 설치
RUN composer global require laravel/installer
RUN ["/bin/bash", "-c", "echo PATH=$PATH:~/.composer/vendor/bin/ >> ~/.bashrc"]
RUN ["/bin/bash", "-c", "source ~/.bashrc"]
# 6. 도커 내부에 php-fpm 및 MySQL 포트를 외부로 노출 및 실행
EXPOSE 9000 3306
CMD ["php-fpm"]
------------------------- cut here ----------------------------
Four. docker-compose.yml 생성
# 현재 위치 - /home/docker/laravel
vi docker-compose.yml #
------------------------- cut here ----------------------------
version: '3'
services:
php:
build:
context: .
dockerfile: Dockerfile
ports:
- "9090:9000"
- "3306:3306"
volumes:
- /home/docker/laravel/html:/var/www/html
------------------------- cut here ----------------------------
부연설명 :
services.php.build.context 는 현재위치
services.php.build.dockerfile은 Dockerfile
services.php.ports: 는 “server:docker(container)” 로 매핑
services.php.volumes 는 “server:docker(container)” 로 매핑
port는 도커에 설치된 php-fpm이 기본값으로 9000 포트에 설치되어 있는데, 이것을 외부로 노출할 로컬서버 9090 포트에 매핑하라는 설정이고
MySQL 포트는 3306 에서 3306 으로 매핑하겠다는 설정이며
volumes 은 도커에 Laravel이 설치될 기본 위치 /var/www/html 을 도커 내 이미지에 기록하지 말고 서버에 기록되게 하기 위해 /home/docker/laravel/html 에 연결한다.
추가적으로, vscode (Visual Studio Code)의 Laravel Extension Pack 을 설치하여 쓰실 경우 도커 볼륨의 위치를 /root 로 할 경우 원할하게 이용할 수 있다.
(이거 완전 꿀팁 방출임. 자그만치 3일을 고생해서 찾은거, 하지만 resource 들이 로딩 않될 수도 있다.)
– 조건 : remote docker 에 laravel 설치되어 있고 로컬에서 remote ssh 로 접근하여 소스 수정을 하는 경우 (쉽지 않은 개발환경)
조건 : Artisan Docker Enable = true
Artisan Docker Command = docker exec app_name(ex:laravel_php_1)
Five. Laravel docker build
docker-compose build
Six. docker 실행
docker-compose up -d
Seven. Laravel 설치
# 서버에서 실행
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4bb303c15c8 laravel_php "docker-php-entryp..." 2 hours ago Up 2 hours 0.0.0.0:9090->9000/tcp laravel_php_1
# 위에 목록에서 컨테이너ID(c4bb303c15c8), 컨테이너명(laravel_php_1)을 입력하여 도커 내부로 진입
docker exec -it 컨테이너ID(c4bb303c15c8) 혹은 컨테이너명(laravel_php_1) bash
# 여기는 도커 내부입니다.
cd /var/www/html
laravel new .
# 설치가 완료되면 콘트롤 + D 혹은 exit
Eight. nginx 설정 파일 생성 및 확인
# 서버에서 실행
server {
server_name my.laravel.app;
# 중요!!! 이 위치는 도커의 웹루트를 기준으로 해야됨
root "/var/www/html/public";
index index.php;
client_max_body_size 10m;
access_log /home/docker/laravel/html/_logs/access.log;
error_log /home/docker/laravel/html/_logs/error.log;
location / {
try_files $uri $uri/ /index.php$uri?$args;
}
location ~ "^(.+\.php)($|/)" {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SERVER_NAME $host;
# 매핑한 9090 포트로 연결
fastcgi_pass 127.0.0.1:9090;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
access_log off;
}
location ~* \.(html|htm)$ {
expires 30m;
}
location ~* /\.(ht|git|svn) {
deny all;
}
}
Nine. Laravel 권한 설정
# 서버
chmod -R 777 /home/docker/laravel/html/storage
chmod -R 777 /home/docker/laravel/html/bootstrap/cache
# 위의 작업은 도커에서는 아래와 같이 하셔도 됨
chown -R www-data.www-data /var/www/html/storage
chown -R www-data.www-data /var/www/html/bootstrap/cache
Ten. docker 로그파일 보기
# 서버 /home/docker/laravel 위치에서
docker logs -ft 컨테이너ID(c4bb303c15c8) 혹은 컨테이너명(laravel_php_1)
Eleven. nginx 재시작 및 확인
nginx -t 로 설정을 체크 하고
sudo systemctl restart nginx
Twelve. 자주 쓰는 명령
# 서버에서 실행
# 도커 종료(/home/docker/laravel 위치에서)
docker-compose down
# 도커 이미지 목록
docker images
# 도커 이미지 삭제
docker rmi 컨테이너ID(c4bb303c15c8) 혹은 컨테이너명(laravel_php_1)
# 실행 중인 도커 목록
docker ps -a
# 실행 중인 도커 목록 중지
docker stop $(docker ps -aq)
Comment
Docker 내부에 npm을 설치해도 되고 서버에 있는 npm 을 공유해서 사용해도 되는데 편하신 방법을 사용하시면 됩니다.
가끔 public 내부에 css, js 폴더에 접근 안되는 경우가 있는데, 이 경우 라라벨이 설치된 디렉토리 혹은 부모들의 디렉토리에 읽기 권한이 없는 경우이니, 퍼미션을 755로 맞춰주면 됩니다.
– 이 부분이 계속 문제가 되서 확실한것이 없습니다.
– 현재 성공한 설정은 도커 내부의 라라벨 소스의 위치가 /var/www/html/src1/public , /var/www/html/src2/public 와 같이 html 아래 소스 디렉토리가 위치할 경우 성공함
– 실패한 설정은 아래와 같은 디렉토리에서 실패를 함.
/root/public
/home/public
/home/src/public
/home/src/public_html/public
/home/src/public_html/html/src/public
Dockerfile 내에 npm 을 설치하고 싶을 때는 Dockerfile 안에 RUN apt-get install -y npm 을 넣어주세요.
설치 후 vue 및 css, js 를 빌드 하는 방법은 아래 명령을 확인하세요.
# 도커 안에서
composer require laravel/ui
php artisan ui vue —auth
# 도커 안에서 해도 되고 서버에서 해도됨 (위치는 package.json 파일이 위치한곳)
npm install && npm run dev
Comment II
Laravel에서 메일 전송을 위해 sendmail 을 사용할 예정이라면 3가지만 생각하시면 됩니다.
1. Sendmail 설치 – RUN apt-get install -y sendmail
2. php에 sendmail 활성화 – sendmail_path = “/usr/sbin/sendmail -t -i”
3. /etc/hosts 파일에 서버에서 사용하는 도메인 등록 – 127.0.0.1 localhost localhost.localdomain user.domainName
172.18.0.2 8b122d145e7d localhost.localdomain user.domainName
1, 2번은 바로 확인이 되며 동작을 하지 않지만
3번의 경우는 1분의 딜레이 후 발송되는 사례이니 삽질 시 참고하시기 바랍니다.
If you don t have a lot of experience with Nginx, this is what we define here index.html will be our default index, the server name is php-docker.local and it should be pointing