CNAME과 A record의 차이를 알아보자


사전지식

  • DNS(Domain Name Server)
  • Domain, IP Address
  • test.me라는 도메인이 있다고 가정합시다.


CNAME

CNAME = Canonical Name의 줄임말로 하나의 도메인에 다른 이름을 부여하는 방식을 의미합니다. 도메인 이름의 또 다른 이름으로 생각하면 됩니다.

예시

 blog.test.me -> test.me // test.me의 또 다른 도메인명
 www.test.me -> test.me  // test.me의 또 다른 도메인명


A record

A record란 domain name하나의 IP Address가 있음을 의미합니다. 하나의 도메인(서브나 루트 포함)에 해당하는 IP 주소의 값을 가지고 있습니다.

예시

dev.test.me -> 123.456.789.123 // 해당 도메인의 IP 주소
test.me -> 987.654.321.123     // 해당 도메인의 IP 주소


위키 예시

아래는 Wikipedia에 나오는 예시입니다. 아래처럼 해당하는 도메인의 TYPE이 뭔지에 따라서 가지고 있는 Value가 다릅니다.


NAME TYPE VALUE
bar.example.com CNAME foo.example.com
foo.example.com A 192.0.2.23

업데이트(2018.04.16): 통계자료 링크에 따라서 업데이트 및 내용 보충

Ubuntu 환경에서 pyenv와 virtualenv를 사용해보자


환경

  • Ubuntu 14.04
  • Ubuntu 16.04


package를 통한 nginx 설치

nginx를 설치하는 방법에는 apt-get을 통한 방식과 직접 소스코드를 내려받아서 컴파일하는 2가지 방식이 있습니다. 더 편하고 빠른 방식은 package를 통한 방식이라 apt-get을 이용해서 설치하겠습니다.

$ sudo apt-get install nginx

다음 명령어를 통해서 버전도 확인하고 설치가 되었는지 확인해봅시다.

$ nginx -v
nginx version: nginx/1.4.6 (Ubuntu)

코드를 직접 받아서 make를 통한 직접 컴파일을 해서 설치하는 부분은 현재 진행하는 프로젝트가 끝나고 해보도록 하겠습니다.:)


Nginx에 대해서 간략하게

Nginx?

Apache처럼 웹서버 환경을 만들어주는 소프트웨어입니다.

웹서버?

웹서버란 전체 서버 아키텍처의 앞단에서 HTTP 요청에 따라서 그 요청을 넘기고 그에 해당하는 file 혹은 리소스를 넘겨주는 역할을 하는 부분입니다.

시장 점유율

현재 2018년 기준 w3techs에 따르면 38.0%의 사이트들이 사용하고 있다고 함니다.(해당링크)

Apache와의 차이점 및 장점

구조적인면에 있어서 Apache의 경우에는 요청마다 스레드 혹은 프로세스 기반으로 처리하는데, Nginx의 경우에는 이러한 구조 대신에 요청을 비동기 이벤트 구조로 구동됩니다. 그래서 구글에 있는 글들에 의하면 더 적은 리소스를 효율적으로 사용 할 수 있다고 나와 있습니다.

  • Apache: 요청마다 스레드 혹은 프로세스 생성 및 처리
  • Nginx: 요청마다 비동기 이벤트를 발생시켜 처리


nginx 사용 명령어

// 시작
$ sudo service nginx start
$ sudo systemctl start nginx
$ sudo /etc/init.d/nginx start

// 재시작
$ sudo service nginx restart
$ sudo systemctl restart nginx
$ sudo /etc/init.d/nginx restart

// 중지
$ sudo service nginx stop
$ sudo systemctl stop nginx
$ sudo /etc/init.d/nginx stop

// 상태
$ sudo service nginx status
$ sudo systemctl status nginx

// 설정 reload
$ sudo service nginx reload
$ sudo systemctl reload nginx
$ sudo nginx -s reload

// configuration file syntax check
$ sudo nginx -t


nginx 설정

설정 파일들 경로

nginx 설치 방법에는 2가지 방법이 있다고 했다. 각 설치법에 따라서 환경설정 파일의 위치가 다르다.

  • package(apt-get을 통한 설치)의 경우: /etc/nginx에 위치
  • 직접 compile한 경우: /usr/local/nginx/conf, /usr/local/etc/nginx

위에 3개의 폴더중에는 한 곳에 위치하게 되어있지만 다음 명령어를 통해서도 찾을 수 있다고 합니다.

$ sudo find / -name nginx.conf


설정 파일들

모든 설정파일들을 건드려보지 않았기에 설정 할 때 필요한 몇가지 파일 및 폴더들만 보겠습니다.

  • nginx.conf: nginx와 그 모듈들이 작동하는 방식에 대한 설정 파일입니다. sites-enabled안에 각각 서버에 대한 conf파일들을 만들고 이 안에 첨부하여 웹서버를 운영할 수 있습니다. conf 파일안을 보시면 http, server, location, upstream과 같이 나누어져 있는데 이를 블록이라 하며 server는 가상 서버 혹은 일반 서버를 호스팅 할 때 사용되며 location의 경우 특정 폴더 밑 파일에 대한 경로를 지정해주고 upstream의 경우 Reverse Proxy 설정을 위해서 사용됩니다.

  • sites-enabled: 위에서 말한 nginx.conf에 첨부해서 실제로 서버를 운영할 설정 파일들이 들어있는 폴더입니다. 실제로 코드를 보면 nginx.conf에서 여기 폴더에 있는 모든 파일들을 불러옵니다.

  • fastcgi_params, scgi_params, uwsgi_params: uwsgi와 같이 웹 서버와 애플리케이션 서버 사이에서 인터페이스 역할을 해줄 때 필요한 파일들입니다.

파일을 어떻게 사용하는지에 대한 간단한 설명은 다음 포스팅에서 Nginx-uWSGI-Django 연결 편에서 사용해볼 예정입니다.


접속을 통한 확인

이제 설치가 모두 되었다면 자신의 컴퓨터의 IP주소를 브라우저 창에 치면 아래와 같이 “Welcome to nginx”가 나와야합니다.

제 경우에는 Domain이 있어서 도메인 명을 통해서 접속하였습니다.

Welcome


완료된 현재 구조

현재 구조는 현재 아래처럼 웹 클라이언트가 현재 내 웹 서버에 Nginx를 통해서 접근하고 가장 기본 index.html을 띄워주는 구조로 되어있습니다.

  • Web Client <-> Web Server(Nginx)


참고자료

업데이트(2022.12.01): pyenv-update git 주소 변경

업데이트(2021.10.11): pyenv 설정 관련 값 추가

업데이트(2020.02.08): Ubuntu 18.04 내용 추가 및 파이썬 버전 변경 3.5.2 -> 3.6.2

업데이트(2018.03.07): pyenv-update를 추가하였고 환경변수를 로드해주는 명령어도 추가해주었습니다.

Ubuntu 환경에서 pyenv와 virtualenv를 사용해보자

환경

  • Ubuntu 16.04
  • Ubuntu 18.04


필요한 패키지들 설치

Common build problems를 참고하면 Build 관련해서 문제가 생길 때 설치해야 할 패키지와 어떻게 pyenv version package를 지우고 재설치해야 하는지가 나와있습니다. 이 때 나온 패키지들을 미리 설치해주면 나중에 생길 문제를 미리 방지 할 수 있겠죠? :)

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git libedit-dev python


pyenv 설치

git에서 ~/ 폴더안에 .pyenv이름으로 직접 clone을 합니다.

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

추가를 마치고 환경변수까지 추가합니다.

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

환경 변수를 추가하고나서 pyenv를 찾을 수 없다고 하여 컴퓨터를 reboot하였습니다.

만약 이렇게 reboot을 했음에도 진행이 되지 않는다면 다음 링크를 참고한다.(https://github.com/pyenv/pyenv/wiki/Common-build-problems)


pyenv-update 설치

pyenv를 업데이트 해줄 수 있도록 다음 아래 명령어를 통해 pyenv-update를 설치합니다.

$ git clone https://github.com/pyenv/pyenv-update.git ~/.pyenv/plugins/pyenv-update

업데이트를 합니다.

$ pyenv update


설치 가능한 python version들 확인

설치 가능한 python version들을 확인하고 설치합니다.

pyenv install --list


필요한 python version 설치

저는 3.6.2를 설치하였습니다. pyenv에 설치된 python version들은 pyenv versions를 통해서 확인 가능합니다.

$ pyenv install 3.6.2


pyenv-virtualenv 설치

git에서 ~/.pyenv/plugins/ 폴더안에 pyenv-virtualenvwrapper이름으로 직접 clone을 합니다.

$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

추가를 마치고 환경변수까지 추가합니다.

$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

똑같이 환경변수를 추가하고 로드하였는데도 안되면 다시 shell을 껐다가 켭니다.


가상환경 생성

이전에 포스팅한 [Mac] Mac에서 pyenv, virtualenv 그리고 autoenv 사용하기에 나와있는 것과 사용법은 똑같습니다.

사용법

$ pyenv virtualenv [python version] [virtual environment name]

예시

$ pyenv virtualenv 3.6.2 LinkU


가상환경 사용

이 부분도 포스팅한 [Mac] Mac에서 pyenv, virtualenv 그리고 autoenv 사용하기에 나와있는 것과 사용법은 똑같습니다.

$ pyenv activate [virtual environment name]
(virtual environment name)$ pyenv deactivate


참고자료

Shell Script에서 명령어들을 순차적으로 실행해야 할 때 ;와 &&를 쓰는데 그 차이를 알아보자

환경 및 선수조건

  • Ubuntu
  • CentOS


차이

  • ;는 앞에 있는 명령어가 성공적으로 수행이되든 되지 않든 다음에 나오는 명령어가 실행됩니다.
$ apt-get install gcc; apt-get install gdb


  • &&AND와 같은 의미로 앞의 명령어가 성공적으로 수행되어야(true를 return해야) 다음뒤에 있는 명령어가 실행됩니다.
$ apt-get install gcc && apt-get install gdb

ssh key로만 로그인을 할 수 있도록 변경하자

환경 및 선수조건


sshd_config 파일 수정하기

$vim /etc/ssh/sshd_config

다음 아래처럼 PasswordAuthentication yes를 다음처럼 PasswordAuthentication no로 변경합니다.

  • PasswordAuthentication yes -> PasswordAuthentication no

PasswordAuthenticationYes PasswordAuthenticationNo


ssh 바뀐 설정 적용하기

다음 명령어를 통해 바뀐 설정을 적용해줍니다.

$ /etc/init.d/ssh restart

#아무런 반응이 없다면

$ service ssh restart

만약 적용되지 않는다면 재부팅해주면 적용되어있습니다.

$ sudo reboot