728x90

서버를 빌려서 사용하는 종류는 용도에 따라서 나눌 수 있다

 

웹호스팅: 홈페이지를 운영할 목적이고 웹관련된 폴더에 업로드하여 운영할때 사용하고 비용이 저렵하다.

서버호스팅: 서버를 통째로 임대하여 사용하는 것으로 사용자 마음대로 프로그램 설치등을 할 수 있지만 독립으로 사용하는 만금 사용 비용이 고가이다.

 

웹서버로서의 역할만이 아니고 요즘 흔하게 사용되어지는 인공지능이라도 사용하려면 비싼 서버호스팅을 할수밖에는 없다. 하지만 다행 스럽게도 크라우드 서버가 출현하여 비용 절감에 큰 몫을 하고 있다.

 

이번에는 그와 비슷한 실습 환경을 만들기 위해서 Docker를 사용하여 클라우드 서버를 구축하여 실습을 가기로 해서 그 방법을 정리해둔다.

 

docker 로 ubuntu container 를 생성한 뒤 마치 독립된 서버처럼 putty 를 통해 접속하는 방법이다.

컨테이너 생성

ubuntu:20.04 image 를 pull 받는다.

docker pull ubuntu:20.04 
$ docker images

pull 받은 image 로 container 를 생성.

docker run -dit -p777:22 --privileged=true --name "ubuntu_20_04" ubuntu:20.04

apt-get sudo 를 설치한다

옵션 설명

  • d : 데몬 프로세스로 실행
  • i : 사용자가 입출력 할 수 있는 명령 모드
  • t : 가상 터미널 환경 활성화
  • p : 연결 포트설정, 777:22 로 지정시 docker 가 실행되는 서버의 777 포트에 접속할 시해당 docker 컨테이너의 22 포트로 포트포워딩 된다.
  • -privileged : apt update 에러 대안
  • -name : 컨테이너의 이름

서버 포트 또한 개방해야 외부에서 putty 로 접속 할 수 있다.

접속하는 서버에서 하기와 같은 명령을 통해 포트를 개방한다.

$ sudo ufw allow 777

이제 container 내부에서 해야할 작업이 남아있다.

$ docker exec -it ubuntu_20_04 /bin/bash

docker container 의 내부로 진입했을 경우 apt update 를 해야 다른 모듈들을 설치할 수 있다.

아래 명령어를 컨테이너 내부에서 실행한다.

# apt update && apt install net-tools vim openssh-server ufw
# ufw allow ssh

vi /etc/ssh/sshd_config 파일을 수정해야한다.

# vi /etc/ssh/sshd_config

 PermitRootLogin 부분을 yes 로 변경한다. (주석 #해제 및 yes로 변경)

## 컨테이너 root 계정 암호 설정

터미널에 다음 명령어를 쳐서 root계정의 암호를 설정한다

passwd root


 


-> 컨테이너 종료 후 다시시작하면 ssh가 자동으로 안 켜진다...

# service ssh start
# service ssh restart

putty 로 접속하는 서버의 ip 와 지정한 port(해당 포스트에서는 777) 를 입력해 접속 시도한다.

해당 container 도 ubuntu 환경이므로 다른 유저를 생성해서 접속할 수 있다.

 

이제 파일 전송을 위한 ftp를 설정하면 된다

 

목동코딩학원 : 온라인코딩교육, 유니티게임개발교육, 로블록스게임개발교육, 한국서비스산업진흥원, 플랫폼프로젝트수업

728x90
728x90

목동코딩학원:

 

서버이전 작업을 했다.

하나는 이전 작업이고, 하나는 신규 설치 작업이다.

자체 서버에서만 작업을 하다가 , 이번에 Cloud Server에 작업 하다보니 조금 답답함도 있었다.

 

이 작업은 그냥 나들이 가듯이 하기에는 부담이 많은 작업이다.

예를 들면 우리가 이사를 하는 경우를 들 수 있다. 그냥 이사라기 보다는 해외이사의 경우가

조금 더 어울린다.

 

잘 쓰던 전자 제품이 전압이 안 맞아서 트랜스를 구해야 한다던지, 엘리베이터가 없어서 사람의 힘으로 

가구를 옮긴다 던지 아니면 문이 작아서 대형 냉장고가 안들어 가는 문제로 냉장고 문을 분해해서 억지고 

옮기는 경우이다. 가스가 안들어 오거나 , 전기가 안들어 올때 해법을 찾아야 한다던지 ...

 

이렇게 힘들여 한 이사를 또 한다고 생각해 보면 "으이그~~" 스럽다 ㅎㅎ.

알고리즘으로 프로그래밍을 하는 것과는 또다른 영역이다.

 

작업을 마치면 운영 테스트를 해야 하는데 생각 하지 못한 문제가 발생되곤 한다.

이번에 발생한 소소한 에러중에 날자 timezone을 설정하지 않은 부분도 있었다 ㅎㅎ.

물론 DB도 같이 설정 해줘야 한다.

 

그냥 서버만 설치한다면 작업할게 많지 않다.

ununtu 설치, mysql 설치, web서버 설치, Frame 설치, 응용프로그램 설치 정도이다.

이것도 쉬운일은 아니다 ㅎㅎ.

ubutu 버전, php 버전, mysql 버전, web서버( apcahe, nginx ....)등 여러가지를 설치해야 한다.

 

하지만 지금 상황을 보면,

다른  서버에서는 실제 업무가 돌아가고 있다. 적당한 싯점에 데이타를 옮겨 오기도 해야 한다.

혹시나 서버에 문제가 생길까봐서 서버 이중화도 해야 하고, Load Balacinf도 해야 한다.

저녁 늦게나 아침 일찍 전화가 오는 날에는 긴장이 된다 . "혹시...?" 하고 .

프랜차이즈 시스템이다 보니 신경이 더 많이 쓰인다.

 

그리고 서버이전 작업 과정이 길고 자주 하지는 않다 보니, 아무리 꼼꼼하게 메모해도 다음에 다시하려면 큰맘을 먹어야 한다 ㅎㅎ.

 

이런 프랜차이즈 시스템을 또 하나 준비중이다.

이번 작업은 24시간 운영되는 시스템이라 더 많이 신경이 쓰인다.....

 

 

728x90
728x90

지금 유지보수 하는 업체의 서버를 이전 해야할 필요가 생겼다.

서버 작업은 자주 하지 않다 보니 매번 새롭다.

게다가 버전을 맞추어 작업을 하다보니 몇 번을 해도 거의 같은 시간이 걸린다 ㅎㅎ

다음에 참조하기 위해 작업한 내용을 기록한다.

이번 작업은 클라우드 서버에 ubuntu, Docker등을 설치할 예정이다

----------------------------------

서버 : ubuntu 20.04

볼륨추가 : 1000Giga Byte

ubuntu@ubuntu1:~$ sudo su
root@ubuntu1:/home/ubuntu# fdisk -l

#파티션을 나눈다
root@ubuntu1:/home/ubuntu# fdisk /dev/vdc

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x452e13e9.

Command (m for help): n
Partition type
p   primary (0 primary, 0 extended, 4 free)
e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151999, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2097151999, default 2097151999):

Created a new partition 1 of type 'Linux' and of size 1000 GiB.

Command (m for help): p
Disk /dev/vdc: 1000 GiB, 1073741824000 bytes, 2097152000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x452e13e9

Device     Boot Start        End    Sectors  Size Id Type
/dev/vdc1        2048 2097151999 2097149952 1000G 83 Linux

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

root@ubuntu1:/home/ubuntu# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           394M 1004K  393M   1% /run
/dev/vda1        97G  1.8G   95G   2% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop0       62M   62M     0 100% /snap/core20/1270
/dev/loop1       68M   68M     0 100% /snap/lxd/21835
/dev/vda15      105M  5.2M  100M   5% /boot/efi
tmpfs           394M     0  394M   0% /run/user/1000
/dev/loop3       50M   50M     0 100% /snap/snapd/18357
/dev/loop4       64M   64M     0 100% /snap/core20/1822
/dev/loop5       92M   92M     0 100% /snap/lxd/24061

#파티션을 포맷한다
root@ubuntu1:/home/ubuntu# mkfs.ext4 /dev/vdc1

#UUID를 확보한다
root@ubuntu1:/home/ubuntu# blkid

#디랙토리를 만든다
root@ubuntu1:/home/ubuntu# mkdir -p /home/ubuntu/storage

#재부팅시 자동 연결하기 위해서 파일에 설정한다
root@ubuntu1:/home/ubuntu# vi /etc/fstab
LABEL=cloudimg-rootfs   /        ext4   defaults        0 1
LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1
/dev/vdb        none    swap    sw,comment=cloudconfig  0       0
UUID=0a76a959-85d1-4e8c-8fe6-6e8d036017f7 /home/ubuntu/storage ext4 defaults 0 0

root@ubuntu1:/home/ubuntu# mount -a
root@ubuntu1:/home/ubuntu# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           394M  992K  393M   1% /run
/dev/vda1        97G  1.9G   95G   2% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/loop0       62M   62M     0 100% /snap/core20/1270
/dev/loop1       68M   68M     0 100% /snap/lxd/21835
/dev/vda15      105M  5.2M  100M   5% /boot/efi
tmpfs           394M     0  394M   0% /run/user/1000
/dev/loop3       50M   50M     0 100% /snap/snapd/18357
/dev/loop4       64M   64M     0 100% /snap/core20/1822
/dev/loop5       92M   92M     0 100% /snap/lxd/24061
/dev/vdc1       984G   77M  934G   1% /home/ubuntu/storage

#볼륨을 해제하고 다시 사용할때 사용한다
umount /home/ubuntu/storage << 마운트 해제시

Mysql  설치 및 원격접속 허용

apt-get install mariadb-server
mysql -uroot

> use mysql;
update user set authentication_string=password('password') where user='root';
flush priviledges ;
grant all privileges on . to 'root'@'%' identified by 'password';
> 

root@ubuntu1:/home/ubuntu/storage# cd /etc
root@ubuntu1:/etc# cd mysql

root@ubuntu1:/etc/mysql# ls
conf.d  debian-start  debian.cnf  mariadb.cnf  mariadb.conf.d  my.cnf  my.cnf.fallback

root@ubuntu1:/etc/mysql# cd mariadb.conf.d

root@ubuntu1:/etc/mysql/mariadb.conf.d# ls
50-client.cnf  50-mysql-clients.cnf  50-mysqld_safe.cnf  50-server.cnf

root@ubuntu1:/etc/mysql/mariadb.conf.d# vi 50-server.cnf
127.0.0.1  >> 0.0.0.1 로변경
root@ubuntu1:/etc/mysql/mariadb.conf.d# systemctl restart mysql

>> sql 파일로  DB를 생성함

asp.net core 3.1설치

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
 -O packages-microsoft-prod.deb

nginx proxy 설정

server {
listen        80;
server_name   example.com *.example.com;

		location / {
		    proxy_pass         <http://localhost:5000>;
		    proxy_http_version 1.1;
		    proxy_set_header   Upgrade $http_upgrade;
		    proxy_set_header   Connection keep-alive;
		    proxy_set_header   Host $host;
		    proxy_cache_bypass $http_upgrade;
		    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
		    proxy_set_header   X-Forwarded-Proto $scheme;
		}
		location /downloads {
		    alias /var/downloads/;
		    autoindex on;
		    limit_rate_after 10M;
		    limit_rate 5M;
		    access_log /var/log/nginx/down.access.log;
		    error_log  /var/log/nginx/down.error.log;
		    charset utf-8;
		}

}

Docker 설치

오래된 버전 삭제하기

혹시나 기존의 오래된 버전이 있는지 확실히 할 수 있으며, 있다면 최신 버전 설치를 위해 삭제 해줍니다.

bash

$ sudo apt-get update

$ sudo apt-get -y install \ apt-transport-https \ ca-certificates \ curl \ gnupg 
\ lsb-release 

curl -fsSL
[https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg)

| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \

"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]

[https://download.docker.com/linux/ubuntu](https://download.docker.com/linux/ubuntu)

\

$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker Engine 설치하기

아래 명령어를 입력하면 자동으로 최신 버전이 설치 됩니다.

$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli

[containerd.io](http://containerd.io/)

설치 완료

설치가 완료된 후에는

bash

$docker --version

$apt install docker-compose

$cd /home/ubuntu/appnet
$docker-compose up -d

vi Dockerfile
FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul
RUN apt-get update
RUN apt-get install -y tzdata

RUN apt-get update && apt-get -y install apache2 software-properties-common
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
RUN apt-get update && apt-get install -y libapache2-mod-php7.3 php7.3 php7.3-cli php7.3-mysql
RUN a2enmod rewrite
EXPOSE 80
CMD apachectl -D FOREGROUND

RUN apt install vim -y
RUN apt install net-tools -y
RUN apt install iputils-ping -y

RUN apt update -y
RUN apt install language-pack-ko -y
RUN apt install fonts-nanum -y
RUN apt install fonts-nanum-coding -y
RUN apt install fonts-noto-cjk -y
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8

WORKDIR /
===================================
vi docker-compose.yml
version: '2'

services:
    ubuntu2004:
        hostname: a
        container_name: a_container
        build:
            context: .
            dockerfile: ./Dockerfile
        ports:
            - "8100:80"
        stdin_open: true
        tty: true
        environment:
            - TZ:"Asia/Seoul"
        volumes:
            - ./html:/var/www/html
========================
cd /etc/nginx/sites-available
vi default
server {
    listen        80;
    server_name   example.com *.example.com;

    location / {
        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
    location /downloads {
        alias /var/downloads/;
        autoindex on;
        limit_rate_after 10M;
        limit_rate 5M;
        access_log /var/log/nginx/down.access.log;
        error_log  /var/log/nginx/down.error.log;
        charset utf-8;
    }
}
server {
    listen        80;
    server_name   example.com *.example.com;

    location / {
        proxy_pass         http://localhost:8100;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
    location /downloads {
        alias /var/downloads/;
        autoindex on;
        limit_rate_after 10M;
        limit_rate 5M;
        access_log /var/log/nginx/down.access.log;
        error_log  /var/log/nginx/down.error.log;
        charset utf-8;
    }
}

service nginx restart

http://localhost:8100 은 실행됨

DNS변경 작업

 

- 이상 -

 

 

 

목동코딩학원 : 유니티, 로블록스 게임개발 교육

 

728x90
728x90

Docker container에서 curl을 사용하려면 다음과 같은 방법 중 하나를 선택하여 진행할 수 있습니다.

  1. curl이 이미 설치된 Docker 이미지를 사용하기
    • curl이 이미 설치된 Docker 이미지를 사용하면 curl 명령어를 사용할 수 있습니다. 예를 들어, ubuntu 이미지를 사용하여 Docker 컨테이너를 실행하면 curl을 사용할 수 있습니다.
docker run -it ubuntu
  1. 컨테이너 내부에서 curl 명령어를 실행하면, 컨테이너 내부에 설치된 curl을 사용할 수 있습니다.
  2. Docker 컨테이너 내부에 curl 설치하기
    • Docker 컨테이너 내부에 curl을 설치하여 사용할 수도 있습니다. 이를 위해서는 Dockerfile에서 curl을 설치하고 이미지를 빌드해야 합니다. 예를 들어, 다음과 같은 Dockerfile을 작성하여 curl을 설치한 이미지를 빌드할 수 있습니다.
FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl

이후, 다음과 같이 Docker 이미지를 빌드하여 컨테이너를 실행할 수 있습니다

docker build -t myimage .
docker run -it myimage
  1. 컨테이너 내부에서 curl 명령어를 실행하면, 컨테이너 내부에 설치된 curl을 사용할 수 있습니다.
  2. Docker 컨테이너 외부에서 curl 사용하기
    • Docker 컨테이너 외부에서 curl 명령어를 실행할 수 있습니다. 이를 위해서는 docker exec 명령어를 사용하여 컨테이너 내부에서 curl 명령어를 실행해야 합니다. 예를 들어, 다음과 같이 컨테이너를 실행하고 docker exec 명령어를 사용하여 컨테이너 내부에서 curl 명령어를 실행할 수 있습니다.
docker run -it myimage
# 컨테이너 내부에서 실행
curl https://www.google.com
# 컨테이너 외부에서 실행
docker exec <container_id> curl https://www.google.com

위와 같이 curl을 사용하여 Docker 컨테이너 내부와 외부에서 데이터를 송수신할 수 있습니다

728x90
728x90
<?php
$oCurl = curl_init();
        curl_setopt($oCurl,CURLOPT_URL,$url);
        curl_setopt($oCurl,CURLOPT_RETURNTRANSFER, true);
        curl_setopt($oCurl,CURLOPT_NOSIGNAL, 1);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($oCurl, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($oCurl, CURLOPT_VERBOSE, true);
        curl_setopt($oCurl, CURLOPT_TIMEOUT, 3);
        $response = curl_exec($oCurl);
        $curl_errno = curl_errno($oCurl);
        $curl_error = curl_error($oCurl);

        curl_close($oCurl);
?>
이와 같이 php source를 실행하려는데 error 가 난다. 원인을 찾아보니 추가로 설치해야 하는가 보다 ㅎㅎ
=============

Fatal error: Uncaught Error: Call to undefined function curl_init() 에러는 PHP에서 cURL 확장을 로드하지 않은 경우 발생합니다. 이 에러를 수정하려면 다음과 같은 단계를 수행해야 합니다.

도커 컨테이너 안에 들어가서 PHP와 cURL을 설치해야 합니다. 컨테이너에 들어가는 방법은 docker exec 명령어를 사용하는 것입니다. 예를 들어, docker exec -it <container_name> bash 명령어를 사용하면 <container_name> 컨테이너에 bash 셸로 들어갈 수 있습니다.

컨테이너 안에서 다음과 같은 명령어를 실행하여 PHP와 cURL을 설치합니다.

sql
Copy code
apt-get update
apt-get install -y php-curl
이 명령어는 컨테이너 안에서 apt-get을 실행하여 패키지를 업데이트하고, php-curl 패키지를 설치합니다. 이 패키지는 PHP에서 cURL을 사용할 수 있도록 해 줍니다.

PHP-FPM 서비스를 재시작합니다. 이 작업은 도커 컨테이너를 다시 시작하여 수행할 수 있습니다.

php
Copy code
docker restart <container_name>
이제 다시 PHP를 실행하면 Fatal error: Uncaught Error: Call to undefined function curl_init() 에러가 발생하지 않아야 합니다.
728x90
728x90

내 개인 서버에 Docker를 설치해서 잘 사용하고 있다.

그런데 오늘 외부에서 사이트 접속을 하는데 연결이 되지 않는다.

급하게 노트북을 열고 명령어를 몇개 쳐봤는데

이런 메시지가 나와서 나는 재시작만 하면 될거로 생각했는데 되질 않는다.

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

 

$sudo systemctl status docker

위의 명령어로 상태를 보니 Active로 상채가 표시된다. 어쨌던

$sudo systemctl start docker 를 다시 실행하고 사이트를 실행해 보지만, 역시 에러가 난다.

이것 저것 해봐도 안되기에 결국 재부팅을 했다.

이제 docker ps -a 명령어가 먹는다.

원인을 알고 싶은데 너무 쉬게 재부팅 한게 조금 아쉽다.

아마도 메모리 문제가 아니었을까 싶은 생각이 든다..

$reboot now.....

728x90
728x90

지금은 YouTube와 구글 Browser가 충분한 선생님이다 ㅎ

처음 전산실 근무하며, COBOL만 사용하며 근무해도 월급 받기 충분했지만,

HP SE(System Engineer)로 근무하던 친구가, 앞으로는 MS제품 한 두개는 할 줄 알아야 한다 기에, Windows NT, Visual Basic 을 공부해서 한 시절을 버텼다.

외국에서 들어온 뒤 ,20대 후반의 젊은 친구가 Andorid 와 Unity 3d 라는게 있다고 하기에, 또한 공부 해서 지금 까지도 버티고 있다.

서버 운영도 Windows 환경에서 Linux 환경으로 바꿔서 지금껏 사용하는데, 또 한 번 공부를 하려고 벼르던 것이 Docker 와 kubernetes 였다.

다양한 환경의 시스템 유지 보수와 신규 시스템 개발을 하다 보니 공부할 필요성을 느꼈지만, 미루고 미루다가 최근에 일차 공부를 마치고 실제 서버 운영을 Docker 방식으로 시작했다. 서로 다른 서버 환경을 하나의 서버에서 구동 하다 보니 신기하기도 하고 비용도 절감이 된다.

YouTube를 보다 보면 자꾸 연관 검색에 뜨길래, 공부 해야지 해야지 하고 미루다가 시작한 Docker , kubernets 공부하는데 , 근 한 달 간을 선생님 역할을 해준 구글 검색과 유튜브에 감사한다.

집에서도 채널 Scan을 한번하고 나면 YouTube로 넘어가서 나만의 공부를 한다 ㅎㅎ

 

목동코딩학원 : 온라인코딩교육

728x90

+ Recent posts