동일한 서버에서 Apache - Tomcat 연동하기


아래 내용은 다음의 상황에서 진행된 내용이다. apache2와 tomcat8, openjdk-8-jre-headless, openjdk-8-jdk 등이 이미 설치되어 있다고 가정한다.

-. Ubuntu 16.04

-. Apache 2.4

-. Tomcat 8.0


서버에 PHP와 JSP 모두를 개발하고 실행할수 있는 환경을 구축하고자 한다. 이 경우 우선적으로 문제가 되는 것은 apache의 경우는 80포트를 기본으로 사용하고 tomcat의 경우는 8080 포트를 기본으로 사용한다.

따라서 동일 서버상에서 80으로 접속해 오는 경우들에 대해서 상황에 맞게 때로는 apache를 통해 php, html 등을 실행시키고 혹은 tomcat을 통해 jsp를 실행하도록 할려면 Apache와 Tomcat을 연동하도록 해야한다.

그 외에 부하를 분산시키는 등의 잇점들이 있을 것이다. 


우선 다음과 같은 시나리오로 진행될 것이다.

 -. joekog.iptime.org에 대한 apache 가상 호스트를 생성해서 해당 도메인에 대한 php에 대한 웹 서비스를 처리하도록 할 것이다

 -. joekog.iptime.org에 대한 tomcat 가상 호스트를 생성해서 해당 도메인에 대한 jsp 웹 서비스를 처리하도록 할 것이다.

 -. joekog.iptime.org에 대한 apache와 tomcat이 처리할 웹 루트 경로는 /home/joekog/www/ROOT/가 될 것이다.

 -. /home/joekog/www/ROOT/ 아래에 .html, .php, .jsp 파일들이 위치해 있을 것이고 웹브라우저에서 http://joekog.iptime.org로 접속할 때 /home/joekog/www/ROOT/ 아래에 있는 .html, .php, .jsp 파일들이 실행될 것이다. 적절히 apache와 tomcat이 알아서 실행하게 될 것이다.

 -. IpTIME의 DDNS 기능을 이용하여 joekog.iptime.org라는 도메인을 생성해서 위의 내용을 테스트 할 것이다.


이상의 내용을 위해 다음의 내용을 사전에 알고 있어야 한다.

 -. apache 가상 호스트(Virtual Host) 생성하는 법 및 IpTIME DDNS 생성하는 법 : 여기를 참조

 -. tomcat 가상 호스트 생성하는 법 : 여기를 참조


우선 Ubuntu 터미널 창에서 root로 로그인 한 후 apache와 tomcat의 연동을 위한 다음 모듈을 설치한다.


# apt-get install libapache2-mod-jk


위의 파일을 설치하면 다음과 같은 경로와 파일이 생성이 된다.


/etc/libapache2-mod-jk/workers.properties


이 파일에서 3가지를 현재의 서버 환경에 맞게 설정해 주면 된다. 나머지는 디폴트 상태로 두면 된다.

 -. tomcat home 디렉토리

 -. java home 디렉토리

 -. 톰캣이 맡아서 처리할 내용을 아파치가 톰캣에게 넘기기 위해 톰캣을 지칭하기 위한 이름


workers.properties를 열어서 아래의 내용을 찾아서 해당하는 환경 정보를 입력해 준다.


workers.tomcat_home=①

workers.java_home=②

worker.list=③


① tomcat 홈 디렉토리를 찾을려면 아래 명령을 실행하면 아래와 같은 정보가 보일 텐데 여기서 CATALINA_HOME의 경로인 /usr/share/tomcat8가 tomcat의 홈 디렉토리 경로가 된다.


# /usr/share/tomcat8/bin/version.sh


Using CATALINA_BASE:   /usr/share/tomcat8

Using CATALINA_HOME:   /usr/share/tomcat8

Using CATALINA_TMPDIR: /usr/share/tomcat8/temp

Using JRE_HOME:        /usr

Using CLASSPATH:       /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar

Server version: Apache Tomcat/8.0.32 (Ubuntu)

Server built:   Sep 27 2017 21:23:18 UTC

Server number:  8.0.32.0

OS Name:        Linux

OS Version:     4.13.0-43-generic

Architecture:   amd64

JVM Version:    1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11

JVM Vendor:     Oracle Corporation


② java 홈 디렉토리를 찾기위해서는 다음 명령을 실행하면 


# find / -name '*-openjdk-*'


/usr/share/gdb/auto-load/usr/lib/jvm/java-8-openjdk-amd64

/usr/lib/jvm/java-1.8.0-openjdk-amd64

/usr/lib/jvm/.java-1.8.0-openjdk-amd64.jinfo

/usr/lib/jvm/java-8-openjdk-amd64

/usr/lib/debug/usr/lib/jvm/java-1.8.0-openjdk-amd64


여기서 /usr/lib/jvm/java-8-openjdk-amd64가 java의 홈 디렉토리이다. cd 명령으로  /usr/lib/jvm/ 이 위치로 가서 ls -l을 해 보면 다음과 같은 정보가 보일 것이다. java-8-openjdk-amd64가 디렉토리임을 알수 있다. 따라서 java 홈 디렉토리는 /usr/lib/jvm/java-8-openjdk-amd64가 되는 것이다.


-rw-r--r--   1 root root 2600  4월 28 03:42 .java-1.8.0-openjdk-amd64.jinfo

lrwxrwxrwx   1 root root   20  4월 28 03:42 java-1.8.0-openjdk-amd64 -> java-8-openjdk-amd64/

drwxr-xr-x   7 root root 4096  5월 11 15:56 java-8-openjdk-amd64/


③은 apache 웹 서버가 톰캣에게 실행을 넘길 때 톰캣을 지칭할 이름이다. 이 이름은 임의로 원하는대로 수정을 하면되는데 기본적으로는 ajp13_worker로 되어 있다. 이 이름을 그대로 사용한다면 여기까지가 workers.properties에 대한 설정 작업은 끝났다. 그러면 다음과 같은 형태가 될 것이다.


workers.tomcat_home=/usr/share/tomcat8

workers.java_home=/usr/lib/jvm/java-8-openjdk-amd64

worker.list=ajp13_worker


그런데 만일 ajp13_worker를 임의의 이름으로 변경한다면 workers.properties에서 ajp13_worker라는 이름도 모두 바꾸어 주어야 한다. 예를 들어 아래에서 ajp13_worker를 임의로 변경한 이름과 동일한 이름으로 고쳐주어야 한다.


worker.ajp13_worker.port=8009 

worker.ajp13_worker.host=localhost ⇒ 톰캣이 설치되어 있는 곳의 IP이다.

worker.ajp13_worker.type=ajp13


이제 apache 가상 호스트를 위한 설정을 할 차례이다. 

/etc/apache2/sites-available으로 이동해서 000-default.conf를 여기서 사용하게 될 도메인 이름으로 복사본을 만들고 필요한 환경설정을 한다. 아래와 같이


# cp 000-default.conf  joekog.iptime.org.conf

# vi joekog.iptime.org.conf


위 파일을 열어서 아래의 내용을 찾아 위에서 가정했던 해당 정보대로 입력한다.


      9         ServerName joekog.iptime.org 

     10 

     11         ServerAdmin webmaster@localhost

     12         DocumentRoot /home/joekog/www/ROOT


     20         ErrorLog ${APACHE_LOG_DIR}/joekog.iptime.org-error.log

     21         CustomLog ${APACHE_LOG_DIR}/joekog.iptime.org-access.log combined


그리고 이 파일의 끝 부분 </VirtualHost> 위에 다음 내용을 작성해서 jsp에 대해서는 tomcat(위에서 별칭으로 정한 ajp13_worker)이 처리한다는 것을 명시한다.


         JKMount /* ajp13_worker

</VirtualHost>


여기서 JKMount /* ajp13_worker로 표현한 것은 현재의 웹 root(/home/joekog/www/ROOT/) 아래에 있는 모든 파일을 ajp13_worker(톰캣)이 담당하게 된다는 뜻이다.

그런데 이 웹 root상에 .php가 있다면 이 파일도 톰캣이 담당하게 될텐데 톰캣은 php를 실행할수가 없게 된다. 따라서 php 소스 자체를 웹 브라우저에 출력하게 될 것이다.

그런데 만일 JKMount /*.jsp ajp13_worker로 한다면 .jsp 파일만 톰캣이 맡고 나머지는 아파치가 실행하게 되므로 동일 웹 루트상에 .php가 있더라도 정상적으로 php를 실행한 결과를 보여주게 될 것이다.

그런데 문제는 JKMount /*.jsp ajp13_worker 이렇게 하게되면 .jsp, .php, .html이 정상적으로 실행이 되지만 Java Servlet은 이 상태에서는 실행할수 없게 된다.

따라서 jsp와 php가 같은 경로상에서 실행되어야 할 경우는 없을 것이므로 JKMount /* ajp13_worker로 설정해서 .jsp와 Java Servlet도 정상적으로 실행되게 설정하면 될것이다.

참고로 Java Servlet의 .class 파일이 위치하는 경로는 웹 root 아래 /WEB-INF/classes/해당패키지명/ 아래에 위치하게 된다. 만일 해당 서블릿의 패키지 명이 com.joe.test라고 한다면 /WEB-INF/classes/com/joe/test/ 이 위치에 *.class 파일이 위치하게 될 것이다.


다음으로 할 것은 apache의 가상 호스트 설정에 대한 설정을 해 주어야 한다. 


# vi /etc/apache2/apache2.conf


아래 파일을 열어서 다음 내용을 추가해 준다.


    182 <Directory /home/joekog/www/ROOT/>

    183         Options FollowSymLinks

    184         AllowOverride None

    185         Require all granted 

    186 </Directory>


이제 톰캣에 대한 설정을 할 차례이다. 아래 파일을 열어서 


<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 이 부분이 주석되어 있다면 주석을 해제하고 내용이 없다면 이 내용을 추가해준다.


# /etc/tomcat8/server.xml


이상을 작업을 하면 apache와 톰캣에서의 연동을 위한 설정은 끝이 났다. 그런데 여기서 우리는 joekog.iptime.org/joe.php라는 도메인으로 접속시 apahce를 통해 /home/joekog/www/ROOT/ 이 경로에 있는 joe.php를 실행할 것이고 동일하게  joekog.iptime.org/hi.jsp로 접속시에는 tomcat을 통해서 /home/joekog/www/ROOT/ 이 경로에 있는 hi.jsp를 실행해야 하므로 아파치 뿐만 아니라 톰캣에 대해서도 가상 호스트(Virtual Host)를 설정해 주어야 한다. 위의 server.xml을 열어서 아래 내용을 기존에 있던 <Host name... </Host> 아래 적당한 곳에 추가해 준다.


    161       <Host name="joekog.iptime.org"  appBase="/home/joekog/www"

    162             unpackWARs="true" autoDeploy="true">

    163 

    164         <!-- SingleSignOn valve, share authentication between web applications

    165              Documentation at: /docs/config/valve.html -->

    166         <!--

    167         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

    168         -->

    169 

    170         <!-- Access log processes all example.

    171              Documentation at: /docs/config/valve.html

    172              Note: The pattern used is equivalent to using pattern="common" -->

    173         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

    174                prefix="joekog.iptime.org_access_log" suffix=".txt"

    175                pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    176       </Host>


이제 아파치와 톰캣을 재시작한다.


# service apache2 restart

# service tomcat8 restart


그리고 /home/joekog/www/ROOT/ 이 경로에 index.html, hi.jsp, joe.php 파일을 적당한 내용으로 작성해서 웹 브라우저에서 접속해 본다.


http://joekog.iptime.org/hi.jsp

http://joekog.iptime.org/joe.php

http://joekog.iptime.org/index.html


이제 톰캣의 기본 포트인 8080 없이 웹 브라우저에서 접속해서 필요를 따라 혹은 apache 혹은 tomcat이 실행되어 위의 3종류의 파일이 정상적으로 실행되고 웹 브라우저에서 보이게 될 것이다.

Apache - Tomcat의 연동과 Apache Virtual Host, Tomcat Virtual Host 등이 같이 엮이어 돌아가야 되는 상황이라 사실상 처음 하는 사람에게는 많이 복잡한 내용이다.

이상으로 아파치 톰캣 연동을 마무리하게 되었다. 휴~;;;



Tomcat 가상 호스트(Virtual Host) 구축 방법


서버에 tomcat이 설치되어 있을 경우 Java/JSP를 이용한 웹서비스를 개발할 때도 apache의 경우와 같이 하나의 서버에 여러개의 도메인으로 접속시 각각의 해당 웹 서비스가 실행되도록 가상 호스트를 만들수 있다.


Ubutnu 16.04, Tomcat 8.0의 상황에서 다음 경로에 있는 server.xml을 가상 호스트 환경으로 변경해 준다.


vi /etc/tomcat8/server.xml


위의 파일을 열어 보면 다음과 같은 내용이 있을 것이다.


    128       <Host name="localhost"  appBase="webapps"

    129             unpackWARs="true" autoDeploy="true">

    130 

    131         <!-- SingleSignOn valve, share authentication between web applications

    132              Documentation at: /docs/config/valve.html -->

    133         <!--

    134         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

    135         -->

    136 

    137         <!-- Access log processes all example.

    138              Documentation at: /docs/config/valve.html

    139              Note: The pattern used is equivalent to using pattern="common" -->

    140         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

    141                prefix="localhost_access_log" suffix=".txt"

    142                pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    143       </Host>


이 상황에서 2개의 도메인에 대한 가상 호스트를 만들기로 해 본다.

joekog.iptime.org 

fullstack.iptime.org

이상의 2개의 도메인으로 동일 서버(Ubuntu 16.04, Tomcat 8이 설치된 서버)로 접속해 돌 때

joekog.iptime.org  ⇒ /home/joekog/www의 웹 서비스가 실행되고

fullstack.iptime.org  ⇒ /home/fullstack/www의 웹 서비스가 실행되도록 Tomcat virtual host(톰캣 가상호스트)를 설정해 보고자 한다.


위에서 열었던 server.xml의 위의 <Host name... 아랫쪽에 아래와 같이 도메인 관련정보를 추가해 준다.


    145       <Host name="joekog.iptime.org"  appBase="/home/joekog/www"

    146             unpackWARs="true" autoDeploy="true">

    147 

    148         <!-- SingleSignOn valve, share authentication between web applications

    149              Documentation at: /docs/config/valve.html -->

    150         <!--

    151         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

    152         -->

    153 

    154         <!-- Access log processes all example.

    155              Documentation at: /docs/config/valve.html

    156              Note: The pattern used is equivalent to using pattern="common" -->

    157         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

    158                prefix="joekog.iptime.org_access_log" suffix=".txt"

    159                pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    160       </Host>

    161 

    162       <Host name="fullstack.iptime.org"  appBase="/home/fullstack/www"

    163             unpackWARs="true" autoDeploy="true">

    164 

    165         <!-- SingleSignOn valve, share authentication between web applications

    166              Documentation at: /docs/config/valve.html -->

    167         <!--

    168         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

    169         -->

    170 

    171         <!-- Access log processes all example.

    172              Documentation at: /docs/config/valve.html

    173              Note: The pattern used is equivalent to using pattern="common" -->

    174         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

    175                prefix="fullstack.iptime.org_access_log" suffix=".txt"

    176                pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    177       </Host>



위 파일을 저장한 후 tomcat을 재시작한다.


# service tomcat8 restart


이제 각각의 경로에 해당하는 웹 서비스를 구현하면 된다.


joekog.iptime.org를 위해 joekog에 대한 사용자를 아래와 같이 추가해 준다.


# adduser joekog


위의 사용자를 추가하고 나면 /home/joekog라는 디렉토리가 생성되었을 것이다. 이후 아래 디렉토리 경로를 생성해 준다.


/home/joekog/www/ROOT/


이때 주의할 것은 server.xml에 appBase="/home/joekog/www"와 같이 설정되어 있지만 기본적으로 tomcat은 이 경로 아래의 ROOT를 웹의 루트 디렉토리로 인식하기 때문에 index.jsp와 같은 파일을 /home/joekog/www/index.jsp와 같이 위치시키면 파일을 찾을수 없다는 에러를 발생시킨다. 반드시 ROOT 디렉토리를 생성 후 /home/joekog/www/ROOT/index.jsp와 같이 웹 서비스 실행 파일을 위치시켜야 한다.


이제 웹 브라우저에서 http://joekog.iptime.org:8080/index.jsp로 접속하면 정상적으로 실행이 된다.

fullstack.iptime.org에 대한 것도 동일한 방법으로 테스트해 볼수 있다.


사용자 추가, IpTIME에서의 DDNS 설정 및 apache에 대한 가상 호스트 구축 방법은 아래 링크를 참조한다.

아파치 가상 호스트(Virtual host)를 이용한 하나의 서버에 여러개의 웹 서비스 구현하기




Ubuntu 16.04에서 SFTP 접속 포트 변경하기


SFTP(Secure File Transfer Protocol)의 디폴트 접속 포트는 22번이다. SFTP는 SSH 접속시 사용하는 포트를 사용하므로 SSH의 설정 값에서 원하는 포트를 변경하는 작업을 하면된다.


Ubuntu의 경우 아래 경로의 파일에서 접속 포트의 설정 값을 변경할수 있다. vi로 아래 파일을 연다.

만일 /etc/ssh/ 경로에서 sshd_config 파일이 보이지 않는다면, 즉 ssh_config는 있는데 sshd_config 파일이 없다면 아래 패키지를 설치해 주어야 한다.


# apt-get install openssh-server


# vi /etc/ssh/sshd_config


파일을 열어보면 다음 항목이 있을 것이다.


Port 22


이 항목의 값을 원하는 숫자로 설정하고 파일을 저장한다.

변경된 내용을 적용하기 위해서 ssh를 재시작해 준다.


# service ssh restart


이제부터 FileZilla의 SFTP로 접속시 포트 번호를 변경된 값으로 서버로 접속이 가능해진다.

동시에 PuTTY를 이용해서 SSH 접속시에도 포트 번호는 여기서 변경한 값으로 접속해야 된다.



Ubuntu 16.04에서 vsftpd를 이용하여 FTP 접속 포트 변경하기


FTP의 디폴트 접속 포트는 21번이다. FTP 자체가 보안상 약점이 있는데 포트 번호가 21이라는 것까지 기본적으로 알려진 정보이다 보니 FTP의 기본 포트 21번을 다른 포트로 변경하는 작업은 보안상의 기본적인 작업이 되겠다. 물론 FTP보다는 SFTP를 사용해야겠지만 아무튼...


전제조건으로 vsftpd가 설치되어있다고 가정한다. 만일 설치되지 않았다면


# apt-get install vsftpd로 해당 패키지를 설치해야 한다.


Ubuntu의 경우 vsftpd의 환경 설정 파일은 아래 경로에 있다. 이를 vi로 열어서 특정 설정 값을 변경한다.


# vi /etc/vsftpd.conf


파일을 열어보면 listen=NO라는 항목이 있을텐데 그 아랫쪽에 다음 내용을 추가해 준다.


listen_port=1234 (원하는 포트 번호로 설정)


이때 listen=YES로 하면 FTP 접속이 되지않는다. listen의 값은 NO로 해두어야 한다.

이상의 작업이 끝났으면 파일을 저장하고 vsftpd를 재실행해 준다.


# service vsftpd restart


이제부터 FTP 접속은 21이 아닌 1234로 접속이 가능해 진다.




하나의 서버(하나의 IP)에 여러 개의 도메인이 접속시 각 해당 웹 서비스가 실행되게 하는 가상 호스트(Virtual Host)에 대해


하나의 웹 서버가 있을 경우(당연히 이 서버에 하나의 IP)가 할당되어 있을 것인데 이 웹 서버에 aaa.bbb.com, ccc.ddd.co.kr, eee.fff.org 등 여러 개의 도메인으로부터 접속해 들어올때 각각에 해당하는 웹 서비스가 실행되도록 할려면 가상 호스트(Virtual Host)를 적용해서 원하는 기능을 구현해 낼수 있다.


이 실험을 테스트한 상황(혹은 이를 위해 필요한 조건)

 -. Windows 10에 VirtualBox를 통해 Ubuntu 16.04 설치

 -. VirtualBox의 Ubuntu 서버에 apache2 설치

 -. VirtualBox의 Ubuntu 서버에 Php 7.0 설치

 -. 지금은 가상 호스트가 정상적으로 작동하는 것이 목적이므로 DB 연결까지 하지 않을 것이므로 MySQL은 설치하지 않음

 -. VirtualBox에 설치된 Ubuntu의 IP를 ipTIME 공유기에서 Static IP로 고정 할당

 -. ipTIME의 관리자 모드에서 '고급 설정' - 'NAT/라워 관리' - '포트포워드 설정'을 통해 외부의 80 포트로 들어오는 연결을 VirtualBox의 Ubuntu 16.04의 IP(위에서 Static으로 할당한 IP)로 포워딩 되도록 설정

 -. ipTIME의 DDNS 기능을 이용하여 2개의 도메인 네임을 생성하면서 각각의 해당 웹 서비스를 선택해서 실행

여기서는 ipTIME의 관리자 모드로 집입해서 '고급 설정' - '특수 기능' - 'DDNS 설정'을 이용해 아래와 같이 2개의 DDNS를 번갈아 설정하면서 Ubuntu에 설정한 2개의 가상 호스트로의 접근을 테스트 할 것이다.


fullstack.iptime.org  ⇒ VirtualBox Ubuntu 16.04에 있는 /home/fullstack/www/html/joe.php를 실행

joekog.iptime.org  ⇒  VirtualBox Ubuntu 16.04에 있는 /home/joekog/www/index.php를 실행


위와 같이 2개의 도메인이 동일한 서버(여기서는 VirtualBox Ubuntu 16.04)에 접속시 각각 서로 다른 웹 서비스가 실행되도록 구현하고자 한다. 


먼저 아래와 같이 사용자를 등록한다


root@gsoft:/home# adduser joekog

'joekog' 사용자를 추가 중...

새 그룹 'joekog' (1005) 추가 ...

새 사용자 'joekog' (1005) 을(를) 그룹 'joekog' (으)로 추가 ...

'/home/joekog' 홈 디렉터리를 생성하는 중...

'/etc/skel'에서 파일들을 복사하는 중...

새 UNIX 암호 입력: 

새 UNIX 암호 재입력: 

passwd: 암호를 성공적으로 업데이트했습니다

joekog의 사용자의 정보를 바꿉니다

새로운 값을 넣거나, 기본값을 원하시면 엔터를 치세요

이름 []: joekog

방 번호 []: 

직장 전화번호 []: 

집 전화번호 []: 

기타 []: 

정보가 올바릅니까? [Y/n] Y


이렇게 하면 /hoem/joekog가 생성되었을 것이다.

아래와 같이 joekog의 웹 서비스를 위한 joekog 사용자에 대한 웹 루트 경로를 생성한다.


root@gsoft:/home# cd joekog

root@gsoft:/home/joekog# ls -l

합계 32

drwxr-xr-x 2 joekog joekog 4096  5월 17 17:51 ./

drwxr-xr-x 8 root   root   4096  5월 17 17:51 ../

-rw-r--r-- 1 joekog joekog  220  5월 17 17:51 .bash_logout

-rw-r--r-- 1 joekog joekog 3771  5월 17 17:51 .bashrc

-rw-r--r-- 1 joekog joekog 8980  5월 17 17:51 examples.desktop

-rw-r--r-- 1 joekog joekog  655  5월 17 17:51 .profile

root@gsoft:/home/joekog# mkdir www

root@gsoft:/home/joekog# cd www

root@gsoft:/home/joekog/www# pwd

/home/joekog/www


이 위치에 php 파일을 하나 만들어 후에 http://joekog.iptime.org/hi.php와 같은 식으로 접속하고자 한다.

생성한 /home/joekog/www/ 위치에 vi hi.php로 다음과 같이 코딩한다.


<?php

        echo "<h1>Hi~~ This is joekog.iptime.org's web root.</h1>";

        echo "Web Root : /home/joekog/www/";

?>


# cd /etc/apache2/sites-available로 이동하면 000-default.conf라는 이름의 아파치 설정 파일이 있다.

이 파일 안에 보면 아래와 같으 항목이 있다. 


DocumentRoot /var/www/html


이 항목이 뜻하는 것은 아파치의 디폴트 웹 루트가 /var/www/html이라는 뜻이다. 

즉 http://joekog.iptime.org를 실행하면 /var/www/html/index.html이 실행되는 디폴트 웹 루트라는 것이다.

우리는 /home/joekog/www/을 웹 루트로 만들고 이 위치에 .html, .php 등을 위치시키고 이 웹 서비스를 실행시키고자 하는 것이다.

따라서 디폴트 웹 루트가 실행되지 않게 할려면 


# cd /etc/apache2/sites-enabled/로 이동해서 ls -l로 파일 목록을 표시해 보면 다음과 같은 심볼릭 링크 파일이 보일 것이다.


000-default.conf -> ../sites-available/000-default.conf


이 파일을 다음 명령을 이용해서 없애준다.


# a2dissite 000-default

Site 000-default disabled.

To activate the new configuration, you need to run:

  service apache2 reload


# service apache2 reload

# service apache2 restart


그러면 /etc/apache2/sites-enabled/에서 000-default.conf -> ../sites-available/000-default.conf가 없어 졌을 것이다.

/etc/apache2/sites-available/로 이동해서


# cp 000-default.conf joekog.iptime.org.conf


해당 경로에 joekog.iptime.org.conf 파일이 생겼을 것이다. 이제 /home/joekog/www/을 웹 루트로 만들도록 설정을 변경한다.


# vi joekog.iptime.org.conf 로 내용을 열면 아래와 같이 되어 있을 것이다.


<VirtualHost *:80>

        # The ServerName directive sets the request scheme, hostname and port that

        # the server uses to identify itself. This is used when creating

        # redirection URLs. In the context of virtual hosts, the ServerName

        # specifies what hostname must appear in the request's Host: header to

        # match this virtual host. For the default virtual host (this file) this

        # value is not decisive as it is used as a last resort host regardless.

        # However, you must set it for any further virtual host explicitly.

        #ServerName www.example.com


        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html


        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,

        # error, crit, alert, emerg.

        # It is also possible to configure the loglevel for particular

        # modules, e.g.

        #LogLevel info ssl:warn


        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined


        # For most configuration files from conf-available/, which are

        # enabled or disabled at a global level, it is possible to

        # include a line for only one particular virtual host. For example the

        # following line enables the CGI configuration for this host only

        # after it has been globally disabled with "a2disconf".

        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet


이 파일의 내용을 다음과 같이 변경해 준다.


<VirtualHost *:80>

        # The ServerName directive sets the request scheme, hostname and port that

        # the server uses to identify itself. This is used when creating

        # redirection URLs. In the context of virtual hosts, the ServerName

        # specifies what hostname must appear in the request's Host: header to

        # match this virtual host. For the default virtual host (this file) this

        # value is not decisive as it is used as a last resort host regardless.

        # However, you must set it for any further virtual host explicitly.

        ServerName joekog.iptime.org


        ServerAdmin webmaster@localhost

        DocumentRoot /home/joekog/www


        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,

        # error, crit, alert, emerg.

        # It is also possible to configure the loglevel for particular

        # modules, e.g.

        #LogLevel info ssl:warn


        ErrorLog ${APACHE_LOG_DIR}/joekog.iptime.org-error.log

        CustomLog ${APACHE_LOG_DIR}/joekog.iptime.org-access.log combined


        # For most configuration files from conf-available/, which are

        # enabled or disabled at a global level, it is possible to

        # include a line for only one particular virtual host. For example the

        # following line enables the CGI configuration for this host only

        # after it has been globally disabled with "a2disconf".

        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet


수정한 파일의 내용을 저장하고 빠져나온다. 다음 명령을 통해서 joekog.iptime.org라는 도메인을 아파치에 등록한다.


# a2ensite joekog.iptime.org

Enabling site joekog.iptime.org.

To activate the new configuration, you need to run:

  service apache2 reload


이렇게하고서 /etc/apache2/sites-enabled/로 이동해 보면 다음과 같이 심볼릭 파일이 생성되었을 것이다.


joekog.iptime.org.conf -> ../sites-available/joekog.iptime.org.conf


그림과 같이 iptime 관리자 페이지로 접속해서 DDNS 설정 항목에서 '삭제'버튼을 눌러 기존 있던 DDNS를 삭제한다. 만일 처음부터 DDNS를 생성하지 않았다면 이 과정이 필요 없다.




아래 그림과 같이 우리가 원하는 도메인으로 joekog와 사용자 ID에 적당한 이메일 주소를 적고 'DDNS 등록' 버튼을 눌러서 생성한다.




아래 그림과 같이 "정상적으로 등록"이라는 메시지가 보이면 이 DDNS가 활성화 되기까지는 1-2분 정도의 시간이 소요되는 것 같다. 만일 "정상적으로 등록"이라는 항목에 이미 사용중인 DDNS라는 메시지 등이 보인다면 다른 이름의 DDNS를 등록해야 한다. 이럴 경우 위의 설정들을 모두 다른 이름의 DDNS에 맞게 고쳐야 한다.

따라서 테스트가 번거롭지 않을려면 ipTime에 먼저 원하는 DDNS를 등록해 보고 사용가능한지부터 확인하는 것이 팁이 될 것이다.




/etc/apache2/로 이동해서 apache2.conf파일의 내용을 편집한다. 여기서 /home/joekog/www에 대한 권한을 설정해 주지 않으면 웹 브라우저에서 http://joekog.iptime.org/hi.php로 접속했을 때 '웹 사이트 표시를 거부했다'는 식의 권한 관련 화면이 브라우저 뜨고 해당 웹 페이지가 실행되지 않는다.


# vi /etc/apache2/apache2.conf를 열어서 다음과 같은 정보가 보이는 곳의 아랫쪽에


<Directory />

        Options FollowSymLinks

        AllowOverride None

        Require all denied

</Directory>


<Directory /usr/share>

        AllowOverride None

        Require all granted

</Directory>


<Directory /var/www/>

        Options Indexes FollowSymLinks

        AllowOverride None

        Require all granted

</Directory>


다음과 같이 설정 값을 추가해 준다.


<Directory /home/joekog/www/>

        Options Indexes FollowSymLinks

        AllowOverride None

        Require all granted

</Directory>


이상의 모든 과정을 마친 후 아파치를 재시작해 주어야 한다.


# service apache2 restart


이제 웹 브라우저에서 


http://joekog.iptime.org로 접속하면 hi.php의 아래 내용이 실행된 웹 페이지를 브라우저에서 확인할수 있을 것이다.


<?php

echo "<h1>Hi~~ This is joekog.iptime.org's web root.</h1>";

echo "Web Root : /home/joekog/www/";

?>


이번에는 fullstack.iptime.org에 대해서 작업을 할텐데 joekog에 대해 했던 동일한 작업을 그대로 해 준 후 ipTIME의 DDNS 설정을 fullstack.iptime.or로 변경 한 후 웹 브라우저에서 http://fullstack.iptime.org를 실행하면 이번에는 /home/fullstack/www/html/joe.php의 내용이 실행된 웹 페이지가 뜨게 될것이다. 이때 서로 다른 웹 페이지임을 구분하기 위해서 joe.php의 내용을 hi.php와는 다른 내용으로 작성하면 가상 호스트의 작동이 정상적인지를 확인할수 있을 것이다.



Ubuntu에서 Symbolic link 생성시 다음과 같은 에러가 발생하는 경우가 있다.


"그런 파일이나 디렉토리가 없습니다."

No such file or directory


심볼릭 링크로 정상적으로 해당 디렉토리와 심볼릭 파일이 생성되어 ls 명령어로 정상적으로 표시가 됨에도 불구하고 해당 파일의 내용을 볼려고 cat 등으로 확인하고자 하면 위와 같은 에러가 발생한다. 분명히 해당 파일이 있음에도 불구하고...


원인은 Symbolic link는 절대 경로로 생성해야 한다. 상대경로로 생성시 위와 같은 현상이 나타났다.




Linux(여기서는 Ubuntu 기준) 서버에 PuTTY를 이용한 SSH로 접속하거나 FileZilla와 같은 FTP로 접속을 하고자 할때 원격에서 FTP, SSH로 접속이 가능하도록 리눅스를 어떻게 구성할것인지에 대해 정리하고자 한다.


Ubuntu Server 버전에서는 기본적으로 SSH로 접속이 가능한지는 테스트해 보지 않아서 잘 모르겠으나(아마도 되는 것으로...) Ubuntu Desktop 버전에서는 최초 설치 상태에서 FTP(FileZilla)나 SSH(PuTTY)로 접속을 시도하면 당연히 연결 실패가 된다.

다음 과정을 통해서 원격에서 접속이 가능하도록 설정해 보자.

기본적인 전제로 root 계정이 생성되어 있고 일반 유저 계정으로 joe라는 계정이 생성되어 있다고 가정한다.

그리고 SFTP로 접속할수 있도록 설정할 것이다.



1. Ubuntu의 기본 FTP 서버용 패키지 설치

# apt-get install vsftpd


⇒ vsftpd만 설치했을 경우는 FileZilla에서 root가 아닌 일반 사용자 계정으로는 접속이 가능하다. 단 SFTP로는 안되고 FTP로 port 21번으로 접속하면 접속이 된다. 참고로 SFTP는 디폴트 포트번호가 22번이다. vsftpd의 다양한 설정에 대해서는 여기서는 생략. vsftpd의 환경 설정 경로는 /etc/vsftpd.conf 파일을 vi로 열어서 환경 설정을 통한 기능들을 조정할 수 있다.


2. SSH 서버 설치

# apt-get install openssh-server


⇒ 여기까지 실행하면 root 계정이 아닌 일반 계정에서는 SFTP로 접속이 가능해 진다.


3. root 계정으로도 SFTP 접속 가능하도록 설정하기

# vi /etc/ssh/sshd_config


⇒ 내용 중에서 PermitRootLogin의 값이 prohibit-password로 되어 있는 것을 yes로 다음과 같이 수정


PermitRootLogin yes


파일 저장 후 ssh restart하기


# service ssh restart


이후부터는 SFTP(port 22)로 정상적으로 접속이 가능해 진다.


이상의 FileZilla의 경우도 동일하게 putty에서도 동일하다.

putty는 접속 포트가 22이다.


그런데 SFTP나 SSH접속(putty)을 root 계정으로 굳이 접속 가능하도록 설정하는 것은 보안상 바람직한 것은 아니다. 왜냐하면 일반 계정으로 접속해서 su command를 이용하여 슈퍼유저로 로그인 해서 사용할수 있기 때문이다. 

물론 이때는 root계정의 비번을 당연히 일반 계정의 비번과 다르게 해야겠지만...




동일 PC의 Windows에서 동일 PC에 설치된 Vitrualbox의 Ubuntu 간에 ping이 안될때


※ 전제조건 : 동일 Windows PC상에 Virtualbox가 설치되어 있다고 가정한다.


소켓통신 프로그램을 개발하거나 이더넷 통신... 등등을 개발하다보면 실제 장비와 하기 전에 테스트 차원에서 Virtualbox의 리눅스와 PC간에 통신 프로그램을 개발하는 경우들이 있다.

이때 통신이 정상적인 상태인지를 체크하기 위해 보통은 ping으로 테스트하는 경우가 있다.


아래와 같이 리눅스의 터미널 창에서 PC쪽으로 ping을 날리거나 반대로 PC의 DOS창(커맨더 창)에서 Virtualbox 쪽으로 ping을 날림을 통해서 네트워크 연결 상태를 체크하게 된다.


ping 192.168.211.105


이러한 상황에서 

① 양방향 모두 ping 전송 실패하거나

② PC에서 Virtualbox 쪽으로는 가능하나 그 반대는 안되는 경우

에 대해서 살펴본다.


다른 네트워크 설정 상태가 정상임에도 위 ①의 경우가 발생한다면 우선적으로 Virtualbox의 네트워크 설정 상태를 NAT에서 브릿지 어댑터로 변경해 주어야 한다.

아래 그림과 같이 설정 - 네트워크 - 어댑터1 - 다음에 연결 항목에 있는 NAT를 브릿지 어댑터로 변경한 후 Virtualbox를 재시작한다.



위 ②번의 경우는 아마도 리눅스(여기서는 Ubuntu)의 네트워크 환경 설정 중에서 gateway를 잘못 설정했을 경우에 발생하는 현상이다. 그러나 네트워크의 경우는 워낙 다양한 변수들이 있기에 항상 정답이 될수는 없다.

이 경우 gateway를 올바로 설정하기 위해서는 우선 gateway의 ip 주소를 알아야 한다.

PC의 DOS창을 열어서 ipconfig 명령을 실행하면 아래와 같은 정보를 얻었다면 여기서 "기본 게이트웨이"에 있는 ip를 Ubuntu의 gateway로 설정해 주면 된다.


   연결별 DNS 접미사. . . . :

   링크-로컬 IPv6 주소 . . . . : fe80::84aa:fa63:4a5f:23a2%12

   IPv4 주소 . . . . . . . . . : 192.168.219.186

   서브넷 마스크 . . . . . . . : 255.255.255.0

   기본 게이트웨이 . . . . . . : 192.168.219.1


/etc/network/ 디렉토리 아래에 interfaces라는 파일을 열어서

아래 예시와 같이 gateway의 값을 지정한 후 파일을 저장한다.


auto enp0s3

iface enp0s3 inet static

address 192.168.219.115

netmask 255.255.255.0

gateway 192.168.219.1

dns-nameserver 8.8.8.8 8.8.4.4


이후 다음 명령어로 네트워크 장비를 재시작한다.


ip addr flush enp0s3 && /etc/init.d/networking restart



임베디드 장비이든 혹은 웹 서버이든 IP를 고정해야 할 경우들이 있다. 

DHCP로 IP를 자동 할당 받는 경우 IP가 고정이 아닌 유동적으로 바뀔수가 있기 때문에 고정 IP(static IP) 설정하는 법은 여러 모로 필요한 작업이다.

본 포스트에서는 Linux Ubuntu 상에서 IP를 어떻게 고정으로 할당할수 있을 것인지를 정리하고자 한다.

IP를 고정시키기 위해서는 다음의 정보가 필요하다.


-. 고정시킬 IP Address

-. Net mask

-. Default gateway

-. DNS Server


여기서 외부로 나갈 필요가 없는 상황이라면 즉 인터넷을 할 필요가 없이 임베디드 장비와 PC간의 통신만 되면 된다거나 아무튼 외부 통신을 필요로 하지 않는다면 gateway 정보나 DNS server 정보는 없어도 된다.


우선 현재의 네트워크 자원들에 대해 확인부터 해 보자.


# ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

    link/ether 08:00:27:ff:a4:58 brd ff:ff:ff:ff:ff:ff


# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 08:00:27:ff:a4:58 brd ff:ff:ff:ff:ff:ff

    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3

       valid_lft 83702sec preferred_lft 83702sec

    inet6 fe80::c33f:ad86:8225:3597/64 scope link 

       valid_lft forever preferred_lft forever


위의 정보를 보면 2개의 네트워크 interface가 보인다. 하나는 lo인데 이는 loop back으로 자기 자신을 나타내는 interface이다. 

우리가 고정 IP를 설정할 네트워크는 enp0s3로 명명되어진 이 interface이다.

link/ether는 이 장비가 이더넷 장비라는 뜻이고 IP 주소는 10.0.2.15이다.

참고로 위의 정보는 Virtual Box에서 실행되는 Ubuntu이다.

보통 공유기 하위에 물려 있는 경우라면 192.168.x.x와 같은 형태가 될 것이다.


이제 IP정보를 설정해 보자. 아래 파일을 열어 보면 대체로 이런 정보가 들어 있다.


# vi /etc/network/interfaces


# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo

iface lo inet loopback


위의 파일 내용에 고정 IP 할당에 대한 정보를 아래와같이 입력하고 파일을 저장한다.


auto enp0s3

iface enp0s3 inet static

address 192.168.0.77

netmastk 255.255.255.0

gateway 10.0.2.2

dns-nameserver 8.8.8.8 8.8.4.4


gateway는 현재의 gateway를 그대로 사용했고 dns-nameserver는 구글 것을 사용했다.

현재의 gateway 정보를 알려면 다음 명령으로 확인할 수 있다.


root@joe-VirtualBox:/etc/network# ip route

default via 10.0.2.2 dev enp0s3  proto static  metric 100 

10.0.2.0/24 dev enp0s3  proto kernel  scope link  src 10.0.2.15  metric 100 

169.254.0.0/16 dev enp0s3  scope link  metric 1000 


현재의 gateway(인터넷을 할수 있는 출입문, 통신이 외부로 나갈수 있는 출입문 IP)정보는

default via 10.0.2.2 dev enp0s3로 되어 있는 10.0.2.2이다.

아래는 또 다른 경우에 대한 정보이고 192.168.0.1이 현재의 gateway이다.


root@localhost:/etc/network# ip route

default via 192.168.0.1 dev eth0  metric 100

169.254.0.0/16 dev eth0  scope link  metric 1000

192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.88


위의 정보만으로 네임서버가 안된다면 다음 정보를 추가하도록 하자.

네임서버란 www.google.com, www.naver.com과 같이 숫자로 된 IP가 아닌 사람이 쉽게 파악할수 있는 형태의 IP 지정 방식이다.

아래의 경로에 tail이라는 파일을 생성해서(만일 없다면 새로 만든다) nameserver 8.8.8.8을 입력하고 파일을 저장한다.


# vi /etc/resolvconf/resolv.conf.d/tail

nameserver 8.8.8.8


이상으로 설정을 완료되었고 네트워크 장비를 재시작 한다.


ip addr flush enp0s3 && systemctl restart networking.service


만일 구버전 리눅스라면 위의 명령이 실행되지 않을수 있다. 그럴 경우는 아래와 같이 하자.


# ip addr flush enp0s3 && /etc/init.d/networking restart


여기까지가 Ubuntu 시스템 상에서의 고정 IP 설정하는 법이다.

정상적으로 설정이 되었다면 터미널 창에서 ping이 정상적으로 송수신될 것이다.


# ping www.google.com


위 명령이 정상적으로 수행된다면 IP 설정과 nameserver 설정이 제대로 된 것이다.

그런데 ping 172.217.24.4과 같이 IP로는 실행되나 도메인 네임으로는 수행되지 않는다면 이건 nameserver 설정이 잘못되었다는 뜻이다.



리눅스 Shell command를 이용한 Socket 통신하기


리눅스의 cat 명령어는 쓰임새가 다양하다. 해보진 않았지만 cat을 이용해서 리눅스 시스템을 백업도 가능한듯 하다.

리눅스에 있는 kkk.txt라는 파일의 내용을 Socket을 이용해서 내보낼수 있는가?

netcat(혹은 줄여서 nc)와의 조합을 통해서 가능하다.

아래와 같이


cat kkk.txt | nc 192.168.0.7 8801


여기서 192.168.0.7은 서버 소켓의 IP 주소이고, 8801은 서버 소켓의 포트번호이다.

혹은 간단한 문자열 정도를 보낼려면 이렇게도 가능하다.


echo "This string is from Linux" | netcat 192.168.0.7 8801


통신상태 확인을 위해 간단히 사용할수 있을 것이다.



+ Recent posts