[Springboot]nginx無停止配置優先パラメータ


nginxのインストール方法はnginxインストール方法で見つけることができます.

Springプロファイル設定


プロファイルの確認

@RestController
@RequiredArgsConstructor
public class WebRestController {
 private final Environment env;
 @GetMapping("/profile")
 public String getProfile() {
   return Arrays.stream(env.getActiveProfiles()).findFirst().orElse("");
 }
}
WebRestControlでは、現在使用されているプロファイルを表示できます.

ライブラリの追加

implementation 'org.springframework.boot:spring-boot-starter-actuator 
上記のライブラリを依存項目に挿入します.

prod-application.yml設定

~$ sudo mkdir config
~$ cd config
~$ sudo vim prod-application.yml
jarデプロイメントファイルがある場所(プロジェクトフォルダのbuild/libs)に移動し、構成フォルダを作成し、ymlプロファイルを作成します.
--- # prod1 환경
spring:
  config:
    activate:
      on-profile: prod1
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://주소:3306/스키마?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true
    username: 아이디
    password: 비번
  jpa:
    hibernate:
      ddl-auto: update
    generate-ddl: true
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
logging:
  level:
    root: info
server:
  port: 8089
---
--- #prod2 환경
spring:
  config:
    activate:
      on-profile: prod2
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://주소:3306/스키마?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true
    username: 아이디
    password: 비번
  jpa:
    hibernate:
      ddl-auto: update
    generate-ddl: true
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
logging:
  level:
    root: info
server:
  port: 8090
既存のデータベースを含むすべての設定情報を取得し、8089、8090ポートに2つのプロファイルを配布します.
  • の場合、ec 2で80898090ポートを開く必要があります.
  • 実行

    ~$ java -jar 본인jar이름.jar --spring.config.location=file:config/prod-application.yml --spring.profiles.active=prod1
    上記のコマンドを実行するとprod-applicationが生成されます.ymlのprod 1プロファイル設定で実行し、8089ポートで実行

    「Thefolwing 1 profile is active:」prod 1が表示されると、profile設定は成功します.

    Nginx設定


    nginx.confの変更

    ~$ sudo vim /etc/nginx/nginx.conf

    /etc/nginx/nginx.confに入り上記の修正を行います
    ~$ sudo service nginx reload
    設定後にnginxを再起動します.
    ~$ sudo vim /etc/nginx/conf.d/service-url.inc

    service-url.incを生成し、中に上のように書き、保存します.
    これにより、デフォルト設定はprod 1、8089ポート、nginxに設定されます.confはこのアドレスを読み出して転送します.

    nginxポート転送


    上記の設定が完了すると、springの8089ポートに80ポートのリクエストを送信できます.以下に示します.


    Nginxの再起動と切り替え


    今回はShellスクリプトを使用してSpringサーバを再起動し、nginxが対応するSpringサーバを指すことを許可します.

    再起動シェルスクリプトの作成(deploy.sh)

    ~$ sudo vim deploy.sh
    jarファイルがある場所に配置します.shを作成します.
    #!/bin/bash
    echo "> 현재 구동중인 profile 확인"
    CURRENT_PROFILE=$(curl -s http://localhost/profile)
    echo "> $CURRENT_PROFILE"
    if [ $CURRENT_PROFILE == prod1 ]
    then
    	IDLE_PROFILE=prod2
    	IDLE_PORT=8090
    elif [ $CURRENT_PROFILE == prod2 ]
    then
    	IDLE_PROFILE=prod1
    	IDLE_PORT=8089
    else
    	echo "> 일치하는 Profile이 없습니다. Profile: $CURRENT_PROFILE"
    	echo "> prod1을 할당합니다. IDLE_PROFILE: prod1"
    	IDLE_PROFILE=prod1
    	IDLE_PORT=8089
    fi
    echo "> $IDLE_PROFILE 배포"
    sudo fuser -k -n tcp $IDLE_PORT
    sudo nohup java -jar core-0.0.1-SNAPSHOT.jar --spring.config.location=file:config/prod-application.yml --spring.profiles.active=$IDLE_PROFILE &
    echo "> $IDLE_PROFILE 10초 후 Health check 시작"
    echo "> curl -s http://localhost:$IDLE_PORT/actuator/health "
    sleep 10
    for retry_count in {1..10}
    do
    	response=$(curl -s http://localhost:$IDLE_PORT/actuator/health)
    	up_count=$(echo $response | grep 'UP' | wc -l)
    	if [ $up_count -ge 1 ]
    	then
    		echo "> Health check 성공"
    		break
    	else
    		echo "> Health check의 응답을 알 수 없거나 혹은 status가 UP이 아닙니다."
    		echo "> Health check: ${response}"
    	fi
    	if [ $retry_count -eq 10 ]
    	then
    		echo "> Health check 실패. "
    		echo "> Nginx에 연결하지 않고 배포를 종료합니다."
    		exit 1
    	fi
    	echo "> Health check 연결 실패. 재시도..."
    	sleep 10
    done
    echo "> 스위칭을 시도합니다..."
    sleep 10
    sh /home/ec2-user/backend-phonedyguard/core/build/libs/switch.sh
    JArファイル名と最後の行switch.shファイルの位置は自分の必要に応じて変更します.
  • 3号線:現在のnginxが指すスプリングの輪郭を確認します.
  • 6-19番線:現在指すCURRENT PROFILEとIDLE PROFILEを区別します.
  • 21-23号線
  • sudo fuser-k-n tcp$IDLE PORT:IDLE PORTを使用しているスプリングサーバがある場合、
  • を停止する.
  • sudo nohup java -jar core-0.0.1-SNAPSHOT.jar --spring.config.location=file:config/prod-application.yml --spring.profiles.Active=$IDLE PROFILE&:スプリングログはnohupです.outを書き込み、バックグラウンドでIDLE PROFILEのスプリングサーバを起動します(後で追加しない場合は、以下のコマンドは実行されません).
  • 25-line
  • サーバヘルスチェック-Activatorライブラリ
  • を一定期間後に10回使用
  • が失敗した場合、code 1を使用してスクリプト
  • を終了します.
  • が成功した場合、繰り返し文を終了し、変換スクリプト
  • を実行します.

    変換Shellスクリプトの作成(switch.sh)

    ~$ sudo vim swich.sh
    同様にjarファイルの場所で作成します.
    #!/bin/bash
    echo "> 현재 구동중인 Port 확인"
    CURRENT_PROFILE=$(curl -s http://localhost/profile)
    
    if [ $CURRENT_PROFILE == prod1 ]
    then
    	IDLE_PORT=8090
    elif [ $CURRENT_PROFILE == prod2 ]
    then
    	IDLE_PORT=8089
    else
    	echo "> 일치하는 Profile이 없습니다. Profile:$CURRENT_PROFILE"
    	echo "> 8089를 할당합니다."
    	IDLE_PORT=8089
    fi
    
    PROXY_PORT=$(curl -s http://localhost/profile)
    echo "> 현재 구동중인 Port: $PROXY_PORT"
    
    echo "> 전환할 Port : $IDLE_PORT"
    echo "> Port 전환"
    echo "set \$service_url http://127.0.0.1:${IDLE_PORT};" | sudo tee /etc/nginx/conf.d/service-url.inc
    
    echo "> Nginx Reload"
    sudo service nginx reload
  • 3~15号線:現在実行中のスプリングプロファイルを確認し、新しいプロファイルセットを指定します.
  • 2号線:/etc/nginx/conf.d/service-url.ポート部分をIncファイルのIDLE PORTに置き換えます.
  • 225号線:新しく更新されたnginxサービス-url.incファイルの内容を再ロードし、再起動します.
  • 実行

    ~$ sh deploy.sh
    deploy.shを実行します.

    上書き文字エラー


    の原因となる


  • では、最初に上記の問題が発生しました.原因を調べると、Windows環境でファイルを作成しgitにアップロードし、Windowsとlinuxの行文字の違いをそのまま受信したため、エラーが発生した可能性があります.
  • 解決する


    ec 2で直接タイプすると上記のエラーは発生しません.

    Prod 1からprod 2に切り替えると、Spring jarファイルがバックグラウンドで正常に動作していることがわかります.
    参考サイト(フル開発者育成)