(8) azure 가상머신에 spring boot .jar 파일 배포하기 (feat. 리눅스 데몬 띄우기)

 

환장할 노릇이다. 분명 '모든 소스'에게 HTTP 통신을 열어두었는데

브라우저로도 postman으로도 접속이 되지 않는다 ㅎㅎ

 

로컬에서 ping으로 서버를 때려봐도 응답시간 만료만 나온다.

쉬운 문제일 것 같은데 네트워크 쪽을 잘 모르다보니 어렵네.

 

80번 포트가 열려있긴 한건가?하는 의문이 들어 tabby로 열린 포트를 확인해봄 (netstat -ano)

안 열려있잖아 임마----!!!

 


허무하게 해결했다~

 

http 프로토콜의 요청을 처리하기 위해서는 apache 웹 서버가 필요하다.

os만 깔아놓고 '서버가 되세요'라고 했으니 동작이 안 됐던 것...

원래대로 web-was 서버를 함께 구성하는 방식이었다면 안 했을 삽질인데, 이번엔 api 서버만 따로 구축하는 경험을 처음 해봐서 햇갈렸다.

 

apache는 정적파일을 주로 처리하는 http 웹 서버여서 api 서버만 만들 때는 서블릿 처리를 해줄 수 있는 tomcat만 설치하면 된다.

  • 아파치 Apache
    • 주로 웹 페이지, 이미지, 파일 등 정적 자원을 제공
    • 정적 콘텐츠와 동적인 HTTP 요청을 관리
    • HTTP 프로토콜을 사용하여 클라이언트(브라우저)로부터 요청을 받고, 요청된 정적 파일이나 페이지를 전달
  • 톰캣 Tomcat
    • Java 애플리케이션 서버로, Java Servlet, JSP(JavaServer Pages) 등의 동적 웹 애플리케이션을 실행할 수 있는 환경을 제공
    • Java 애플리케이션을 처리하는 역할에 더 특화

그러나 내 경우에는 spring boot로 애플리케이션을 구축했기 때문에 tomcat조차 필요하지 않다. spring boot에는 내장톰캣이 설치되어있기 때문이다. 이 사실을 간과했다. ^^

다만 JDK는 설치해주어야한다. (jdk에 jre가 포함되어있다.)

 

  • 웹서버가 설치되거나, 실행되고 있지 않다면 80번 포트는 활성화 되지 않는다.
  • ubuntu라면 sudo apt-get install apache2 명령어를 사용하여 아파치를 설치하거나 ngnix를 설치하여 웹 서버로 사용할 수 있을 것이다. (아파치 실행 명령어는 udo systemctl start apache2)
  • 웹 서버를 설치한 뒤에 80번 포트를 여는 작업을 수행한다.
    • Nginx의 경우 /etc/nginx/sites-available/default 파일에서 listen 80;이 설정되어 있는지 확인
    • Apache의 경우 /etc/apache2/ports.conf 파일에서 Listen 80이 포함되어 있는지 확인
  • 웹 서버 재시작 (sudo systemctl restart apache2 또는 sudo systemctl restart nginx)

azure 가상머신 ubuntu에 jdk 설치하기

1. 패키지 목록 업데이트

sudo apt update

2. open jdk 설치 (java17버전과 호환되는 버전인지 확인)

sudo apt install openjdk-17-jdk

3. 설치확인

java -version

4. java_home 환경 변수 설정

echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64" >> ~/.bashrc
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> ~/.bashrc
source ~/.bashrc

 


.jar 파일 실행하기

1. ~.jar파일을 가상 머신으로 전송한다.

scp path/to/your-application.jar username@your-vm-ip-address:/path/to/destination/

 

그런데 이 단계에서 문제가 발생했다. 인텔리제이를 통해 ssh 연결은 했지만, SFTP 연동은 안된다고 나온다.

Remote host '' is not valid: SFTP host is not specified.

SFTP 가 특정되지 않았다고 한다.

왜일까? ^_ㅠ 

다시 한 번 차근차근 SSH 연결을 시도했다. 이 때 Autodetect로 루트패스를 설정해주니까 성공했다!

원래는 "/"로 되어있었는데 그게 존재하지 않는 경로여서 문제가 발생했던 것 같다.

azure 머신에 정상적으로 접속한 모습이다 *_* 만세

이 때 다른 방법으로 배포해야하나하고 다른 블로그들도 찾아봤었다.

Azure 웹앱web app으로 배포하는 방법 -> https://blog.naver.com/blue_war/223310069471

리눅스 설정 자체를 바꿔버리는 방법 -> https://blog.naver.com/blue_war/223310069471

 

그러나 새로운 문제 발생. 로컬에서 scp 명령어를 타이핑하니 권한이 없다고 나온다. 적어도 익숙한 오류라서 반갑긴했다...


내 azure 사용자의 리눅스 권한부터 확인해보자.

$ cat /etc/passwd # 사용자 정보
출력 결과 - 사용자이름:암호:사용자ID:그룹ID:추가정보:홈디렉토리:쉘

 

그룹ID를 찾았다면 그룹의 권한을 찾아보자

리눅스 권한 읽는 방법 : 앞에서부터 세개씩 끊어 읽는다

User          | Gorup        | Other
읽기 쓰기 실행 |읽기 쓰기 실행 |읽기 쓰기 실행
r    w    x   |r    w    x   |r    w    x  |

other의 쓰기 권한이 없어서 permission denied가 된 것 같다.

$ chmod [option] file
chmod u+x text.txt // user에 x(실행) 권한 추가
chmod g+rw text.txt // group에 rw(읽기쓰기) 권한 추가
chmod o+rwx text.txt // group에 rwx(읽기쓰기실행)권한 추가
chmod +x text.txt // 모두에게 x 권한 추가
chmod 777 text.txt // 모두에게 rwx 권한 추가 (777은 rwxrwxrwx를 의미한다)

https://velog.io/@gusdnr814/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EC%9E%90-%EB%B0%8F-%EA%B6%8C%ED%95%9C-%EA%B4%80%EB%A6%AC

https://hooongs.tistory.com/239

 

그런데도 안되긴했다 ^^; 역시 프라이빗키를 못 찾는 게 문제인가 싶어서 키를 함께 전송했더니 성공했다.

scp -i [키위치].pem [jar위치].jar [사용자명]@[가상머신IP]:[배포위치]

 

아니면 인텔리제이의 배포 위치에서 드래그 드랍으로 옮길 수도 있다. (간편하다)

2. 가상 머신에 접속한 뒤 ~.jar 파일을 위치한 곳으로 이동한다.

cd /path/to/destination/

 

3. ~.jar 파일을 실행한다.

java -jar your-application.jar

참고로 리눅스에서 복사 카피는 드래그와 우클릭이다~

스프링 떴다

8080도 열렸다.

4. 80번 포트로 수정할 수 있도록 하려면 application.properties 파일에 설정을 추가한다.

server.port=80


포스트맨으로 원격 서버 찔러보기

애져 네트워크 설정에서 8080요청을 허용한다.

포스트맨 요청을 할 경우 정상적으로 200 응답이 떨어지는 것을 확인할 수 있다.


데몬 띄우기

nohup java -jar MyCinema-0.0.1-SNAPSHOT.jar &

nohup (No Hang Up)

nohup은 사용자가 세션을 종료해도 프로그램이 중단되지 않도록 하는 명령어다. 일반적으로 터미널에서 실행 중인 프로그램은 터미널을 닫으면 자동으로 종료된다. 하지만 nohup을 사용하면 프로그램이 백그라운드에서 계속 실행된다.
nohup을 사용하면 자동으로 nohup.out 파일에 프로그램의 출력 내용이 저장된다. 이 때 뜨는 경고 문구가 'nohup: ignoring input and appending output to 'nohup.out'이다. 만약 별도로 파일을 지정하고 싶다면 `>` 명령어를 이용해 리다이렉션할 수 있다.

& (Background Execution)

&는 명령어 끝에 붙여서 해당 작업을 백그라운드에서 실행하도록 지시하는 기호다. 이를 사용하면 명령을 실행한 터미널이 바로 새로운 명령어를 입력할 수 있는 상태로 돌아오며, 프로그램은 백그라운드에서 계속 실행된다.
즉, `&` 덕분에 프로그램이 실행되는 동안 다른 작업을 계속할 수 있습니다.


아래는 간단한 프로토콜에 대한 메모이다.

 

80번 포트는 프로토콜이 TCP로 고정이다.

짤막 IT용어
소스 : 트래픽이 어디에서 오는지 기재
원본포트 : 트래픽이 어느 포트에서 출발한건지 기재
대상주소 : 나에게 들어오는 트래픽의 목적지를 기재
출처 : https://unknownfolder.tistory.com/16

 

짤막IP상식 : 80포트와 8080포트
[ 80포트 ]
80포트는 HTTP통신을 위해서 사용된다. 워낙 자주 사용되고 당연한? 포트이기 때문에 생략이 가능한 것이 일반적이다. 예를 들어 localhost:80 이 아니라, localhost라고만 입력해도 접속이 된다는 뜻.

[ 8080포트 ]
그렇다면 8080은 무엇일까?
80을 두번 붙여놓은 모양새에서 알 수 있듯이(^^;; IT맨들 정말 별거없음...) 그냥 새로운 웹서비스를 위한 새로운 포트가 필요해서 임의로 만든 것이 대중적으로 사용되고 있는 것이다.

포트와 https 보안에 관련된 정보는 이쪽에 > https://wkimdev.github.io/network/2019/04/13/port-80-8080/

 


https://velog.io/@zedy_dev/%EC%9A%B4%EC%98%81-%EC%84%9C%EB%B2%84-DB%EC%97%90-%ED%84%B0%EB%AF%B8%EB%84%90%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%ED%95%98%EA%B8%B0 ssh -i "키파일"

https://kong-dev.tistory.com/126 ::1

https://cikorea.net/bbs/view/free?idx=12987&lists_style

https://studying404.tistory.com/37