ip addr
입력, inent 뒤의 부분이 주소 -> 10.0.2.15curl ipinfo.io/ip
-> 211.36.24.37두 개의 결과가 다르다.
public ip와 private ip가 같으면 컴퓨터를 그대로 서버로 사용하면 된다. 하지만 다를 경우에도 할 수 있는 방법이 여러 가지가 있다. 예를 들어 라우터로 묶여있는 컴퓨터 간에는 접속할 수 있다.
이번 수업에서는 서버의 구체적인 사례로서 웹서버 그 중에서 아파치 웹서버를 설치하고 운영하는 방법에 대해서 알아본다.
설치
sudo apt-get update
sudo apt-get install apache2
켜고 끄기
sudo service apache2 start
sudo service apache2 stop
sudo service apache2 restart
껐다 켜야할 때는 restart
켜졌는지 확인
sudo htop
f4
로 apache
검색
apache는 많은 접속이 들어왔을 때 분산해서 처리하기 위해 여러 개의 아파치 웹서버가 자동으로 실행됨
서버에 접속하기
ip를 통해 웹서버에 접속하는 것은 복잡하니, 쉘에서 직접 웹서버에 접속해보자
쉘에서 웹브라우징을 할 수 있는 프로그램 elinks 설치
sudo apt-get install elinks
(elinks
URL 입력, google.com(마우스 혹은 tab 키
를 통해 이동, Q
로 빠져나감))
elinks http://내 컴퓨터의 ip 주소
(ip addr
로 알아낸 ip)
한 대의 컴퓨터에서 웹브라우저와 웹서버를 동시에 사용하고 있을 경우, localhost 또는 127.0.0.1로 자신의 컴퓨터에 설치된 웹서버에 접속할 수 있다. (자기 자신을 의미)
elinks 127.0.0.1
ip 주소
elinks http://localhost
도메인 네임
WB가 요청(request) 보내면 WS가 받아서 storage(HDD/SDD) 어딘가에 저장되어 있는 요청한 파일을 읽어온다. 그것을 WB에게 응답(response)하고, WB는 그 파일을 해석해서 출력한다.
그렇다면 WS는 사용자가 요청한 파일을 어디에서 읽어오는 것일까?
프로그램의 동작방법에 대한 설정은 cd /etc
에 저장되어 있다.
cd apache2
ls -al
apache에 대한 설정파일 중 apache2.conf
라는 파일이 가장 중요
정리하면, WB의 요청이 들어올 때 WS는 /etc/apache2 밑에 있는 여러 가지 설정파일을 참고해서 사용자가 요청한 파일을 찾는다. 그리고 WS가 사용자가 요청한 파일을 찾는 최상위 디렉토리(ex. /var/www/html
)를 document root라고 부른다.
var/www/html
를 사용하는 이유는?
/etc/apache2/sites-enabled/000-default.conf
파일 안에 var/www/html
라고 적혀있었기 때문이다. 이 값을 바꾸면 다른 곳에 설치된다.
대부분의 서버는 etc라는 디렉토리 밑에 자신의 이름으로 설정파일이 있고 그 파일을 수정하면 동작하는 방식이 달라진다!
/etc/apache2/sites-enabled/000-default.conf
설정 파일에 보면
${APACHE_LOG_DIR}/error.log
${APACHE_LOG_DIR}/access.log
이런 내용이 있다.
아파치 웹서버가 동작할 때 잘 동작하는지 오류가 있는지 확인하고 싶을 때 아파치 로그 디렉토리로 지정되어 있는 특정한 디렉토리 아래에 있는 error.log, access.log에 기록하겠다라는 뜻이다.
그렇다면 APACHE_LOG_DIR
은 어디인가? cd /var/log/apache2/
access.log란?
cat access.log
acess.log에는 누군가가 웹서버에 접속할 때마다 접속한 사람의 정보가 추가됨
tail -f var/log/apache2/access.log
여기서-f
는 실시간으로 끝에 추가되는 정보만을 출력하는 아주 중요한 옵션
error.log란?
아파치 웹서버에 특정한 에러가 있을 때(실행시켰는데 동작을 안 하거나) error.log
에서 확인
원격으로 쉘을 제어할 수 있는 방법인 ssh에 대해서 알아본다.
대부분의 유닉스 계열의 시스템에는 SSH가 기본적으로 깔려 있다.
sudo apt-get purge openssh-server openssh-clinent
remove대신 purge를 하면 환경설정도 같이 사라지므로 삭제하는 것은 따라하지 말자.
sudo apt-get install openssh-server openssh-client
openssh는 ssh와 관련된 여러 프로그램을 제공하는 구체적인 프로그램
sudo service ssh start
실행 시작
sudo ps aux | grep ssh
잘 실행되는지 확인
원격제어 연결
<Server 컴퓨터> ip addr
로 ip 알아냄 -> 192.168.0.65
<Client 컴퓨터> ssh egoing@192.168.0.65
openssh를 실행시키는 명령어
이제 Client에서 내리는 명령은 모두 Server에서 실행된다.
포트는 네트워크를 통해 적절한 애플리케이션을 실행 시키기 위해서 꼭 필요한 개념이다.
예시 1)
www.naver.com == www.naver.com:80 != www.naver.com:8888
여기서 80이라는 숫자가 포트이다.
예시 2)
ssh -p 22 egoing@192.168.0.65
p는 포트라는 의미, 접속이 된다. (exit
)
ssh -p 2222 egoing@192.168.0.65
Connection refused
-> ssh는 22번이라는 포트를 쓴다는 추론이 가능
sudo nano /etc/ssh/sshd_config
로 파일을 열어보면 Port 22
라고 적혀있다. 이것을 2222
로 변경할 수 있다. sudo service ssh restart
해야 반영된다.ssh -p 2222 egoing@192.168.0.65
라고 해야 접속된다.공유기의 환경설정을 통해 포트 포워딩을 할 수 있다. 공유기의 환경설정에 접속하기 위해서는 공유기의 내장되어 있는 서버에 접속해야 한다. 그러려면 공유기의 내부에서만 통용되는 ip를 알아야 한다.(default gateway)
ip route
로 default gateway를 알아낼 수 있다. -> 192.169.0.1
(맥은 환경설정-네트워크에서 현재 연결된 와이파이-Advanced-TCP/IP-Router의 값)
192.168.0.65
내 컴퓨터의 ip주소 작성 linuxlove
9000
사용자가 사용할 포트의 번호(라우터의 포트)80
linuxlove
라는 규칙에 의해서 9000번 포트
로 누군가 들어왔을 때 192.168.0.65
ip 해당되는 컴퓨터의 80번 포트
로 신호를 보낸다는 뜻이다.211.46.24.37:9000
(public ip:route port)로 접속을 시도할 수 있다.sudo nano /etc/hosts
로 nano에 들어간 다음127.0.0.1 google.com
작성하면 elinks google.com
라고 했을 때/etc/hosts
파일은 호스트들의 이름이 어떤 아이피를 갖는지 적어놓은 것이라고 할 수 있다. /etc/hosts
파일을 어디에 활용할 수 있는가?egoing.ga
라는 운영하고 있는 서버가 있고, 도메인에도 등록되어 있다고 가정하자. 근데 도메인과 관련된 결함이 있어 서버의 내용을 바꿨음. 서버 쪽에 수정한 내용을 바로 반영했다가는 실수가 있을 수 있음. 이럴 때 자신의 개발환경에서만 hosts 파일의 도메인을 자신의 컴퓨터로 수정한다.cat /etc/resolv.conf
라고 치면 어떤 IP가 나옴.(컴퓨터마다 다름)/etc/resolv.conf
의 내용이 그 회사에서 서비스로 제공하는 DNS 서버의 IP로 바뀐다. curl ipinfo.io/ip
로 검색한 공용 아이피를 사용해야 한다. host egoing.ga
로 아이피 확인 가능하다. 하나의 서버는 하나의 도메인과 매칭이 된다. 만약 서버가 여러 개가 있다면 각각의 도메인을 구입해야 해야 하는데 돈이 많이 든다.
도메인을 재사용하는 방법이 있다! 바로 서브도메인을 이용하면 하나의 도메인을 구입해서 여러 개의 사이트를 운용하는 효과를 낼 수 있다.
egoing.ga
, admin.egoing.ga
, blog.egoing.ga
, news.egoing.ga
dig +trace egoing.ga
로 egoing.ga(도메인 네임)이 DNS 서버를 통해 IP 주소 확인하는 경로를 알 수 있다.egoing.ga
뒤에는 .
이 숨겨져 있다.(egoing.ga.
) .
을 root라고 한다.'우리의 DNS 서버'는 root DNS 리스트를 알고 있다. (dig +trace egoing.ga
치면 나오는 첫번째 문단)
사용자가 egoing.ga
접속을 시도할 때, 클라이언트는 그 ip를 DNS 서버에 물어볼 것이다. '우리의 DNS 서버'는 'root DNS 서버'에게 .ga
를 담당하는 DNS 서버가 누구인지를 물어본다. 그러면 root DNS 서버는 .ga
라는 도메인을 담당하는 네임 서버들의 목록을 돌려준다.
(dig +trace egoing.ga
치면 나오는 두번째 문단)
2번의 결과로 나온 'ga의 DNS 서버'에게 egoing.ga
를 관리하는 DNS 서버를 또 물어본다.
(dig +trace egoing.ga
치면 나오는 세번째 문단)
'우리의 DNS 서버'는 'egoing.ga의 DNS 서버'에게 egoing.ga의 아이피가 무엇인지 물어보고 반환한다.
(dig +trace egoing.ga
치면 나오는 네번째 문단)
이것을 클라이언트에게 보내주면 그 ip에 따라 접속한다.
즉, 도메인을 구입한다는 것을 ga라는 도메인을 관장하는 기관에게 관리비용을 내는 것이다. 그 기관을 그 서버를 관리하면서 요청이 들어왔을 때 그 ip 정보를 담고 있는 도메인 서버로 안내하는 것이다.
도메인을 구입할 때 ip 정보를 저장할 DNS 서버가 자동으로 세팅되었지만, 다른 DNS 서버를 지정할 수 있다.
mkdir rsync
cd rsync/
mkdir src
mkdir dest
src
에 파일을 만들고 그 파일을 dest
에 동기화를 시켜보려고 한다.cd src
touch test{1..10}
test1부터 test10까지 파일 생성cd ..
rsync -a src/ dest
rsync -a src dest
라고 하면 dest안에 src라는 디렉토리가 생성)ls -al dest
로 확인rsync
의 큰 매력은 증분 백업, 증분 카피를 한다. cd dest
rm test10
cd ..
rsync -av src/ dest
test10만이 복사가 된다. (v가 들어가면 자세하게 내용을 출력한다.) cd ..
rsync -av src/ dest
다시 실행하면 아무것도 안 나온다. 원본과 사본이 같은 상태이므로 복사를 하지 않는 것이다. -a
란? archive mode로 동작한다는 의미. 즉, 특정 디렉토리 안에 디렉토리가 있으면 그 전체를 전송하는 모드로 동작하고, 변경사항들만 전송하는 모드로 동작하고, 그 파일의 속성까지도 같이 전송하는 강력한 기능rsync를 네트워크를 통해 동기화시키는 방법
rsync -azP ~/rsync/src/ k8805@192.168.0.65:~/rsync/dest
(rsync -azP [전송하는 디렉토리] [전송받은 user명@전송받는 ip]:[전송받는 디렉토리]
)
z는 압축한다는 의미, P는 전송상황을 프로그래스 바로 보여준다
백업을 할 때 유용하게 사용된다.
192.168.0.65
/ 컴퓨터2의 ip: 192.168.0.67
>ssh-keygen
로 ssh 공개키, 비공개키를 만든다.~/ .ssh
디렉토리 아래에 생성된 id_rsa
파일은 ssh private key id_rsa.pub
파일은 ssh public key라고 한다.ssh-copy-id egoing@192.168.0.67
로 컴퓨터1의 id_rsa.pub
의 내용을 컴퓨터2authorized_keys
파일의 맨 끝에 붙여넣는다.ssh egoing@192.168.0.67
치면 로그인 없이 컴퓨터2에 접속가능하다.mkdir rsync3
touch test{1..100}
100개의 빈 파일 생성mkdir rsync_welcome
https://www.youtube.com/watch?list=PLuHgQVnccGMBT57a9dvEtd6OuWpugF9SH&v=Y16VCnP382Irsync -avz . egoing@192.168.0.67:~/rsync_welcome
엔터를 치면 전송이 휙 된다! 만약 퍼블릭키를 추가하지 않으면 되지 않는다.ssh
디렉토리로 들어가서 private key와 pulbic key가 있는지 확인하고, 있다면 이것들을 이용해서 전송을 하기 때문에 둘 사이의 관계를 확립해놨다면 로그인 없이 가능한 것이다.)cron
(정기적으로 명령을 실행)과 같은 기능을 이용할 때 로그인을 해야 한다면 자동화를 시킬 수 없다.ssh egoing@192.168.0.67
)할 때 RSA라는 암호화 기법이 사용된다. ssh
디렉토리에서 id_rsa
파일이 있으면 그것을 이용해서 random key를 암호화한다. 그리고 그 결과를 ssh server에게 전달한다. authorized_keys
에 저장되어 있는 공개키를 이용해서 복호화한다. 복호화한 결과가 random key가 같다면 로그인을 해준다. ;
앞의 명령어가 실패해도 다음 명령어가 실행&&
앞의 명령어가 성공했을 때 다음 명령어가 실행&
앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행mkdir test;cd test
&&
를 사용하면mkdir test(실패) && cd test && touch abc
cd test와 touch abc가 실행되지 않는다. ;
를 사용하면mkdir test(실패); cd test; touch abc
cd test가 실행되고, touch abc도 실행된다. 리눅스의 모든 명령어는 종료할 때 성공 여부를 알려준다. echo $?
를 통해 이전 명령어가 반환한 값을 알아낸다.
test 디렉토리가 없는 곳에서 mkdir test
명령을 실행하고 echo $?
을 실행하면 0
을 출력한다.
test 디렉토리가 이미 있는데 mkdir test
명령을 실행하고 echo $?
을 실행하면 1
을 출력한다.
존재하지 않는 명령을 입력하고 echo $?
을 실행하면 127
을 출력한다.
즉, 리눅스에서 0이 아닌 값은 실패(false)를 의미한다.
&는 명령어를 백그라운드로 동작시킬 때 사용한다.
mkdir test3 && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';
본 포스팅은 생활코딩 리눅스 강의(https://opentutorials.org/course/2598)를 참고하여 작성하였습니다.