나는 처음에 아무생각없이
프론트엔드 실행 스크립트를 다음과 같이 작성했었다.
### 프로젝트 코드 최신화
cd $public_repo_path
echo $password | sudo -S git pull origin main
# 기존의 yarn start 프로세스 죽이기
FRONTEND_PID=$(ps -ef | grep "yarn start" | awk '{print $2}')
for pid in $FRONTEND_PID
do
kill -15 $pid
done
### yarn start 재실행
cd $public_repo_path
cd frontend/rush
echo $password | sudo -S nohup yarn install
echo $password | sudo -S nohup yarn start &
이렇게 하면 문제가 있다. 그것은 바로kill
한 다음 다시 yarn start
하는 사이에 웹 사이트 접속이 안된다는 것! (중단 배포...)
이 문제를 해결해보았다.
1. yarn build 사용
위의 쉘 스크립트를 보면 kill
& yarn start
를 썼는데...
이렇게 할게 아니라 yarn build
를 써야한다.
yarn build
를 하면
프로젝트 디렉토리 내부의 build 라는 디렉토리에
빌드 결과물인 정적 파일들이 생성된다.
이 디렉토리를 가지고
Nginx가 정적 웹 서버 역할을 하게 할 것이다.
2. 정적 파일을 내려주는 웹 서버로 Nginx 사용
이전까지 나는 Nginx를 reverse proxy로만 사용했다.
이제는yarn build
로 만들어둔 정적파일들을 가지고
Nginx가 브라우저에게 html/css/javascript 등을 내려주게 할 것이다.
nginx 설정파일을 수정해보자.
▶ Before
server {
...
set $frontend_url 'http://127.0.0.1:3000';
location / {
proxy_pass $frontend_url;
}
...
}
▶ After
server {
...
location / {
root /home/pi/RUSH-C/frontend/rush/build;
index index.html index.htm;
try_files $uri /index.html;
}
...
}
index 란?
직관적으로 알 수 있다시피 / 경로에 매치시킬 정적파일을 말하는 것이다.
프로젝트 내부의 build 폴더에 가보면 index.html 파일이 있다. 이게 index 역할을 할거라는 뜻이다.
try_files 란?
(출처 : 참고링크 2번 - React를 Nginx 웹 서버에 배포하기)
nginx를 잘 써보지 않아 이번에 찾아 봤는데, react 프로젝트의 경우 페이지 라우팅을 react-router가 보통 하게 될것이다.
즉 index.html 자체에서 페이지 라우팅을 하는 것이다.
try_files 설정은 일종의 nginx 자체의 라우팅 설정이다. 보통 이 부분에서 특정 패턴의 url에 특정 파일등을 redirct 하는 설정을 한다. 만약 페이지를 못 찾을 경우 404 not found 설정등도 이곳에서 한다.
하지만 react 프로젝트인 경우, 웹서버에서 먼저 리퀘스트 url 을 가로채면 react-router의 기능을 사용할수 없게 된다.
(vue등도 마찬가지일 것이다.)
따라서 위처럼 모든 request를 index.html로 곧장 가게 설정해 줘야 한다.
참고
1
서울과기대 17학번 진영이언니 머릿속 (언니 고마워 ♥)
2
React를 Nginx 웹 서버에 배포하기
https://www.hanumoka.net/2019/12/29/react-20191229-react-nginx-deploy/
'2021 Project' 카테고리의 다른 글
HTTPS 적용하기 (NGINX + Lets Encrypt) (1) | 2021.07.28 |
---|---|
NGINX로 Reverse Proxy 설정하기 (1) | 2021.07.26 |
SQL 문법 - expected "identifier" 오류 (0) | 2021.06.28 |
Spring Data JPA 의 Repository (0) | 2021.06.28 |
실서버 YML 파일을 프로젝트 외부에서 관리하기 (0) | 2021.06.24 |