스프링부트 의 경우 다음 빌드 처리 다음 참조
https://macaronics.net/index.php/m01/spring/view/1759
셀 스크립트 참조
https://macaronics.net/index.php/m01/spring/view/1582
1 .Ubuntu 20.04 LTS 다운로드 및 설치하기
https://ubuntu.com/download/desktop
https://blog.dalso.org/linux/ubuntu-20-04-lts/8850
2. 우분투 업데이트 및 ssh 설치
1) 패키지 정보 업데이트
update - 설치 가능한 패키지 리스트를 최신화
upgrade - 실제 업데이트
$ sudo apt update
$ sudo apt upgrade
2) ssh server 설치
$ sudo apt install openssh-server
3)ssh 서버 시작
sudo systemctl enable sshd
sudo systemctl restart sshd
4) 기타
환경에 맞게 설정을 편집합니다. 자세한 내용은 SSH 보안 설정
$ sudo vi /etc/ssh/sshd_config
ssh 를 22번이 아닌 다른 포트 사용
=>
https://www.lesstif.com/lpt/ssh-22-20776114.html
3-1. JDK 11 설치
다음 명령 어로 깔끔하게 설치 된다.
- 다음과 같이 openjdk-11-jdk를 설치
$ sudo apt-get install openjdk-11-jdk
설치가 완료되면 다음과 같이 설치가 되었는지 확인
$ java -version
3-2. 자바 1.8 설치
1) openjdk 설치
$ sudo apt-get install openjdk-8-jdk
2)설치 확인
$ java -version
3) 환경별수 설정
a) 위치확인
$ which javac
b)링크 설정
$readlink -f /usr/bin/javac
JAVA_HOME은 /usr/lib/jvm/java-8-openjdk-amd64으로 설정
c) 새로 vi에디터를 설치
$sudo apt-get install vim
d)설치후 vi 로 profile 수정
$ vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH
e) profile reload
$source /etc/profile
f)환경변수 확인
$echo $JAVA_HOME
# $JAVA_HOME/bin/javac -version
4. MariaDB 설치하기
참조 할것
1)MariaDB 서버를 설치
$ apt install mariadb-server
2) mariadb-client를 설치
$ apt-get install mariadb-client
$ mysql_secure_installation
접속테스트를 해보자. mysql -u root -p 명령을 root 권한으로 실행
$ mysql -u root -p
3)원격접속 허용
vi /etc/mysql/mariadb.conf.d/50-server.cnf
에서
bind-address = 127.0.0.1을 주석 처리
대소문자 구분 제거
[mysqld] 밑에 lower_case_table_names=1
포트변경
[mysqld] 밑에 port = 33066
유저생성 및 디렉토리 권한 부여
1) addUser [계정 이름]
업로드 디렉토리 생성
# mkdir uploads
chmod -R 755 ./[파일 또는 디렉토리]
#chmod -R 755 uploads/
5.톰캣 설치
1)톰캣을 설치할 임의 위치로 이동
$ cd home/ubuntu
2) 다음 원하는 톰캣 버전을 wget 을 통해 다운로드 한다.
https://tomcat.apache.org/download-80.cgi
(wget 설치 안되었을 경우 $apt install wget )
오른쪽 마우스로 링크주소 복사후 설치
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz
3)압축 풀기
$ tar -zxvf apache-tomcat-8.5.73.tar.gz
$ mv apache-tomcat-8.5.73 www
4) 톰캣 구동및 확인
root@ubuntu:/home/ubuntu# /home/ubuntu/www/bin/startup.sh
$ ifocnfig 로 로컬 아이피 확인후
클라우드 호스팅 및 기타 서버에서
톰캣 화면이 뜨지 않을 경우 톰캣 server.xml(/home/ubuntu/www/conf/server.xml )
방화벽 8080 포트 번호를 오픈 시켜준다.
netstat -an | grep 8080 확인 및 브라우저 확인
캐시오류 시 설정
conf/context.xml
WEB-INF/web.xml WEB-INF/tomcat-web.xml ${catalina.base}/conf/web.xml
tomcat server.xml 수정
- tomcat에서는 실제 작업을 하지 않아도 연동은 된다. 다만, 클라이언트 접속 로그 기록이 기본 적으로 nginx의 호스트 ip가 기록이 됨으로 실제 접속 클라이언트 IP가 기록되도록 이부분을 변경을 해 주도록 하자.
%h 를 %{x-forwarded-for}i 변경, x-forwarded-for로 넘겨진 인자를 access_log 파일에 기록
변경전
<Valve className=org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
변경후
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%{X-Forwarded-For}i %l %u %t "%r" %s %b" />
** X-Real-IP 헤더를 사용한다면 %{x-real-ip}i 를 사용하면 된다.
=>
Load Balancer 바깥 클라이언트의 IP 알아내고 Access Log 남기기
6. nginx 설치
1) Nginx 설치
$ sudo apt install nginx
2) 실행 (부팅시 자동 실행)
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
$ sudo systemctl status nginx
3)브라우저 화면으로 확인 80포트
추가참조:
6. nginx 톰캣 연동
만약 아파치가 이미 설치되어 있는 상태라면, 깨끗히 아파치를 지우고 시작하자. 왜냐하면 nginx와 apache 둘 다 80 포트를 사용하는 웹 서버이기 때문에 충돌이 일어난다.
1) 백업
혹시, 설정이 안될 경우 대비하여 default 파일을 임의 디렉토리 cp 또는 다운로드 백업
/etc/nginx/sites-available/default
2) default 설정 파일을 연다음
$ sudo vi /etc/nginx/sites-available/default
전부 지우고 다음을 입력
upstream tomcat { ip_hash; server 127.0.0.1:8080; } server { server_name 도메인주소 www.도메인주소; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://tomcat; proxy_redirect off; charset utf-8; } }
nginx의 기본 업로드 제한이 1MB이기 때문에 발생하는 문제이다. 해당 사이즈를 원하는 크기로 변경하면 정상적으로 파일이 업로드가 된다.
우선 설정을 위해 nginx.conf 파일을 열어야한다.
vi /etc/nginx/nginx.conf
우분투 기준으로 /etc/nginx 디렉토리에 nginx.conf 파일이 위치한다. vi로 해당 파일을 열기위해 위에 작성한 명령어를 입력한다.
해당 파일을 열면 위와 같은 화면이 보이는데 그 중 http 블록안에 client_max_body_size 항목을 추가할 수 있다.
현재 client_max_body_size 10M; 이라고 작성했는데 이는 업로드 제한 용량을 10M로 설정한 것이다
3) nginx 재시작
$ systemctl restart nginx
★두개포트 설정 - 백엔드 리액트 설정시
톰캣 설정한것 처럼 복사해서 아래로 리액트로 붙여서 포트와 도메인만 변경해주면 된다.
upstream tomcat { ip_hash; server 127.0.0.1:5000; } server { server_name 도메인주소 www.도메인주소; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://tomcat; proxy_redirect off; charset utf-8; } } #################### 프론트 ################ upstream react { ip_hash; server 127.0.0.1:3000; } server { server_name 도메인주소 www.도메인주소; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://react; proxy_redirect off; charset utf-8; } }
cors 설정 예 ===>
upstream tomcat { ip_hash; server 127.0.0.1:5000; } server { # listen 80; # listen [::]:80; server_name ma7server.p-e.kr www.ma7server.p-e.kr; location ~* \.(eot|ttf|woff|woff2)$ { add_header Access-Control-Allow-Origin *; } location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://tomcat; proxy_redirect off; charset utf-8; } location /todo { proxy_hide_header Access-Control-Allow-Origin; add_header 'Access-Control-Allow-Origin' '*' always; #모든 도메인 허용할경우 add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always; add_header 'Access-Control-Max-Age' 1728000; proxy_pass http://tomcat ; proxy_redirect off; charset utf-8; } location /api { proxy_hide_header Access-Control-Allow-Origin; add_header 'Access-Control-Allow-Origin' '*' always; #모든 도메인 허용할경우 add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always; add_header 'Access-Control-Max-Age' 1728000; proxy_pass http://tomcat ; proxy_redirect off; charset utf-8; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/ma7server.p-e.kr/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/ma7server.p-e.kr/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = ma7server.p-e.kr) { return 301 https://$host$request_uri; } # managed by Certbot server_name ma7server.p-e.kr www.ma7server.p-e.kr; listen 80; return 404; # managed by Certbot } ######################## front 설정 ################### upstream react { ip_hash; server 127.0.0.1:3000; } server { server_name ma7front.p-e.kr www.ma7front.p-e.kr; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://react; proxy_redirect off; charset utf-8; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/ma7front.p-e.kr/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/ma7front.p-e.kr/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = ma7front.p-e.kr) { return 301 https://$host$request_uri; } # managed by Certbot server_name ma7front.p-e.kr www.ma7front.p-e.kr; listen 80; return 404; # managed by Certbot }
리액트는 빌드를 통해 3000 포트로 돌리면서 로그를 확인 할수 있다.
serve -s build
https://soonysoon.tistory.com/88
최종 적으로 완성 된 코드는
1) 리액트를 빌드 한다.
$npm run build 한다.
여기서는 home/react/jpaApp/build 경로로 빌드 파일이 생성 되었다.
2) nginx 기본 루트 경로는 /usr/share/nginx/html; 인데 이 경로를 리액트 build 경로로 변경
다음과 같이 root 경로를 리액트 빌드 파일 경로로 변경 처리 한다 . root /home/react/jpaApp/build;
server { server_name ma7front.p-e.kr www.ma7front.p-e.kr; listen 80; listen [::]:80; location / { root /home/react/jpaApp/build; # nginx 기본 루트 경로 HTML파일이 위치할 경로 index index.html index.htm; try_files $uri /index.html; } }
ngix 를 재구동 한다.
$systemctl restart nginx
3)리액트 디렉토리 nginx 유저 권한으로 변경 시키기
만약에 500 에러가 나거나 권한 설정 에러 403에러가 나오면
nginx.conf 파일을 열고
$ vim /etc/nginx/nginx.conf
맨 상단의 user 권한을 확인한다
nginx.conf
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; ~
현재 유저 권한이 www-data 로 나와 있는데
react 디렉토리를 다음과 같이 nginx 유저 권한으로 변경 시킨다.
$chown -R www-data:www-data /home/react/
===>
또는 react 서버 배포 유저로 명으로 변경후 nginx 재실행한다.
user nginx; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; ~
$ systemctl restart nginx
upstream tomcat { ip_hash; server 127.0.0.1:5000; } server { server_name ma7server.p-e.kr www.ma7server.p-e.kr; ## 다음 woff2 파일들이 차단될 경우 설정 location ~* \.(eot|ttf|woff|woff2)$ { add_header Access-Control-Allow-Origin *; } ######################## 일반 웹 설정 ################### location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://tomcat; proxy_redirect off; charset utf-8; } ######################## /todo 시작되는 경로와 /api 로 시작되는 경로는 restapi jwt 설정 ################### location /todo { proxy_hide_header Access-Control-Allow-Origin; add_header 'Access-Control-Allow-Origin' '*' always; #모든 도메인 허용할경우 add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always; add_header 'Access-Control-Max-Age' 1728000; proxy_pass http://tomcat ; proxy_redirect off; charset utf-8; } location /api { proxy_hide_header Access-Control-Allow-Origin; add_header 'Access-Control-Allow-Origin' '*' always; #모든 도메인 허용할경우 add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always; add_header 'Access-Control-Max-Age' 1728000; proxy_pass http://tomcat ; proxy_redirect off; charset utf-8; } } ######################## front 설정 ################### server { server_name ma7front.p-e.kr www.ma7front.p-e.kr; listen 80; listen [::]:80; location / { root /home/react/jpaApp/build; # nginx 기본 루트 경로 HTML파일이 위치할 경로 index index.html index.htm; try_files $uri /index.html; } }
=> ssl certbot 적용후 코드
upstream tomcat { ip_hash; server 127.0.0.1:5000; } server { server_name ma7server.p-e.kr www.ma7server.p-e.kr; location ~* \.(eot|ttf|woff|woff2)$ { add_header Access-Control-Allow-Origin *; } location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://tomcat; proxy_redirect off; charset utf-8; } location /todo { proxy_hide_header Access-Control-Allow-Origin; add_header 'Access-Control-Allow-Origin' '*' always; #모든 도메인 허용할경우 add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always; add_header 'Access-Control-Max-Age' 1728000; proxy_pass http://tomcat ; proxy_redirect off; charset utf-8; } location /api { proxy_hide_header Access-Control-Allow-Origin; add_header 'Access-Control-Allow-Origin' '*' always; #모든 도메인 허용할경우 add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, Cookie' always; add_header 'Access-Control-Max-Age' 1728000; proxy_pass http://tomcat ; proxy_redirect off; charset utf-8; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/ma7server.p-e.kr/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/ma7server.p-e.kr/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = ma7server.p-e.kr) { return 301 https://$host$request_uri; } # managed by Certbot server_name ma7server.p-e.kr www.ma7server.p-e.kr; listen 80; return 404; # managed by Certbot } ######################## front 설정 ################### server { server_name ma7front.p-e.kr www.ma7front.p-e.kr; listen 80; listen [::]:80; location / { root /home/react/jpaApp/build; # nginx 기본 루트 경로 HTML파일이 위치할 경로 index index.html index.htm; try_files $uri /index.html; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/ma7front.p-e.kr/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/ma7front.p-e.kr/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = ma7front.p-e.kr) { return 301 https://$host$request_uri; } # managed by Certbot server_name ma7front.p-e.kr www.ma7front.p-e.kr; listen 80; return 404; # managed by Certbot }
7.스프링 부트 배포시 오류
1) ServletInitializer 자바파일 추가
MacaronicsApplication.class 는
@SpringBootApplication이 설정되어 있는 클래스 파일
@EnableScheduling @EnableAspectJAutoProxy @Log4j public class MacaronicsApplication
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MacaronicsApplication.class); } }
2) 스프링 부트 버전에 따른 이클립스 자바 컴파일 문제
window -> Preferences->java
3)기타 다음을 참조
http://macaronics.net/index.php/m01/spring/view/1759
8. SSL certbot
다음 사이트에서 운영체제 서버환경등 플랫폼에 맞게 메뉴얼에 맞게 설치하면 된다.
Node.js HTTPS 설정하기
https://freestrokes.tistory.com/154#hELLO
댓글 ( 11)
댓글 남기기