요즘 리눅스 서버를 계속 세팅하고 있었다. 나도 리눅스에 참 익숙하지 않았는데 어느 덧 서버 세팅을 내가 나서서 하고 있게 되었다. 그런데 세팅하다보면 참 검색을 많이하게 된다. 그러면서 또 배우게 되는데 어째든 이렇게 배운 것들에 대해 정리 해 볼까한다. 


 우선 리눅스 쪽을 한 번 정리하고 나서 CentOS에만 적용되는 것을 또 한 번 정리 해 볼까 한다. 리눅스 라고 했지만 대부분 서버를 관리하거나 세팅할 때 사용되는 명령어가 대부분이다. 



일부 설정의 경우 root 권한이나 sudo 를 이용해서 설정해야 한다. 


== nameserver 설정 ==

* nameserver 란 도메인을 IP 로 변경해주는 서버이다. 이런 서버는 자체적으로 구성하기도 하고 인터넷 provider의  nameserver를 사용하기도 하고 구글 DNS 같은 공개형 네임서버도 있다. 간혹 이 서비스가 설정되지 않아 DNS를 통해 접속시 에러가 발생하기도 한다. CentOS를 설치하고 yum을 사용하려고 할 때 안되는 원인중에 하나이다. 아래와 같이 설정할 수 잇다. 8.8.8.8 과 8.8.4.4 는 구글에서 제공하는 nameserver 이다. 

* /etc/resolv.conf 파일 수정

* nameserver 8.8.8.8

  nameserver 8.8.4.4


== hostname과 ip 를 연결하는 파일

* DNS Server 를 설정한다고 해도 이 파일의 우선파일가 높음

vim /etc/hosts 파일을 수정한다.

127.0.0.1   tt.co.kr

tt.co.kr 을 접속하면 127.0.0.1(다시 말해 자기자신)에 접속하게 된다. 


== nslookup ==
 * Domain 과 IP 변환을 확인하는 명령어
  * /etc/hosts 에서 변경한 것은 반영하지 않는다. 



== iptable 설정 ==

 * iptable 은 서버자체의 방화벽이자 네트워크 설정 툴이다. 

 * vim /etc/sysconfig/iptables  에서 설정할 수 있고 그냥 명령어를 통해 바로 설정할 수도 있다. 

 * 아래와 같이 설정한다. 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

 * 파일로 설정할 경우 /etc/init.d/iptables restart 로 재시작 시켜준다.



== yum ==

 * CentOS(redhat) 에 있는 패키지 설치툴이다. 이 툴의 최대 장점은 command 창에서 텍스트 모드로 설치할 수 있다는 것이다. 인터넷에서 패키지를 자동으로 다운받아 설치 할 수 있다. 

* 패키지 설치 : yum install 패키지명

* 패키지 삭제 : yum remove 패키지명

* 패키지 업데이트 : yum update 패키지명


== rpm ==

 * yum이 되지 않는 네트워크 환경이나 yum 으로 배포되지 않는 패키지의 경우 rpm 을 이용해야 한다. 

 * 설치 :  rpm -ivh 패키지명

 * 업그레이드 또는 설치를 자동으로 : rpm -Uvh 패키지명

 *  설치된 패키지 확인 :  rpm -qa | grep 패키지명 

  - rpm -qa 를 통해 설치된 패키지를 모두 확인할 수 있지만 grep 를 이용해 하나의 패키지를 


== 소유권 ==

 * 서버를 운영하다보면 소유권 문제로 서비스가 잘 동작하지 않는 문제가 많다. 경우에 따라서 로그파일을 남기는데 권한이 없어 문제가 생기는 경우가 많다. 이 때 사용한다.

chown [-R] [user][:group] target1 [target2 ..]

-R : 하위 디렉토리와 파일의 소유권 모두 변경한다. 가장 많이 사용하는 옵션이다. 

 일반적으로 apache의 사용자와 그룹은  apache.apache 이다.

그래서 


chown -R apache.apache  /home/www/homepage

   같은 식으로 이용할 수 있다. 

http://ko.wikipedia.org/wiki/Chown


== 파일, 디렉토리 권한 ==

 * 서버를 운영하다보면 파일 업로드나 스크립트 파일의 실행 때문에 많이 사용하는 명령어 중 하나이다.  단순 sh 파일일지라도 +x 옵션이 없어서 실행하지 못할 수 있다. 아래와 같은 방법으로 사용한다. 

 * chmod [options] mode[,mode] file1 [file2 ...] 

  -R: 재귀적으로 파일들과 디렉터리들의 모드들을 바꾼다.

 * chmod -R 777 /home/www/upload 

http://ko.wikipedia.org/wiki/Chmod





톰캣 설치에 대한 글을 쓴지 1년이 다 되어가는 이 시점에 톰캣 설정에 대한 글을 쓰게 되내요. 찾아보니 톰캣 6.0도 있던데. 그런데  버전이 높다고 해서 다 좋은 것은 아닌 것 같내요. 버전 6.0에 도전해 봤는데, 실패했습니다. servlet에 대한 설정이 안되어서 포기하서 톰캣 5.5에 만족하기로 했습니다.

 어째든 이번에는 servlet을 위한 톰캣 5.5 설정을 해보겠습니다. jsp의 경우 그냥 하면 되는 것 같은데 servlet을 그냥 시도해봤는데 잘 안되고 설정을 변경해야 하는 것 같군요.

 이 글은 그냥 설정에서 끝나지 않고, HelloWorld 까지 만들어 보는데 까지 해보겠습니다.

우선 servlet을 위한 설정을 해보겠습니다. \conf\web.xml ( 저의 경우 C:\tools\apm\Tomcat 5.5\conf 디렉토리 안에 있내요. 모두 자기 상황에 맞게 디렉토리를 생각하기 바랍니다. )  파일을 수정해야 합니다. 패치된 버전마다 위치가 틀리겠지만 대략 115행에 다음과 같이 주석처리가 되어 있습니다.
==================================
<!--
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
-->
=================================
여기서 주석처리 기호  <!--  과  --> 를  제거해 줍니다. (제 말을 오해해서 주석된 전체를 지우진 말아주세요.)

대략 366행 쯤에 다음과 같이 주석처리가 되어있습니다.
================================
<!--
    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
-->
==============================
여기서도 주석처리 기호  <!--  과  --> 를  제거해 줍니다.

그러면 설정을 다 되었습니다.

이 다음 이제 HelloWorld 프로그램을 만들어보겠습니다.  \webapps 폴더안에 간단히 Test 라는 폴더를 생성합니다. 이 test라는 폴더명은 자신의 구미에 맞게 써 놓아도 됩니다. 그러나 다음 부터 하는 것은 규정이기 때문에 폴더명을 고치면 안됩니다. 다시 그 안에 WEB-INF 라는 폴더를 생성합니다. 다시 그 안에 classes 이라는 폴더를 생성합니다.
 말이 어렵나요. 결론적으로 이렇게 한다면 \webapps\test\WEB-INF\classes 라는 path가 생성됩니다. 이 안 \webapps\test\WEB-INF 라는 폴더에 \webapps\ROOT\WEB-INF 안에있는  web.xml  파일을 복사해 둡니다.

(대충 눈치 채셨겠지만 내가 원하는 폴더명을 정한 후, 그 안에 일정한 규칙을 갖추어 폴더명을 정합니다. jsp의 경우 이런 복잡한게 필요 없는것 같은데 servlet은 조금 까다롭내요. 약간의 보안을 위해서 이렇게 하는 것 같군요.)




 HelloWorld프로그램의 소스는 examples까지 설치했다면 얻을 수 있습니다. 설치안한 분들을 위해 그 소스를 올립니다.
==========================================
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
===========================================
당연히 이 파일을 저장할 때는 HelloWorld.java로 적어야 합니다. 이 파일을 \webapps\test\WEB-INF\classes 안에 둡니다.
그리고 컴파일 합니다. 이 때 환경변수에 classpath가 \Tomcat 5.5\common\lib\servlet-api.jar 설정되어 있어야 합니다. 저의
경우 complile 할 때 옵션에 classpath를 설정하는 방식을 이용했습니다. 그래서
C:\programs\jdk1.5.0_12\bin\javac.exe -classpath "C:\tools\apm\Tomcat 5.5\common\lib\servlet-api.jar" "C:\tools\apm\Tomcat 5.5\webapps\MySample\WEB-INF\classes\HelloServlet.java"
라는 식으로 컴파일 합니다. (굉장히 긴니다. javac.exe가 있는 path 도 설정되어 있지 않기 때문에 이러한 방식을 이용하는데
어차피 acroeditor에서 컴파일하므로 불편한 일은 없습니다. )

이렇게 컴파일하고 나면, 이제 http://localhost:8080/test/servlet/HelloWorld 를 통해

Hello World!


라는 글을 볼수가 있습니다. 물론 tomcat이 작동하고 있어야 가능하겠죠..


다음은 수업시간에 교수님이 저를 꼭 집어서 시켜서 제가 작성한 것 입니다. 도움이 될 까 하고 여기에 올려봅니다.



JDBC에 대한 설명을 수업시간에 들어서 다 아실거라 믿습니다. 다시 조금 설명하면 Java와 DB의 연결점이라고 생각하시면 됩니다. DB 마다 조금씩 SQL명령구문이 다릅니다. 다른 DB를 사용한다고 해서 SQL명령이 들어간 부분을 완전히 바꾼다고 한다면 보수유지에 문제가 많겠지요. 그래서 통일성있게 하려고 JDBC를 사용합니다. 


  JDBC를 사용할려면 우선 자바 JDK가 깔려있어야 하겠고 또 DB에 맞는 JDBC Driver가 필요합니다. 우리의 목표는 MySQL과 자바의 연결이니 MySQL에서 제공하는 JDBC Driver 가 필요합니다.  http://www.mysql.com/downloads/api-jdbc.html  이 주소를 따라가면 MySQL의 JDBC 드라이버를 받을 수 있습니다.


   다운 받을 때 버전 번호 잘 확인 하기 바랍니다. 버전 번호에 대한 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions.html  에 있습니다. 이 내용은 JDBC버전과 Mysql 의 관계를 설명한것입니다.  저의 엉터리 영어 해석을 동원하자먄  Connector/J 3.0 버전은 MySQL 3.x or MySQL 4.1 servers(버전뒤에 servers 가 붙는 것은 뭔지 모르겠습니다.) 에서 동작하고 , Connector/J 3.1 는 MySQL 4.1 and MySQL 5.0 servers 에서 동작하고, Connector/J 5.0  는  Connector/J 3.1의 기능에 뭔가를 추가했다는 말 같습니다.
  여기에 우리는 자바 가상머신 버전과 Connector/J 의 버전도 고려해야 합니다. 그 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions-java.html 여기에 있습니다. 자바 1.5이상을 쓰시면 그 다지 걱정하지 않아도 될 것 같군요..


  그냥 zip 파일이기 때문에 압축해제 하고 싶은데 하시기 바랍니다. 이 디렉토리(폴더)안에는 mysql-connector-java-[ver]-bin.jar 이런 형식의 jar 파일이 있습니다. 이 파일의 총 경로(디렉토리주소\파일이름)를 CLASSPATH라는 환경변수에 이 디렉토리를 설정하기 바랍니다. (CLASSPATH 에 추가 하는 것은 다 아시리라 믿습니다. PATH에 설정하듯이 설정하면 됩니다. CLASSPATH라는 환경변수가 없으면 만들고, 있으면 세미콜론 하나 붙인 후 이 패스를 추가 하면됩니다. )
 근데 이게 재부팅해야 작동하는 것 같습니다. 환경설정 자체는 재부팅이 필요없는데 JVM이 다시 로드되어서 작동하는 것 같습니다. 재부팅 안하고 하려면 mysql-connector-java-5.0.5-bin.jar 파일을 C:\Program Files\Java\jdk1.5.0_10\lib 라는 디렉토리에 넣으면 됩니다. 이게 더 좋은 방법일 것 같습니다.


 이제 잘 설정되었는지 실험해 보시기 바랍니다. 다음을 컴파일 한 후 실행해 보기 바랍니다.
===============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class jdbcTest {
 public static void main(String[] args) {
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
 } 
}==================================================


 이 프로그램은 간단하게 Mysql과 연결하기 위해 드라이버를 로딩하는 기능을 합니다. 이게 제대로 실행되어야 합니다. 실행중 에러가 나면 안됩니다. 잘 작동하지 않는다면 대부분의 문제는 앞에서 설정을 잘못하였거나 자기 Mysql 버전과 맞지 않는 것을 사용했기 때문입니다.(저 같은 경우, 완전이 압축해제 하지 않아서 시간을 조금 허비했군요. 이 경우도 확인해 보시기 바랍니다.)


 이제 Mysql에 접속해 보겠습니다. 우선 mysql이 작동하는 상태로 만들고, 다음 코드를 컴파일 후 실행해 보기 바랍니다.
===================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class jdbcTest {
 public static void main(String[] args) {
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
  try{
   Connection conn =
        DriverManager.getConnection("jdbc:mysql://localhost" ,"아이디" ,"패스워드");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }


 } 
}
====================================================
 아이디와 패스워드 라고 중간에 한글로 된 부분은 진짜 자신의 아이디와 패스워드를 적어주시기 바랍니다.
 DriverManager.getConnection 메소드는 접근하기 위한 주소와 아이디, 패스워드를 받아 MySQL과 접속시켜줍니다. 만일 웹에서 작동하게 된다면 localhost 대신 자신의 웹주소를 적어야 하겠죠. 그리고 만일 Mysql을 처음 설치할 때 localhost로 안하고 다른 것으로 설정했다면 그 주소로 해야 합니다. 에러가 안 나와야 정상입니다.


 


 이제 쿼리를 날려봅시다.
==============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;


public class jdbcTest {
 public static void main(String[] args) {
  
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
  
  Connection conn = null;
  try{
   conn =
        DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }
  
  Statement stmt = null;
  ResultSet rs = null;
  try{
   stmt = conn.createStatement();
   rs = stmt.executeQuery("SELECT version()");
  
   // or alternatively, if you don't know ahead of time that
   // the query will be a SELECT...
  
   if (stmt.execute("SELECT versoin()")) {
    rs = stmt.getResultSet();
   }
  } catch(Exception ex) {
   // handle the error
  }



 } 
}
================================================================
 쿼리만 날려 봤습니다. SELECT versoin()은 SQL 버전을 출력해 주는 구문입니다. 우리의 결과는 rs에 들어 있습니다.이 자료를 출력하겠습니다. 우선 mytest 데이터베이스에 test라는 테이블을 만들어서 다음과 같이 자료를 넣었습니다. 우선 Database를 만들어 주어야 합니다.
create database mytest;
그 다음 테이블을 만들어 주어야 합니다. 다음과 같이 하면 됩니다.


CREATE TABLE  `mytest`.`test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) character set utf8 NOT NULL,
  `age` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
);


그리고 그 안의 데이터는 다음과 같습니다.
1 김철수 19
2 이영희 25
3 홍길동 43


 insert into 를 이용하는 것은 다 아시겠죠..


================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.sql.CallableStatement;


public class jdbcTest {
 public static void main(String[] args) {
  
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
  
  Connection conn = null;
  try{
   conn =
        DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }
  
  Statement stmt = null;
  ResultSet rs = null;
  try{
   stmt = conn.createStatement();
   rs = stmt.executeQuery("SELECT * FROM mytest.test");
  
   // or alternatively, if you don't know ahead of time that
   // the query will be a SELECT...
  
   if (stmt.execute("SELECT * FROM mytest.test")) {
    rs = stmt.getResultSet();
   }
  } catch(Exception ex) {
   // handle the error
  }
  
  try{
   while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");        
    int age = rs.getInt("age");
    System.out.println(id + " " + name + " " +age);
   } 
  }catch(Exception ex) {
   // handle the error
  }
  }
 
}
================================================


 다음과 같은 결과가 나와야 합니다.
 
=====================
1 김철수 19
2 이영희 25
3 홍길동 43
====================


 


  MySql5.x 버전을 사용하면 한글이 깨져서 나올 수 있는데, MySQL Server Instance Config Wizard 라는 프로그램(MySQL 설치시 자동설치됩니다.)으로 환경설정을 다시 해주어야 합니다. 기본으로 하다기 Charracter set 을 설정하는 부분이 있는데, 맨 마지막 Manaul로 설정하고 Character set을 EucKR로 설정하세요.
그리고 테이블 삭제하고 다시 만들어서 실험해 보세요..


 여기 까지가 제 강의 입니다. 대부분의 자료는 http://dev.mysql.com/doc/refman/5.0/en/connector-j.htmlhttp://www.javastudy.co.kr/docs/lec_jdbc/index.shtml 에서 읽어보고 작동여부를 점검했습니다. 저기 있는대로 하니까 안되는 것도 있어 좀 고쳐서 했습니다.


 버전마다 차이는 크지 않을 거라고 생각합니다. 감사합니다.