본문 바로가기
Java & 스프링/스프링부트 톺아보기

[스프링 부트 ] Nginx 와 함께 배포 하기(1)

by hjhello423 2019. 10. 13.

해당 포스팅은 CentOS8 환경에서 스프링 부트 2.1, JAVA8을 이용해서 진행했다.

 

 

스프링 부트를 리눅스 서버에 배포하는 과정을 차근차근 포스팅해보려 한다.

쉬운 것부터 시작해서 최종 목표는 Docker를 이용한 무중단 배포를 진행하는 것이다.

 


일단 스프링 부트 프로젝트를 jar 형태로 nginx에 배포하고자 한다.

정말 기본적인 과정만 쉬운 것부터 진행해 보자.

 

우리는 8080 포트를 사용하는 부트를 실행할 것이다.

그리고 80 포트의 nginx와 함께 리버스 프록시 기능을 이용해서 사용자가 80 포트로 접근하면 8080 포트인 부트에 연결시켜줄 것이다.

 


일단 80 포트로 외부에서 접근 가능하도록 방화벽을 열어주자.

CentOS 기준으로 80 포트를 오픈하는 방법은 아래 방법을 가장 자주 사용한다.

 

아래 명령어 둘 다 80 포트를 열어주는 것이다. (둘 중 하나만 실행 하자.)

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-port=80/tcp

 

명령어를 실행하면 public.xml에 내용이 자동으로 추가된다.

cat /etc/firewalld/zones/public.xml

 

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <service name="cockpit"/>
  <service name="http"/>
</zone>

위의 public.xml 파일의 내용은 ''firewall-cmd --permanent --zone=public --add-service=http'를 실행했을 때의 결과이다.

 

자 이제 변경사항을 반영해보자.

'reload'를 이용해서 반영할 수 있고, 'list-all'를 이용해 적용된 서비스 및 포트 룰을 확인 가능하다.

firewall-cmd --reload
firewall-cmd --list-all

 


스프링 부트는 별다른 기능이 없는 기초적인 형태를 준비했다.

'/hello'로 접근하면 그냥 스트링 'hello'를 반환할 것이다.

관련 소스는 포스팅 가장 아래에 있는 git 링크를 참조하길 바란다.

 

<SampleController.java>

@RestController
public class SampleController {

    @GetMapping("/hello")
    public String hello() {
        return "hello!!";
    }
}

 

 


작성한 스프링 프로젝트 파일을 패키징 해보자.

프로젝트의 루트 경로로 이동해서 cmd를 이용해 maven 패키징 명령어를 실행 하자.

mvn clean package

 

패키징이 완료 되면 ./target 디렉토리에 .jar 파일이 생성되었을 것이다.

java 명령어를 이용해 실행시켜보면 잘 스프링 부트 어플리케이션이 잘 실행될 것이다.

java -jar toy_project-1.0-SNAPSHOT.jar

 


이제 jar 파일을 우리의 리눅스 서버로 옮기자. (lrsz 모듈을 설치하면 쉽게 ftp를 사용할 수 있다.)

우리는 아직 실행 환경을 서비스화 하지 않을 것이다.

그래서 jar를 실행시킨 ssh 클라이언트를 종료하지 말고 유지시켜 주자.

이 부분은 다음 포스팅에서 해결해 보도록 하자.

스프링 부트를 실행시켰으니 상태를 유지한 채로 ssh 클라이언트를 이용해 새로 접속 하자.

 


이제 nginx의 설정을 변경하고 실행시켜 보자.

중요한 건 Location 부분이다. 이 부분만 수정해 주자.

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 / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

....

proxy_pass : 요청이 오면 http://localhost:8080로 전달한다.

proxy_set_header XXX : 실제 요청 데이터를 header의 각 항목에 할당한다.

       ex) proxy_set_header X-Real-IP $remote_addr: Request Header의 X-Real-IP에 요청자의 IP를 저장

 

 

이제 nginx 서비스를 실행시켜 보자.

nginx를 yum으로 설치해서 아래 명령어로 간단하게 실행/정지 가능하다.

nginx 설치가 안됐다면 아래 링크에서 설치 방법을 따라 하길 바란다.

[Server] - [Nginx] CentOS에 nginx yum 이용하여 설치 하기

 

service nginx start
service nginx stop
service nginx restart

 

이제 모든 준비가 끝났다.

웹 브라우저에서 http:/{서버 IP}/hello 경로로 접속해보자.

 

hello!! 문자열을 확인 했다면 성공! 마무리하고 다음 포스팅을 따라 진행해보자.

 

 

만약 permission denied 에러가 발생하명 아래 링크 내용을 따라해 보고 해결하길 바란다.

[Server] - [Nginx] (13: Permission denied) while connecting to upstream 해결

 

 


링크

 

 

 

 

반응형

댓글