3-1. 서비스 서버 환경 구축

효율적인 엉터리·2021년 3월 8일
0

voxmon-project

목록 보기
4/4

0. 클라우드 선택

먼저 서비스 서버를 올릴곳을 찾아야한다. 스타트업 풀스택 과정에서는 먼저 네이버 클라우드를 이용했었다
시니어 코딩 MyDeal 서비스 서버
https://www.youtube.com/watch?v=HCMXDPYXd9g&t=1474s
(위의 영상은 네이버 클라우드로 서비스 서버 환경 구축하는 영상이다)

하지만 다른 곳을 찾아야했는데 그 이유는, NCP 마이크로 서버는 1년 동안 무료로 사용이 가능하나, 공인 IP 비용이 무료 크레딧 3개월 기간이 지난후에 4천원 가량 결제가 되어서 조금 더 비용없이 (꿀빨려고) 오랫동안 서비스하기 위해서 Oracle Cloud로 정했다

비교


여기서부터는
오라클 클라우드 무료 서버 사용하기(https://www.youtube.com/watch?v=wLgHEn2vcPo)
위의 영상을 보면서 팀프로젝트 서비스 서버를 구축하는 과정입니다.


1. Oracle Cloud 계정 만들기

먼저 Oracle Cloud에 가입해야한다. 영상대로 가입하는데 혹시 폰으로 문자인증하는데 문자가 안온다면 국가번호 +82로 설정하고 번호를 010-XXXX-XXXX가 아니라 10-XXXX-XXXX으로 앞에 0을 빼주고 해야한다. 이것때매 한 10분동안 왜 문자 안오지하고 해멨다. 머쓱

2. 작업순서

  1. 구획 생성
  2. 네트워크 설정
  3. VM Instance 생성 (centos 8)
  4. Nginx 설치
  5. MySQL 8 설치
  6. Domain Setting
  7. Install LetsEncrypt

위의 순서로 작업을 진행할것인데 혹시 왜 구획을 나눠야하는지 궁금하신분이 있다면
오라클 클라우드 구조화 이 글을 참조하시면 좀 이해가 되실것 같습니다

3. 구획 생성 및 네트워크 설정

이제 서비스 서버를 올릴 구획을 먼저 생성해보자

로그인 후 메뉴 버튼눌러서 맨 아래로 가서 'ID - 구획' 으로 가준다

구획으로가면 루트 구획과 ManagedCompartmentForPaaS가 있을텐데 후자는 아마 오라클에서 관리용으로 생성한듯 하고 우리는 '구획 생성'을 눌러주자

이름에 구획 이름을 넣어주고 설명도 적어준 다음 상위 구획은 루트로 지정한 다음 구획 생성

구획이 생성되었다면 이제 네트워크 설정을 할 차례이다


메뉴 맨위쪽으로 올라가서 '네트워킹 - 가상 클라우드 네트워크' 로 가주자

'VCN 마법사 시작' 버튼을 눌러서 VCN 이름을 적어주고 꼭 구획을
먼저 우리가 생성한 구획으로 변경해 주도록 하자

그 다음 영상대로 vcn 마법사를 통해 가상 클라우드 네트워크(Virtual Cloud Network ,VCN)을 잡아주도록 하자


사실 생성한 구획 아래에 하나의 vm 인스턴스만 있다면 상관없지만 만약 2개 이상의 vm인스턴스가 존재하게 된다면 여기서 정한 VCN 규칙을 이 구획에 속한 2개의 인스턴스 모두 따르기 때문에 구획을 나눠 주는것 같다.

4. 인스턴스 생성 및 서버 접속

이제 자신이 만든 구획에서 VCN도 설정했으니 인스턴스를 생성하면 된다.
영상에서 모든 과정이 잘 나와있으나 혹시 영상 7:47 즈음에 맥에서 ssh 키를 입력하는 과정에서 ssh 키가 없으신 분은 본인 맥에서

cd ~
ssh-keygen -t rsa

위의 키젠을 통해 생성후에 따라하시면 될것 같다. (이 부분은 팀장님이 NCP에서 이미 다뤘기 때문에 생략하신다)

인스턴스를 잘 생성했다면 위와 같이 나올것이다

그리고 저기 보이는 공용 IP 주소를 복사하여 터미널에서

ssh opc@`공용 IP 주소'

입력해서 서버에 접속이 되는지 확인해보자

5. NginX 설치

아래 내용은 방금만든 서버에 ssh로 접속한 상태에서 진행합니다

opc라서 sudo 권한으로 설치합니다

# yum 외부 저장소(repository) 추가
sudo vi /etc/yum.repos.d/nginx.repo

# 아래 내용 복붙 후 :wq로 저장
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1


#install by using YUM
sudo yum install nginx -y


# start & stop
sudo nginx
sudo nginx -s stop


# process 확인
ps -ef | grep nginx


# service 등록
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl [stop | restart] nginx


# 만약 503 오류가 난다면, SELinix 정책(권한) 추가
sudo semanage permissive -a httpd_t

중간에 팀장님이 서버 방화벽 설정하는 파트가 있는데

$> sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
$> sudo firewall-cmd --reload
$> sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

나는 맨 아래 iptables 에 추가를 시켜줘야했다.

6. MySQL 설치

sudo dnf install mysql-server -y

sudo systemctl start mysqld
sudo systemctl enable mysqld

sudo mysql_secure_installation

이번에는 Yum 대신 dnf를 이용해서 MySQL을 설치해준다
dnf은 dependency 알아서 설치해줘서 훨씬 편하다 ㅜㅜ

MySQL 인스톨 해주고 'mysql -u root -p' 입력해서 mysql root 계정으로 로그인 해주자 (비밀번호는 방금전 인스톨할때 입력했던 암호)

$mydeal> mysql -u root -p
$mysql> show databases;

$mysql> CREATE DATABASE mydealdb;
$mysql> CREATE DATABASE mydealdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# user 생성 및 권한 부여
$mysql> CREATE USER 'mydeal'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';
$mysql> GRANT ALL PRIVILEGES ON mydealdb.* TO 'mydeal'@'%' WITH GRANT OPTION;
$mysql> flush privileges;

# password 변경하기
mysql> ALTER USER mydeal IDENTIFIED WITH mysql_native_password BY 'yyyy';

# max-connections
mysql> show variables like '%max_connection%';
mysql> set global max_connections=100;

voxmondb로 데이터베이스 생성하고(utf8mb4는 이모티콘 표현 때문에 옵션을 줬다) 이것저것 시도해볼 testdb도 생성.

voxmon으로 새롭게 유저도 생성했다
그리고 마지막으로 voxmon 계정에 voxmondb,testdb 모든 권한을 주고 flush privileges; 까지

DB 잡힌거 확인.
그리고 MySQL Workbench에서 연결시켰다.

7. Domain 세팅


voxmon.com 을 물론 잡고싶었지만 이미 누군가 차지했고 voxmon.io 등등 다른 후보군도 가격이 꽤나 있어서... 그냥 아쉬운대로 voxmonapp.com 으로 잡는걸로 결정했다.

구매 후 DNS관리 창으로가서 (구매후에 등록되는데 시간이 조금은 걸린다)

Oracle Cloud 서버의 공인 IP를 연결시켜주자

nslookup 으로 Oracle 서버 공인 IP로 연결된것을 확인했다

8. LetsEncrypt 설치

$> sudo dnf install epel-release -y
$> sudo dnf install certbot python3-certbot-nginx -y

설치 완료가 되면 nginx 를 잠시 내린후에

$> sudo nginx -s stop
$> sudo certbot --standalone -d mydeal.topician.com certonly


Email 적어주고 약관엔 동의했지만 share는 하지 않는다고 했다 ㅎㅎ


후에 /var/www/voxmonapp 폴더 잡아주고 안에 index.html 파일을 하나 만들었다.
/etc/nginx/conf.d 아래에 voxmon.conf 파일을 만들고 안에다가

server {
        listen 80;
        server_name voxmonapp.com;

        location / {
                  root   /var/www/voxmonapp;
          index  index.html;
                  try_files $uri /index.html;
          }
          return      301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name voxmonapp.com;

    ssl_certificate /etc/letsencrypt/live/voxmonapp.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/voxmonapp.com/privkey.pem;

    location / {
        root   /var/www/voxmonapp;
        index  index.html;
        try_files $uri /index.html;
    }
}

80(http) 포트로 접근하면 443(https) 포트로 redirect 시키겠다는 의미
사실 저도 코드 완전히 파악 못했지만 일단 붙여넣었습니다 ㅜㅜㅋㅋㅋ

$> sudo nginx
$> sudo nginx -s reload

nginx 다시 올리고 나서 voxmonapp.com 으로 접속해보면...?

성공!!! https 잘 뜨는것 확인했습니다

# 인증서 renew (with Crontab)

인증서의 유효기간이 3개월이라서 만료전에 항상 갱신을 해줘야합니다.
하지만 수동으로하면 깜빡할때도 있고 넘나 귀찮으니 서버에서 자동으로 갱신하게끔 crontab을 사용해서 매크로?를 걸어봅시다

crontab -e

0 5 1 */2 * /usr/bin/certbot renew >> /etc/nginx/cert.log 2>&1

맨 앞에 오는 숫자는 위치에 따라 분/시/일/월/요일 을 뜻합니다.
0 5 1 */2 * -> '짝수 월 1일 5:00에 수행하겠다' 라는 의미 입니다(그럼 3개월전에는 무조건 갱신이 되겠죠?)

만약 갱신이 안된다면 위의 '/usr/bin/certbot renew' 명령어 부분을 아래 코드로 바꿔서 crontab에 입력해주시면 됩니다. (아래가 정석적인 표현이라고 합니다)

/usr/bin/certbot renew --force-renew --pre-hook="/usr/bin/systemctl stop nginx" --post-hook="/usr/bin/systemctl start nginx"

Nginx,MySQL 설치와 도메인 세팅까지 완료했으니 다음에는 팀원과 같이 고민했던 DB structure를 실제로 MySQL에 잡아보겠습니다

0개의 댓글