졸업작품서버과정

작성일

작년에 했었던 졸업작품 서버에 대해서 정리하려고 한다.
졸업작품을 하면서 처음으로 클라이언트와, 서버에 대하여 직접적으로 인지를 하였다.
처음 내가 느낀 서버는 너무 무거웠다. 공부해야할 것이 너무 많았고, 또 범위가 너무 광범위했다.
그래서 처음부터 정리해보려고한다.
우선, 서버란 하나의 컴퓨터이다. “서버를 빌려온다 = 컴퓨터를 빌려온다” 라는 공식이다.
따라서, 서버를 부터 정해야하는데, 이때부터 고민을 했었다. “AWS vs 네이버클라우드 플랫폼”

“AWS vs 네이버클라우드 플랫폼”

두 호스팅업체를 구글링해본 결과 AWS가 좀 더 우수하다는 결과가 나왔다.
하지만, 나는 졸업작품을 하려는거라 우수한 것 보다 보다 쉬운 관리 를 할 수 있는 네이버 클라우드 플랫폼을 선택하였다.
선택한 이유와, 더 자세히 알고 싶으면 여기로 이동해서 보면 된다.

네이버 클라우드 플랫폼 접속하기

image 우선 이렇게 서버를 빌려온다.
서버 빌려오는 자세한 글은 여기로 이동해서 보면된다.
서버를 빌려오면, 빌려온 서버에 접속을 해야하는데, 윈도우는 Putty, 맥북은 터미널을 이용해서 서버에 접속할 수 있다.
여기에서는 외부포트 번호를 50000으로 추가해 놨는데, 그 이유는 50000번으로 들어오겠다. 라는 뜻이다.
따라서, 공인IP인 번호를 적고, 외부포트 번호를 터미널에 적으면, “ssh root@106.10.59.48 -p 50000” 서버에 접속할 수 있다.

ACG 규칙 설정하기

쉽게 말해서, 정해진 포트로만 들어올 수 있고, 나머지 포트들은 못들어온다는 뜻이다.
졸업작품에서 사용할 포트들은 이렇게 열어두었다.
image

JAVA설치하기

  1. 최신 소프트웨어를 다운로드할 수 있도록 패키지 리포지토리를 업데이트를 한후
    sudo yum update  
    
  2. 그런 다음 다음 명령을 사용하여 Java Development Kit 를 설치
    sudo yum install java-11-openjdk-devel
    
  3. OpenJRE 11 설치
    sudo yum install java-11-openjdk
    

MySQL8 설치&설정

우선, https://dev.mysql.com/downloads/repo/yum/에 접속을한 후, 버전에 맞는 주소를 복사해온다.
그후 설치하면되는데,
mydeal> yum localinstall https://dev.mysql.com/downloads/file/?id=508941
명령어를 적어서 설치를 완료하고, 설정을 하였다.
mydeal> vi /etc/my.cnf에

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqldump]
default-character-set = utf8mb4

[mysqld]
skip-character-set-client-handshake
init_connect="SET collation_connection = utf8mb4_unicode_ci"
init_connect="SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

를 추가시켜주고 다시

$mydeal> systemctl start mysqld 로 시작해주고,  
$mydeal> grep 'temporary password' /var/log/mysqld.log 에 접속해서 password를 찾고,  
$mydeal> /usr/bin/mysql_secure_installation 를 적어주고, 자신이 원하는 패스워드를 넣어서 사용하면 된다.

MySQL에서 설정해야할 것들

// mysql접속하기
$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;
# 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;

이렇게 설정을 다 해야한다.

공개 IP 설정

우선 서버를 빌려온 이유는, 프로그램이 데이터를 저장하는 것도 있지만, 사람들과 커뮤니케이션을 하는게 목표였다.
사람들과 커뮤니케이션을 하기 위해선, 사람들이 네이버클라우드플랫폼에 접속을 해야하는데, 접속하기 위해선 IP가 필요하다.
공개IP는 네이버에서 제공을 해주는데 27.96.135.116이 공개IP이다.
하지만 사람들이 커뮤니케이션을 하기위해 매번 저렇게 많은 숫자를 외워서 쳐야하면 비효율적이지 않을까?란 생각을 해서,
도메인 호스팅업체를 찾아봤는데, “가비아”란 사이트에서 1년 도메인호스팅을 해주는데 가격이 무려 500원이란다.
그래서 바로 빌렸다. choicoding.shop을 “가비아”에서 빌렸고, 내 공개IP를 등록 시켜줬다.
image
따라서, 27.96.135.116=choicoding.shop 가 성립이되, choicoding.shop으로 접속하면 내 서버에 접속할 수 있어진 것이다.

Install NginX

먼저, 빌려온 서버에 접속을 한후, 진행하면된다.

1. yum 외부 저장소(repository)추가

mydeal> vi /etc/yum.repos.d/nginx.repo에

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

을 추가해준다.

2. install by using YUM

mydeal> yum install nginx -y 해서 다운받아준다.

3. start & stop

mydeal> nginx <-시작  
mydeal> nginx -s stop <-중지  

4. process 확인

잘 돌아가고 있는지 process를 확인해준다.

mydeal> ps -ef | grep nginx  

5. service 등록

mydeal> systemctl start nginx  
mydeal> systemctl enable nginx  
mydeal> systemctl stop nginx  

서버를 꺼도 돌아가게 systemctl 명령어로 서비스를 등록해준다.

그외 설정.

/etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/choicoding.conf

server {
        listen 80;
	listen [::]:80;

        server_name choicoding.shop;

        location / {
	         proxy_pass http://localhost:8080;
       		 proxy_set_header X-Real-IP $remote_addr;
   	         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	         proxy_set_header Host $http_host;
    }

	return      301 https://$host$request_uri;
}

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

    server_name choicoding.shop;

    ssl_certificate /etc/letsencrypt/live/choicoding.shop/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/choicoding.shop/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header Host $http_host;
    }

}

Nginx 설정 파일을 통한 포트 리다이렉트

cat nginx.conf

명령어를 사용해서 파일 내용을 한번보면,

/etc/nginx/conf.d
/etc/nginx/sites-enabled

가 있는데, 우리가 실제로 설정하고 저장해야 할 설정파일들은 .conf 확장자로 sites-available에 저장하고,
해당 파일들에 대한 심볼릭 링크들을 sites-enabled에 위치시켜야 한다. image
간단히 정리해보면,

  1. sites-available에 설정파일을 생성하여 설정하고 싶은 내용을 적고
  2. 그에 대한 심볼릭 링크를 sites-available에 만들어
  3. Nginx를 restart하거나 reload하면
  4. nginx.conf에서 sites-available에 있는 심볼릭 링크들을 통해 설정파일 내용들을 읽어와 적용한다.

적용해보면,

cd /etc/nginx/sites-available
sudo vi test.conf

로 파일을 만들고 그안에,

server {
    listen 80;
    listen [::]:80;

    server_name choicoding.shop;
 
    location / {
         proxy_pass http://localhost:8080;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
    }
}

을 넣어주면 된다. 그러면 80포트로 localhost에 들어오는 모든 request에 대해 localhost 8080포트로 접속하게 해준다.
그리고 심볼릭 링크를 만들어 걸어주면되는데

sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled

sites-enabled로 이동해서 확인해보면

cd /etc/nginx/sites-enabled
ls -l

추가 된걸 알 수 있다. default파일이 있으면 내가 만든 파일이 적용되지 않아서 default파일을 삭제해줬다.

sudo rm default

그리고 nginx를 다시 재시작해주면 된다.

sudo service nginx restart

간단히 그림으로 보면
image
이러한 방식을 한 것이다.

SSL인증서 설정하기.

$mydeal> yum install certbot python2-certbot-nginx -y
$mydeal> systemctl stop nginx
$mydeal> certbot --standalone -d choicoding.shop certonly
$mydeal> vi conf.d/mydeal.conf

mydeal.conf파일에

server {
	listen 80;
	server_name choicoding.shop;

	location / {
        	root   /var/www/mydeal;
       	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 choicoding.shop;

    ssl_certificate /etc/letsencrypt/live/choicoding.shop/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/choicoding.shop/privkey.pem;

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

}

를 추가해주면 된다.

파일 이동하기(ForkLift3)

서버에 파일(.jar)을 쉽게 넘겨주기 위해서 ForkLift3를 설치하였다.
image

.jar파일 계속 돌리는 방법

명령어 nohup을 사용하면 된다. 예를들어

nohup java -jar test.jar

리눅스 쉘을 꺼도 .jar는 계속 돌아가고 있는 것이다.
대신, nohup명령어로 돌렸으면, 끌때는 포트번호를 사용해서 꺼야한다.

kill -9 PID번호

도메인 등록 확인증

image

image

프로그램 구성

image

개발환경

image

참고한 블로그 및, 유튜브

유튜브
https://www.youtube.com/channel/UCei9IGoBLCRShZaBb_RN_IA
블로그
https://phoenixnap.com/kb/install-java-on-centos
https://velog.io/@damiano1027/Nginx-Nginx%EC%99%80-SpringBoot-%EB%82%B4%EC%9E%A5-Tomcat-%EC%97%B0%EB%8F%99
https://mangkyu.tistory.com/98
https://naming0617.tistory.com/7
https://ingus26.tistory.com/36