AWS입문(3)-배포

프론트 서버(웹서버)

sudo apt install nginx
sudo rm /etc/nginx/sites-available/default
sudo rm /etc/nginx/sites-enabled/default
cd /etc/nginx/sites-available/
sudo touch myapp.conf

myapp.conf의 내용은 아래와 같이 수정한다.

server {
  listen 80;
	listen [::]:80;
  root   "(뷰일 경우 dist, 리액트일 경우 build)폴더경로를 여기에 작성";
  index  index.html index.htm;
  location / { # 프론트엔드 연결
    try_files $uri $uri/ /index.html;
  }
}

심볼릭 링크를 sites-enabled에 작성한다.

sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/myapp.conf
sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl status nginx

1

위와 같이 나오면 성공.

프론트엔드 폴더에서

yarn run build

webpack으로 빌드한 것을 위에 작성한 build폴더 경로안으로 파일질라를 통해 모두 업로드하면 프론트엔드 배포 성공 (그냥 깃 풀해도 되게 설정하면 편하며 배포 자동화를 하면 더 편하다.)

(프록시 패스 설명 추가)

백엔드(WAS)

spring(스프링)인 경우 tomcat

tomcat8 설치 후 (deprecated되어 tomcat8은 이제 수동설치해야한다. 귀찮으면 tomcat9를 설치한다.)

sudo apt-get install tomcat8
sudo service tomcat8 start

스프링 부트 프로젝트에서 export한 .war파일을 /var/lib/tomcat8/webapps 경로에 업로드한다.

안 올라갈 경우 아래 명령어 실행

sudo chown -R ubuntu /var/lib/tomcat8/webapps

또한 새로운 .war파일을 업로드 할 경우 아래 명령어로 기존 파일과 압축해제된 폴더를 지우고 다시 올린다.

sudo rm /var/lib/tomcat8/webapps/war파일이름.war
sudo rm -rfv /var/lib/tomcat8/webapps/war파일이름

(redis maxmemory 설정 등을 잘못하면 에러뜨고 Cacheable 작동안함)

django(장고)인 경우 - 작성중

/gitlab settings reminders off설치 되어있는지 확인 안되어있을 경우 pip로 필요한 버전 설치

python3 -m django --version

장고 프로젝트 안의 settings.py에서 DB등 여러 가지 설정 한 다음

일단 기본 db등을 마이그레이션 후 서버 실행

python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

위와 같이 할 경우 터미널 창을 끄면 서버가 함께 종료되어 버리므로

임시로 screen을 설치하여 screen상에서 runserver를 하고 터미널을 끄면 된다.

(이 방식은 테스트서버를 배포하는 방법이므로 싱글 thread라는 단점이 있다.) - 상세한건 추후 업뎃(uWSGI 등)

DB

MySQL(기본 포트 : 3306)

RDBMS를 위해서 mysql8.0을 사용할 것이다.

일단 최신 repo를 가져온다. (https://dev.mysql.com/downloads/repo/apt/ 여기서 최신버전을 확인)

wget -c https://repo.mysql.com/mysql-apt-config_0.8.15-1_all.deb

패키지를 풀고

sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb

스크린샷 2020-04-03 오전 9.32.51

위 알림창이 뜨면 옵션을 적당히 선택해준후 ok를 누른다. 나는 위와 같이 선택한다.(mysql cluster는 여러 대의 서버에서 한 db를 관리하는 시스템인 것 같다. 일단은 선택하지 않는다.)

그 다음 설치

sudo apt update
sudo apt-get upgrade
sudo apt-get install mysql-server
sudo apt upgrade

mysql서버 root계정의 비밀번호를 세팅하라고 뜰 것이다. 세팅해준후 ok

Strong Password Encryption으로 설정하고 compatibiility를 위해 로컬PC의 mysql클라이언트도 5.대 이하가 아닌 8.0으로 설치해주자.

sudo dpkg -l | grep "mysql-community"

잘 되었는지 확인한 후 그 다음 보안 설정을 해주자.

sudo mysql_secure_installation

setup VALIDATE PASSWORD component? = y (암호 강도는 적당히 1로 설정)

Remove anonymous users? = y

Disallow root login remotely? = y (root가 아닌 다른 계정을 추가해 원격접속 설정 해준다.)

Remove test database and access to it? = y

Reload privilege tables now? = y

다음 명령어로 boot타임에 자동으로 켜지게 한다.

sudo systemctl enable mysql
sudo systemctl status mysql

스크린샷 2020-04-03 오전 9.53.43

보안설정이 끝났다. 이제 원격설정을 해준다.

아래 명령어로 mysql shell을 킨다.(비밀번호는 아까 설정한 mysql서버 root비번)

sudo mysql -u root -p

sql문으로 특정 스키마를 사용할 원격 접속용 유저를 만들자.

이제 프로젝트에서 사용할 스키마를 하나 만든다.

create database 스키마이름;

아래와 같이 해당 스키마를 사용할 user를 생성한다.

create user 'bigdata'@'%' identified by '이 유저 비밀번호 여기에 입력';
grant all privileges on 사용할스키마.* to 'bigdata'@'%';
flush privileges;

(이 때 전체 스키마에 허용하려면 사용할스키마 대신 * 입력)

참고) grant ~ to 의 반대 명령은 revoke ~ from. 스키마에 대한 권한을 없앤다. 모든 스키마 * 에 대한 권한을 없애지 않도록 주의하자! (다시 추가하기 곤란)

이제 아래와 같이 로컬 mysql 클라이언트에서 set up new connection (+)모양 버튼을 눌러서 방금만든 유저로 접속하면 잘 되는것을 확인할 수 있다.

5

MongoDB(기본 포트 27017)

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

튜토리얼을 참고하자.

sudo systemctl status mongod

위 명령어로 active상태를 확인한 후, 외부 접속 방법을 만들자.

show databases;
use admin;
db;
db.createUser({user: "아이디", pwd: "비밀번호", roles: ["root"]});
exit;
sudo vim /etc/mongod.conf

위 vim명령어로 아래와 같아 network interfaces와 security 항목을 수정한다.

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:
security:
  authorization: 'enabled'

이제부터는 우분투에서 mongo가 아닌 아래 명령어로 접속이 가능하다.

mongo -u 유저아이디 -p

이제 서비스에 사용할 database를 만들고 해당 database에 읽기 쓰기 권한을 갖는 user를 생성한다.

use db이름;
db;
db.createUser({user: "아이디", pwd: "비밀번호", roles: ["readWrite"]});

위 계정으로 원격에서 해당 user에 접속할 수 있다.

댓글남기기