이번 포스팅은 지난 포스팅에 이어서 Nginx로 React를 배포하는 과정을 정리해 보려 한다.
배포 과정 중 제일 오류가 많았기에(난 울지 않or..☆˚´″°³о), 차근차근 짚어서 보도록 하겠다.
그.
전.
에.
Nginx에 대하여 알고 싶다면,
전에 포스팅한 Nginx란? 글을 한 번 읽어보면 좋겠다! 😁
그럼 본격적으로 Nginx 설치와 React 앱 배포 과정을 알아보자!
AWS EC2 인스턴스 환경에 따라 Nginx를 설치해 준다.
$ sudo yum install nginx // Amazon Linux 1 환경
$ sudo amazon-linux-extras install nginx1.12 // Amazon Linux 2 환경
(필자는 지난번 인스턴스 생성과정에서 Linux2 환경으로 생성했기에, 아래 코드로 Nginx를 설치하였다.)
지난 포스팅에서 배포할 앱을 git clone [프로젝트 url]
해오는 것까지 완료하였다.
이제 프로젝트 내부의 React(client) 앱 상위 폴더로 진입하여 yarn install
후 build
를 생성할 것이다.
(이 두 과정은 이후 개발이 진행하여 새로운 버전을 배포할 때마다 새로운 버전을 배포할 때마다 이뤄지도록 해야 한다.)
$ yarn install
$ yarn run build
build가 성공적으로 진행된다면 build라는 디렉토리가 생성되고 build 내부에는 index.html
이라는 파일이 있을 것이다. 이 파일은 이후 Nginx 설정에서 사용되며 React로 만들어진 웹에서의 시작점이라고 할 수 있다.
만약 build를 진행하는 과정이 지나치게 오래 걸리거나 실패할 수 있는데, 혹시 그렇다면 t2.micro의 메모리로 감당할 수 없는 규모의 앱일 가능성이 높다.
바람직하지 않지만, 지금 당장의 배포에 의의를 두기 위해서는 인스턴스 외부의 로컬에서 build를 진행하고 build 디렉토리를 받아오는 방법도 있다.(로컬에서 build를 진행하고 git pull과 같은...)
Nginx와 관련된 설정 파일들은 /etc 하위에 존재하므로, sudo 권한을 이용해서 파일 생성과 수정 등을 해야 한다.
우선 아래 명령어를 통해 해당 파일을 열면 기본적으로 여러 내용이 이미 설정되어 있는 것을 확인할 수 있다.
$ sudo vi /etc/nginx/nginx.conf
nginx.conf 내에서 React 프로젝트의 build로 바로 이어지게 설정할 수도 있지만, 설정들을 깔끔하게 관리하기 위해서 일반적으로 선호되는 방식은 /etc/nginx 내에 sites-enabled 디렉토리를 생성하여 여기에 각 서비스의 설정을 넣고 nginx.conf가 이들을 확인하도록 하는 것이다.
하나의 인스턴스 내부인데도 ‘각 서비스’라고 표현한 것은, 가상 호스트(서버) 개념을 사용할 수 있기 때문이다. 이를 통해 하나의 컴퓨터, 즉 하나의 IP 내에서 여러 웹을 배포할 수 있다.(Nginx의 장점이라 할 수 있겠다. 🤗)
지금은 앞서 말한 대로 sites-enabled 디렉토리에 따로 설정을 만들어줄 것이므로, server 블럭 행들은 모두 주석 처리(행 앞에 #) 하도록 한다. 그리고 server 블럭 바로 위에 아래와 같이 include /etc/nginx/sites-enabled/*.conf;
를 추가함으로써 sites-enabled 하위의 설정 파일들을 포함하도록 한다.
...
include /etc/nginx/conf.d/*.conf;
(✨ 코드 추가) include /etc/nginx/sites-enabled/*.conf;
# server {
# listen 80 default_server;
# listen [::]:80 default_server;
# server_name _;
# root /usr/share/nginx/html;
# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
# location / {
# }
# error_page 404 /404.html;
# location = /40x.html {
# }
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
...
일반적인 방식은 sites-available 디렉토리에 필요한 파일들을 작성한 후 이들과 연결되는 symbolic link(symlink)를 sites-enabled에 추가하는 것이다. 때문에 /etc/nginx 내부에 두 디렉토리를 모두 생성해 준다. 그리고 sites-available 내에 원하는 이름으로 설정 파일을 생성해 열도록 한다.
$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled
$ sudo vi /etc/nginx/sites-available/#######.conf
지금은 도메인 등록도 되어있지 않고, HTTPS를 위한 준비도 되어있지 않으므로, HTTP에 해당하는 port 80에 대해서 아주 기본 설정만 포함한다.
server {
listen 80;
location / {
root /home/ec2-user/#######/#######/build;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
/
는 directive라고 하는 부분인데, IP 주소나 도메인의 뒷부분인 URI에 대응된다. /
만 쓰면 ‘/’
로 시작하는 모든 URI에 해당한다는 것으로 현재 설정은 이 인스턴스의 IP 주소로 port 80을 통해 들어오는 모든 URL을 연결시켜주는 것이다.build 디렉토리 경로
를 입력한다.$ sudo ln -s /etc/nginx/sites-available/#######.conf /etc/nginx/sites-enabled/#######.conf
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
위와 같은 내용이 출력되면 설정의 문법이 정상적이라는 것이다.
이제 Nginx를 동작시키고, 웹 브라우저에서 AWS EC2 인스턴스 IP 주소를 입력하면 build한 React 앱으로 연결되는 것을 확인할 수 있다.
(AWS EC2 인스턴스 IP 주소로 바로 연결할 때 https로 들어가지는데, 현재는 http만 설정했기 때문에, http로 수정하면 들어가질 것이다.)
$ sudo systemctl start nginx
만약, 500 Internal Server Error
가 발생한다면, build까지의 경로로 접근할 때 거치는 디렉토리들에 대해 외부에서의 실행 권한이 없어서 발생하는 문제일 가능성이 높으므로, 홈 디렉토리인 /home/ec2-user의 권한을 others의 실행 권한을 포함한 711로 설정한다.
$ chmod 711 /home/ec2-user
👏 여기까지 잘 따라왔다면, Nginx로 React 앱 배포를 성공한 것이다. 👏
다음 포스팅에서는 pm2를 사용한 서버 실행과 배포 시 발생하는 cors 에러를 알아보겠다.!