[Springboot]nginx無停止配置優先パラメータ
7540 ワード
nginxのインストール方法はnginxインストール方法で見つけることができます.
の場合、ec 2で80898090ポートを開く必要があります.
「Thefolwing 1 profile is active:」prod 1が表示されると、profile設定は成功します.
/etc/nginx/nginx.confに入り上記の修正を行います
service-url.incを生成し、中に上のように書き、保存します.
これにより、デフォルト設定はprod 1、8089ポート、nginxに設定されます.confはこのアドレスを読み出して転送します.
上記の設定が完了すると、springの8089ポートに80ポートのリクエストを送信できます.以下に示します.
今回はShellスクリプトを使用してSpringサーバを再起動し、nginxが対応するSpringサーバを指すことを許可します.
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を使用してスクリプト を終了します.が成功した場合、繰り返し文を終了し、変換スクリプト を実行します.
3~15号線:現在実行中のスプリングプロファイルを確認し、新しいプロファイルセットを指定します. 2号線:/etc/nginx/conf.d/service-url.ポート部分をIncファイルのIDLE PORTに置き換えます. 225号線:新しく更新されたnginxサービス-url.incファイルの内容を再ロードし、再起動します.
では、最初に上記の問題が発生しました.原因を調べると、Windows環境でファイルを作成しgitにアップロードし、Windowsとlinuxの行文字の違いをそのまま受信したため、エラーが発生した可能性があります.
ec 2で直接タイプすると上記のエラーは発生しません.
Prod 1からprod 2に切り替えると、Spring jarファイルがバックグラウンドで正常に動作していることがわかります.
参考サイト(フル開発者育成)
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つのプロファイルを配布します.実行
~$ 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ファイルの位置は自分の必要に応じて変更します.変換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
実行
~$ sh deploy.sh
deploy.shを実行します.上書き文字エラー
の原因となる
解決する
ec 2で直接タイプすると上記のエラーは発生しません.
Prod 1からprod 2に切り替えると、Spring jarファイルがバックグラウンドで正常に動作していることがわかります.
参考サイト(フル開発者育成)
Reference
この問題について([Springboot]nginx無停止配置優先パラメータ), 我々は、より多くの情報をここで見つけました https://velog.io/@jinyeong-afk/Springboot-nginx-무중단-배포-환경-설정テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol