pm2 cleardump
pm2 delete [app name]

pm2 list
In-memory PM2 is out-of-date, do:
error

pm2 update

locate:

/etc/mysql/mariadb.conf.d/50-server.cnf

 

bind-address 127.0.0.1

 

to

 

bind-address 0.0.0.0

 

service mysql restart

$ sudo apt-get update

$ sudo apt-get install build-essential libssl-dev

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh

$ source ~/.bashrc

$ nvm install 10.4.1

 

$ node -v
$ node --version

$ npm --version

 

// node default version

$ nvm alias default 6.11.5

 

$ cd ~

$ curl -sL https://deb.nodesource.com/setup_12.x -o nodesource_setup.sh

 

// shell 열어서 확인 할 시

$ nano nodesource_setup.sh

 

$ bash nodesource_setup.sh

 

$ apt-get install nodejs

 

$ nodejs -v

//root 권한 아닐 시, sudo 
$ apt install git-core


$ apt install npm user.name "denodo1"
$ apt-get update user.email "denodo1@gmail.com"

 

$ apt-get update color.ui "auto"

 

$ mkdir /works
$ cd /works

 

$ git clone https://github.com/denodo1/service-mybatis.git 

 

 

//생략가능

$ git remote add origin https://github.com/denodo1/service-mybatis.git

$ git add -A

$ git commit // 입력 후 엔터 치고 변경목록이 보이면 Ctrl+o 그리고 Enter 그리고 Ctrl+x 종료한다.

$ git commit -m "메세지입력"

$ git push

//end

 

$ cd /service-mybatis

$ git fetch origin

$ git pull

$ git status

 

//root 권한 아닐 시, sudo
$ apt install nodejs
$ apt install npm
$ apt-get update
$ apt-get install nodejs

$ npm -v

$ node -v
root@ip:/home/ubuntu/node# node -version
The program 'node' is currently not installed. You can install it by typing:
apt install nodejs-legacy

$ apt install nodejs-legacy

00. Server time zone changed.

$ date

$ sudo rm /etc/localtime

$ sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

$ date

// 2020. 03. 17. (화) 23:45:00 KST

 

01. Update packages index.

$ sudo apt update

 

02. Once the packages list is updated, install MariaDB

$ sudo apt install mariadb-server

 

// Version Check

$ mysql -V

 

// Root account changed

$ sudo su root

 

03. Port changed / Charset changed

$ vim /etc/mysql/my.cnf

[mysqld]

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

character_set_server = utf8mb4

collation_server = utf8mb4_unicode_ci

$ sudo service mysql restart

 

04. Root password changed

$ mysqladmin -u root -p password 'qwer'

Enter password: 그냥 엔터

 

05. 운영용 database / id 생성

// root로 mariadb 접속
MariaDB [(none)]> create database blog;
MariaDB [(none)]> CREATE USER 'denodo'@'localhost' IDENTIFIED BY 'qwer';
MariaDB [(none)]> CREATE USER 'denodo'@'%' IDENTIFIED BY 'qwer';

 

// GRANT type_of_permission ON database_name.table_name TO ‘username’@'localhost’;

MariaDB [(none)]> GRANT ALL PRIVILEGES ON blog.* TO 'denodo1'@'localhost';

MariaDB [(none)]> GRANT ALL PRIVILEGES ON blog.* TO 'denodo1'@'%';

MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;
 
$ mysql -u denodo -p
Enter password:설정한 비밀번호 입력

'Server > AWS' 카테고리의 다른 글

[Node.js] AWS Git 사용법  (0) 2020.07.31
[Node.js] AWS install nodejs  (0) 2020.07.31
[AWS] 웹서비스 세션 처리  (0) 2019.09.11
[강연] AWS 설치 및 간단 사용법 + Wordpress  (0) 2015.10.24
[Amazon Web Service] EC2 참고  (0) 2014.09.16

# 서버 이중화와 세션 유지

 

세션은 외부 서버에 저장하도록 별도로 설계하지 않는 이상 기본적으로 웹 서버 영역이나 WAS 영역에 저장됩니다. 운영하는 서버가 한 대일 경우 모든 접속자가 하나의 서버에 접속하여 세션 정보를 저장하게 되므로 별 문제가 없습니다. 

 

하지만 실제 웹 서비스를 하면서 싱글 서버를 구성하여 운영하는 경우는 거의 없다고 해도 무방합니다. 대부분 2대 이상으로 설계된 서버 이중화 구성을 하고 있지요. 이렇게 여러 대의 서버로 구성된 서비스는 서버의 로드 밸런싱(부하 분산)을 위하여 L4 스위치를 이용하여 사용자의 접속을 각 서버마다 고르게 배분합니다. 그리고 고르게 배분하는 과정에서 사용자의 각 요청이 처음 접속한 서버와는 다른 서버로 연결된다면 이 서버에서는 사용자의 상태 정보가 존재하지 않기 때문에 상태 정보를 유지할 수 없는 문제가 발생합니다. 만약 서버가 5대로 구성되어 있다면 로그인을 한 사람이 접속하는 페이지에서 제대로 로그인되어 있을 확율은 1/5 정도가 되겠네요.  

 

그렇다고 해서 각 서버마다 모두 세션을 생성해줄 수도 없는 일입니다. 그러면 실제 서비스 상에서는 이런 문제를 어떻게 해결하는 걸까요? 

일반적으로 로드 밸런싱을 위한 L4 스위치는 아래 3가지의 구성 방식이 있습니다.

 

 

방식 

의미 

 Hash 방식

IP를 서버의 대수로 나누어 연결한 후 이후로는 계속 동일한 서버로 접속 

 Round-Robin 방식

L4와 연결된 서버에 순차적으로 접속하여 서비스 수행

 Least-Connection 방식

L4에서 현재 연결이 제일 적은 서버로 접속  

 

이 중, Round-Robin  방식이나 Least-Connection 방식의 경우 로드밸런싱이라는 본래 목적에는 적합하지만 매 요청마다 사용자를 서로 다른 서버에 연결해버리므로 HTTP 세션을 사용할 수 없습니다. 그렇다고 Hash 방식으로 구성하자면 부하분산 능력이 떨어져서 일부 서버로 요청이 집중될 확률이 너무 커집니다. 그래서 Round-Robin 방식이나 Least-Connection 방식을 사용할 경우 L4에서는 Sticky Mode 라고 하여 일정 시간동안 사용자를 동일한 서버로 계속 연결시켜 줄 수 있도록 지원하고 있습니다. 

 

물론 L4에서 Sticky Mode 를 사용하면 일차적으로는 문제점이 해결되겠지만 특정 서버가 다운될 경우 그 서버에 저장되어 있던 세션 정보는 모조리 소실될 수 있습니다. 로드 밸런싱에 의해  다른 서버로 옮겨진 사용자는 세션 정보가 없으므로 로그아웃된 상태가 될 것입니다. 이러한 문제점을 해결하기 위한 방책으로 WAS에서는 세션 클러스터링을 지원합니다. 말 그대로 세션 정보를 클러스터링 처리하여 모든 서버가 공유할 수 있도록 구성하는 것입니다. 별도로 프로그래밍을 통하여 처리하기보다 WAS에 포함되어 있는 기능을 활용하여 구성하는 것이 대부분입니다. 

 

# AWS 에서의 세션 소실 문제 

 

AWS에서도 이와 같은 문제가 동일하게 발생합니다. 두 개 이상의 인스턴스로 구성된 서버 어플리케이션은 도메인을 어플리케이션에 연결하여 주는 ELB에 의하여 관리되는데, 이 ELB는 서버 부하에 따라 개별 서버 인스턴스에 요청을 배분합니다. (이때 배분하는 방식은 수정된 Round-Robin 방식입니다)이로 인하여 웹 사이트에 접속하고 일정 시간이 지나면 다른 서버로 연결이 전환되어 세션이 끊어지는 일이 발생합니다. (측정해보았더니 약 3분 간격으로 연결되는 서버가 달라지더군요) 이러한 문제를 해결하기 위해 아마존 AWS 에서는 L4 스위치와 동일하게  SLB에 Sticky Mode를 적용이 가능한 기능을 제공합니다. 

 

Sticky Mode는 아마존 클라우드 서비스 관리자 콘솔에서 설정하므로 홈페이지의 관리자 콘솔로 접속합니다. 

 

 

관리자 콘솔로 접속하면 아마존 클라우드 서비스의 다양한 항목들이 나열되어 있습니다. 이 중에서 빨간 색으로 박스표시된 Elastic Beanstalk을 클릭하여 어플리케이션 화면으로 이동합니다. 보이시는 화면의 위쪽에도 EC2, S3, Elastic Beanstalk, Route 53 등의 메뉴가 있을텐데요, 이것은 자주 사용하는 메뉴를 따로 모을 수 있도록 해놓은 맞춤 기능이라고 생각하시면 됩니다. 

 

 

Elastic Beanstalk 어플리케이션 화면으로 접속되었습니다. 우리가 서비스할 어플리케이션을 선택하여 클릭하면 어플리케이션에 대한 대시보드 페이지로 연결되는데 이 중에서 우리는 환경 설정에 관한 옵션을 설정해야 하므로 페이지의 왼편 메뉴 중에서 두번째에 있는 [Configuration] 을 클릭해줍니다. 

 

 

이제 여러 항목으로 구분된 설정창 박스들이 여러 개 나타납니다. 웹 영역에 대한 환경 설정 정보를 관리하는 Web Tier도 보이고 네트워크에 관련된 설정 정보를 관리하는 Network Tier 도 보이네요. 우리에게 필요한 항목은 로드밸런싱 환경설정입니다. [Network Tier]의 [Load Balancing] 항목을 클릭해줍니다. 

 

 

자, 이제 세 개의 필드셋으로 구분된 로드밸런싱 환경 설정 페이지가 보이시나요? 위에서부터 차례로 로드 밸런싱할 포트 등 기본 정보를 세팅하는 [Load Balancer] 항목, 로드밸런싱을 하기 위한 헬스체크 정보를 세팅하는 [EC2 Instance Health Check], 마지막으로 우리가 설정해야 할 [Session] 항목이 있습니다. 

 

 

마지막 항목을 좀 더 자세히 살펴보겠습니다. 

 

해석하자면 다음 설정은 로드 밸런서가 세션 쿠키를 어떻게 다룰 것인지 컨트롤할 수 있게 해 줍니다. 라는 의미입니다. 

AWS에서 SLB는 L4 스위치에서  Sticky Mode가 작동하는 것과 동일하게 동작할 수 있습니다. Enable Session Stickiness 옵션에 체크를 하게 되면 SLB 내에 있는 자체 데이터베이스에 쿠키를 통해 접속자의 정보를 저장해두고, 설정된 시간동안 사용자의 접속을 기억해두었다가 기존에 요청을 보냈던 서버로 계속 요청이 전달될 수 있도록 하여 세션의 끊어짐을 방지합니다. 

 

이제 Enable Session Stickiness 에 체크를 해 줍니다. 그리고 우리는 웹 서버에서 설정된 세션 시간만큼 (톰캣의 경우 3600 초) SLB 장비에서도 사용자를 다른 서버로 보내지 않고 붙들어주어야 하므로 Cookie Expiration Period ( 쿠키 만료 시한 : 초)에 시간을 입력해줍니다. (예를 들어, 3600) 

 

이제 Save 버튼을 누르면 끝입니다. 웹사이트에서 체크를 해보면 아까와는 달리 세션이 유지되는 것을 확인할 수 있을 겁니다. 사용자의 요청이 세션 만료 시각이 지나기 전에는 기존의 인스턴스로 계속 유지되기 때문입니다.   

 

 

(참고로 싱글 인스턴스로 동작하는 웹서비스에서는 이런 현상이 일어나지 않습니다) 

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=sqlpro&logNo=220006382480&proxyReferer=https%3A%2F%2Fwww.google.com%2F

'Server > AWS' 카테고리의 다른 글

[Node.js] AWS install nodejs  (0) 2020.07.31
[AWS] How to Install MariaDB on Ubuntu 18.04  (0) 2020.03.18
[강연] AWS 설치 및 간단 사용법 + Wordpress  (0) 2015.10.24
[Amazon Web Service] EC2 참고  (0) 2014.09.16
[AWS] 관련 서버 셋팅  (0) 2014.02.25

CharSet이 EUC-KR인 서버가 있습니다. 

클라이언트에서는 jQuery를 이용하여 Form을 다루려고 합니다.


myForm이라는 데이터를 전송하는 폼이 있습니다.

그 폼의 input 벨류들을 모두 jQuery의 .serialize()를 통해서 

직렬화하고(문자열로 만들고) 보내면 좋을것 같습니다.


그래서 아래처럼 함수를 작성했습니다.


var myForm = jQuery('#myForm');

jQuery.ajax({
type : myForm.attr('method'),
url : '/reimaginer/FormManager.ym',
data : myForm.serialize(),
success : function (res) {
if(res === 'SUCCESS') {
alert('등록되었습니다.');
} else {
alert('등록이 실패하였습니다.')
}
}
});



영어로 테스트 해봤는데 잘 됩니다. 오 좋다~ 하고 있는데, 한국어로도 테스트해봅니다.
그런데 깨집니다...


문제의 원인에 대해서 고민해보니, jQuery는 기본적으로 charSet이 UTF-8이라는게 기억납니다.
그럼이제 UTF-8로 인코딩된 언어를 어떻게 안 깨뜨리고 잘 가져올지 고민해봅니다.

예전에 모바일 프로젝트할때, 모바일 클라이언트는 charSet이 UTF-8이었습니다. 
그래서 UTF-8로 두번 인코딩하고, 서버에서 한번 자동으로 디코딩 된 후,
다시 한번, decodeUri를 통해서 한글을 가져온 것이 생각이 납니다.

인터넷을 뒤적거리다보니 비슷한 방법이 나옵니다.
.serialize() 하면 UTF-8로 한번 인코딩된 문자열이 나옵니다.
만약 폼에서 전송하려는 데이터가 '사과' 라는 문자열이라면,

'%EC%82%AC%EA%B3%BC' 

이런 놈이 반환되죠. 여기서 우리는 한번 더 인코딩합니다.
% 문자를 인코딩된 문자인 '%25'로 한번 더 바꿔주는 겁니다.
(= % 를 %25로 바꿔주기만 해도 한글이 깨지지 않고 넘어갑니다. )

"%25EC%2582%25AC%25EA%25B3%25BC" 이렇게요.

코드는 다음과 같습니다.


var myForm = jQuery('#myForm');

jQuery.ajax({
type : myForm.attr('method'),
url : '/reimaginer/FormManager.ym',
data : myForm.serialize().replace(/%/g, '%25'),
//data : encodeURI(myForm.serialize()), 위, 아래 두가지 방법 모두 같은 결과를 반환한다.
success : function (res) {
if(res === 'SUCCESS') {
alert('등록되었습니다.');
} else {
alert('등록이 실패하였습니다.')
}
}
})
;


그럼 서버 측에서는 어떻게 받아야 할까요.


String decodedData = URLDecoder.decode(encodedData, "UTF-8");


한번은 자동으로 decode되니까 '%EC%82%AC%EA%B3%BC' 이 문자열을 받았겠죠.

한번만 더 디코드 해줍니다.

'사과'

이제 이 한글을 잘 사용하면 됩니다!


javascript 에서 제공하는 encodeURI()와 encodeURIComponent() 함수는 기본적으로 UTF-8으로 인코딩을 합니다


이를 Query로 하여 jsp 페이지에 넘겨서

request.getParameter() 함수로 받고서 아무 의심없이 URLDecoder.decode() 함수를 사용했습니다

당연히 UTF-8으로 decode를 했지요

하지만 계속해서 한글이 깨져있습니다;;;

계속 원인을 찾던 중

tomcat이 Query를 미리 서버에 지정된 기본 문자셋으로 디코딩을 해버린다는 사실을 알았습니다

즉, request.getParameter()로 받은 결과가 인코딩 된 문자열이 아닌 이미 디코딩 된 문자열이었지요

즉, 기대한 값은 %EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94 과 같은 모양의 문자열인데

이미 저 값은 URLDeocder.decode( 문자열, 서버 기본 문자셋 ) 함수로 한번 디코딩 된 결과 같이 나온다는 거에요

많은 경우 서버 기본 문자셋이 MS-949 등이기 때문에 UTF-8으로 인코딩 된 값을 잘못 디코딩한 것이죠

잘못 디코딩된 녀석을 다시 디코딩 해봤자 한글이 깨져있는 것은 당연한 것이지요...



1. 해결 방법으로는 서버 기본 문자셋을 UTF-8으로 바꿔버리는 방법과...



2. 데이터의 양이 늘어나지만 encodeURI() 또는 encodeURIComponent() 의 결과를 한번 더 인코딩 해버리는 방법도 있습니다

encodeURIComponent( encodeURIComponent( plainText ) );  // 이렇게요

그리고 jsp에서는 URLDecoder.decode() 함수를 한번만 ( 한번은 자동으로 디코딩을 수행하기 때문에 ) 호출하면 됩니다

이렇게 될 경우 tomcat이 자동으로 디코딩한 결과는 원래 기대 값인 인코딩 된 값

%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94 과 같은 모양의 문자열

이 되고, 이를 URLDecoder.decode() 함수로 제대로 디코딩 해주기 때문에 원하는 결과 값이 나오게 됩니다


출처 : http://allinfo.tistory.com/1095

'Server > Encoding' 카테고리의 다른 글

[Ajax] euc-kr 서버 한글 깨짐 해결  (0) 2016.12.08
[WAS] Tomcat server.xml utf 8 encoding  (0) 2015.01.08
[Encode] Spring POST/GET URI Encoding  (0) 2014.10.12

+ Recent posts