질문&답변
클라우드/리눅스에 관한 질문과 답변을 주고 받는 곳입니다.
리눅스 분류

리눅스에서 PHP, JSP, Servlet설치

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스에서 PHP, JSP, Servlet설치


oracle 8.1.6 R2    
MySQL-3.22.32-1
apache 1.3.12    
php 4.0.2    
gd 1.8.3(jpeg zlib 필요)    
tomcat 3.1(src로 받지 말고 bin으로 된 것을 다운)    

모든 설정은 /etc/profile.d/myset.sh에 저장하기로 한다.    
/etc/profile.d디렉토리에 놓이는 파일은 실행퍼미션이 있으면 부팅시    
실행되게 된다. myset.sh의 권한은 755모드로 해야 한다.    



자바설치

이는 /usr/java에 설치된다.    
javasoft에서 기존 Blackdown에서 하던 리눅스포팅을 하면서    
솔라리스와 같은 방식으로 디렉토리를 생성한다.    
설치된 곳은 rpm -ql jdk로 알 수 있다.    
(rpm -qf /usr/java/jdk1.3/bin/java로실행파일이 어느 RPM패킷지에서 나온 건지 알 수있다.)    

chmod 755 j2sdk-1_3_0-linux-rpm.sh    
./j2sdk-1_3_0-linux-rpm.sh
rpm -ivh j2sdk-1_3_0-linux.rpm    

myset.sh에 자바를 추가하자    
export PATH=$PATH:/usr/java/jdk1.3/bin    




오라클 설치(Oracle for Linux 8i 8.1.6 Release 2)
  
이 버전은 사실 설치시 버그가 있다.    
JRE의 문제가 아닐까 싶은데 UI부분에 있어선 inconsistent하게    
core dump가 발생한다. 본인은 Xmanager를 사용해 겨우 어렵게    
설치에 성공했다.    

루트로 실행    
일단 오라클을 풀자    
tar xvzf oracle8161_tar.gz -C /usr/local/src/oracle    
cd /usr/local/src/oracle/Oracle8iR2    

Oracle사의 OFA(Oracle Flexible Architecture)에 따라    
/u01을 마운트 포인트로 삼았다.    
디스크 하나짜리 리눅스라 u02, u03..식으로 만들진 못했다. 쩝..    

cd /    
mkdir u01    
cd u01    
mkdir app    
cd app    
mkdir oracle    
cd oracle    
mkdir product    
cd product    
mkdir 8.1.6    
cd 8.1.6    

후..
ORACLE_HOME인 /u01/app/oracle/product/8.1.6을 만들었다.    
ORACLE_BASE는 /u01/app/oracle로 지정한다.    
이 놈을 오라클설치에 관련되 그룹인 oinstall이 소유하게 만든다.    
이전에는 oinstall이라는 그룹이 없었는데 오라클 8iR2부터 이 oinstall이라는    
그룹이 나타났다. 매뉴얼상으로는 오라클 프로그램의 설치,갱신등을    
담당한다고 한다.    

오라클 사용자/그룹생성    
dba(SYSDBA, OSDBA)와 oinstall그룹을 만들고 dba는 사용자 oracle의 Secondary Group,    
oinstall은 사용자oracle의 Primary Group으로 만든다.    
oracle사용자의 홈디렉토리를 ORACLE_HOME으로 만들지 말라고 권고하는데    
번거롭고해서 그냥 여기로 지정했다.(아무 상관은 없다)    

groupadd dba    
groupadd oinstall    
useradd -d /u01/app/oracle/product/8.1.6 -g oinstall -G dba oracle    

/u01이하 디렉토리를 oracle사용자와 oinstall그룹의 소유로 만든다.    
chown -R oracle:oinstall /u01    

적기 힘들다. 이하 설명이 필요없다고 생각되면 생략하겠다.    
음.. 무지막지하군..    

이제 myset.sh에는 다음과 같이 미리 설정해 두자.    

myset.sh의 내용    
# Java 설정    
export JAVA_HOME=/usr/java/jdk1.3/jre    

# Oracle 설정    
ORACLE_OWNER=oracle
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/8.1.6
NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
ORACLE_SID=piruks
ORACLE_DOC=$ORACLE_BASE/doc

LD_LIBRARY_PATH=$ORACLE_HOME/lib
#CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/product/jlib:$ORACLE_HOME/JRE
CLASSPATH=$JAVA_HOME/jre
TNS_ADMIN=$ORACLE_HOME/network/admin    # tnsnames.ora가 위치하는 곳 지정    
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
EDITOR=vi

export ORACLE_OWNER ORACLE_BASE ORACLE_HOME NLS_LANG ORA_NLS33 ORACLE_SID ORACLE_DOC    
export LD_LIBRARY_PATH CLASSPATH TNS_ADMIN PATH EDITOR    

export PATH=$PATH:/usr/java/jdk1.3/bin    


오라클설치하자
cd ~oracle    
source /etc/profile.d/myset.sh    
./orainstRoot.sh

자바VM에서 실행되는 설치화면 시작    
쩝.. 생략할란다.    
음.. 맨 처음 나오는 그룹은 oinstall로 지정하고    
그 다음 조금 뒤에 나오는 구룹에서는 dba,dba로 지정한다.    
참고로 DB생성은 하지 말고 나중에 dbassist로 하는 것이 좋다.    

참고:
이 놈의 버전은 버그가 많아서 거의 core dump가 발생한다.    
/u01/app/oracle/product/8.1.6/assistants/dbca/jlibe디렉토리 아래에    
에러로그가 javacore3613.txt과 같이 기록된다.    
어떻게 Xmanager로 설치하니 억지로 되었다.    



MySQL설치

다음과 같은 파일을 몽땅 설치    
MySQL-3.22.32-1.i386.rpm
MySQL-client-3.22.32-1.i386.rpm
MySQL-devel-3.22.32-1.i386.rpm
MySQL-shared-3.22.32-1.i386.rpm

rpm -ivh MySQL-*    

MySQL의 루트암호를 설정    
/usr/bin/mysqladmin -u root password 'xxxxxxxx'    




아파치, PHP, GD, ..소스풀기
  
tar xvzf apache_1.3.12.tar.gz -C /usr/local/src    
tar xvzf php-4.0.2.tar.gz -C /usr/local/src    
tar xvzf gd-1.8.3.tar.gz -C /usr/local/src    
tar xvzf jpegsrc.v6b.tar.gz /usr/local/src    
tar xvzf jakarta-tomcat.tar.gz -C /usr/local (src에 풀지마!)    

GD는 libpng, zlib, jpeg 라이브러리를 요구한다.    
libpng, zlib는 rpm으로 설치되어 있었다.    
GD의 README파일을 참조해 자알~ 설치한다.    

cd /usr/local/src    
[root@piruks src]# l -1    
apache_1.3.12
gd-1.8.3
jpeg-6b
php-4.0.2



jpeg설치

cd jpeg-6b/    
./configure
make
make install    


gd설치

make
make install    
cp: cannot create regular file `/usr/local/include/gd.h': No such file or directory    
chmod: /usr/local/include/gd.h: No such file or directory    
make: *** [install] Error 1    

에러가 난다. 음.. 없다고 하니 생성하자    
mkdir /usr/local/include    
make install    




아파치설치(DSO로 설치)
  
./configure     
--prefix=/usr/local/apache     
--enable-module=most     
--enable-shared=max

make
make install    

myset.sh의 PATH에 아파치의 경로를 등록한다.    
export PATH=$PATH:/usr/java/jdk1.3/bin:/usr/local/apache/bin    

참고(Configure사용) -------------------------------------    
--enable-module
아파치와 함께 배포되어진(아파치 tarball에 동봉된) 모듈을 enable시킴    
아파치 tarball에 있는 모듈중에 default로 설치되는 모듈이 있고 default로    
설치되지 않는 모듈이 있다.    
value로는 mod_perl이라면 mod_를 제외한 perl을 지정해준다.    
value에는 위처럼 지정된 모듈명을 정확하게 적지않고 all, most를 적을 수 있다.    
all: 아파치배포시 내장한 모든 모듈을 사용하겠다는 의미    
most:가용한 모든 모듈을 사용하겠다는 의미    
(all에서 OS의존적이모듈등을 제거 예:auth_db, ..)    


--enable-shared
shared object support(DSO)를 enable한다는 의미    
이 옵션의 사용은 자동적으로 '--enable-module=so'를 사용한다는 의미를 가진다.    
max        so모듈을 제외한 모든 모듈을 DSO로 하겠음    
remain        ?(해석이 안됨)    

(예제)
--enable-module=rewrite         // rewrite모듈(mod_rewrite)을 DSO로 설치    
--enable-shared=rewrite


(중요)
차후, 아파치의 DSO+APXS메커니즘을 이용해 thiry-party모듈을 설치할 일이 있다면,    
반드시 enable-module=so를 해줘야 한다.    




PHP설치(DSO로 설치)

PHP에 오라클, MySQL, GD지원을 하게 컴파일하자    

cd ../php-4.0.2/    
./configure     
--with-apxs=/usr/local/apache/bin/apxs     
--with-gd     
--with-mysql     
--with-oci8

make
make install    
cp php.ini-dist /usr/local/lib/php.ini    


아파치에 PHP설정을 등록하자    
cd /usr/local/apache/conf    
vi httpd.conf    
AddType application/x-httpd-php .php <-이부분을 주석해제    

아파치 시작    
apachectl start    


APACHE는 동적, PHP는 정적으로 컴파일하기(PART2)
[root@ns apache_1.3.12]# ./configure --prefix=/usr/local/apache --enable-module=so
[root@ns apache_1.3.12]# cd ../php-4.0.3pl1
[root@ns php-4.0.3pl1]# ./configure
> --with-mysql
> --with-oci8
> --with-gd
> --with-apache=../apache_1.3.12
> --enable-track-vars
..생략
[root@ns php-4.0.3pl1]# make
[root@ns php-4.0.3pl1]# make install
[root@ns php-4.0.3pl1]# cd ../apache_1.3.12
[root@ns apache_1.3.12]# ./configure --prefix=/usr/local/apache
> --activate-module=src/modules/php4/libphp4.a
> --enable-module=so
[root@ns apache_1.3.12]# make
[root@ns apache_1.3.12]# make install
[root@ns apache_1.3.12]# cd ../php-4.0.3pl1
[root@ns php-4.0.3pl1]# cp php.ini-dist /usr/local/lib/php.ini
[root@ns php-4.0.3pl1]# cd ../../apache/conf/
[root@ns conf]# vi httpd.conf
  AddType application/x-httpd-php .php부분을 주석해제




PHP테스트

/usr/local/apache/htdocs/test.php를 생성하여 다음과 같이 적는다.    
phpinfo();

웹브라우저를 열어 제대로 실행되는지 확인    
http://localhost/test.php



오라클 연동 테스트
  
오라클에서 system사용자로 로그인하여 kang이라는 사용자를 생성한다    

sqlplus system/manager    

create user kang identified by merong    
default tablespace users    
temporary tablespace temp    
profile default  
/

grant connect, resource to kang;    
/


kang이라는 사용자로 다음을 실행    
sqlplus kang/merong    

creat table test    
(
        name varchar2(10);    
        age number(2)    
)
/

insert into test values ('강명규', 27)    
/


/usr/local/apache/htdocs/test_oracle.php를 생성하여 다음과 같이 적는다.    
<html>
<body>
오라클 테스트 테이블의 데이터를 불러옵니다<br>    
<?
        $sql = "select name, age from test";    
        $conn = ocilogon("kang", "merong");    
        $stmt = ociparse($conn, $sql);    
        ociexecute($stmt);
        ocifetchinto( $stmt, &$col, OCI_ASSOC+OCI_RETURN_NULLS);    

        echo "이름: ".$col[NAME]."<br>";    
        echo "나이: ".$col[AGE]."<br>";    

        ocifreestatement($stmt);
        ocilogoff($conn);
?>
</body>
</html>

http://localhost/test_oracle.php를 실행    



MySQL과 연동 테스트
  
MySQL의 간단한 요약    
(도움말은 help를 치면 나오므로 간단히 요약)    
[oracle@piruks 8.1.6]$ mysql -u root -p mysql    
Enter password:    
Reading table information for completion of table and column names    
You can turn off this feature to get a quicker startup with -A    

Welcome to the MySQL monitor.  Commands end with ; or g.    
Your MySQL connection id is 5 to server version: 3.22.32    

Type 'help' for help.    

mysql> show databases;    
'+----------+
| Database |    
+----------+
| mysql    |    
| test     |    
+----------+
2 rows in set (0.00 sec)    

mysql> use test;    
Database changed    
mysql> show tables;    
Empty set (0.00 sec)    

mysql> create table test    
    -> (    
    -> name varchar(10),    
    -> age int    
    -> );    
Query OK, 0 rows affected (0.00 sec)    

mysql> insert into test values('강명규', 27);    
Query OK, 1 row affected (0.00 sec)    

mysql> select * from test;    
+--------+------+
| name   | age  |    
+--------+------+
| 강명규 |   27 |    
+--------+------+
1 row in set (0.01 sec)    

이제 kang이라는 사용자를 만들어 요놈으로 테스트하자.    
mysql> use mysql    
mysql> insert into user ( host, user, password ) values ( 'localhost', 'kang', password('xxxxxx') );    

MySQL설치시 미리 만들어져 있는 test라는 DB를 kang에게 할당하자.    
mysql> update db set user='kang' where db='test';    
Query OK, 1 row affected (0.02 sec)    
Rows matched: 1  Changed: 1  Warnings: 0    

참고>
새로운 DB를 생성하여 사용자kang에게 할당은 다음과 같다.    
%> mysql -u root -p mysql    
Enter password:(비밀번호를 입력한다.)    
mysql> create database db_chat;    
mysql> insert into db values ( '%', 'db_chat', 'chat_user', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y' );    
mysql> insert into user ( host, user, password ) values ( 'localhost', 'chat_user', password('chat_pass') );    
mysql> FLUSH PRIVILEGES;    
mysql> quit    
%> mysql -u chat_user -p db_chat    

이제 PHP에서 MySQL연동 테스트를 하자 (음.. 지겹군..)    
test_mysql.php
<html>
<body>
<?
    $connect = mysql_connect( "localhost", "kang", "xxxxxx" ) or die( "Can't access DB" );    
    mysql_select_db( "test", $connect );    

    $query = "select name, age from test";    
    $result = mysql_query( $query, $connect );    
    $row = mysql_fetch_array( $result );    
    $name = $row[name];    
    $age = $row[age];    

    echo "이름: $name, 나이: $age";    
    mysql_close();
?>
</body>
</html>

여러개의 row가 존재시 다음과 같이 할 수 있다.    
<html>
<body>
<?
    $connect = mysql_connect( "localhost", "kang", "xxxxxx" ) or die( "Can't access DB" );    
    mysql_select_db( "test", $connect );    

    $query = "select name, age from test";    
    $result = mysql_query( $query, $connect );    
    $total = mysql_num_rows($result);        // 검색된 모든 레코드수    
    for( $i=0; $i<$total; $i++)    
    {
                mysql_data_seek( $result, $i );    
                $row = mysql_fetch_array( $result );    
                echo "[$i] 이름: $row[name], 나이: $row[age]<br>";    
    }

    mysql_close();
?>
</body>
</html>

GD는 생략    





Tomcat설치

일단 아파치와 연동하려면 mod_jserv.so가 필요한데 이는    
미리 컴파일된 것이 jakarta.apache.org에 존재하지만    

만약 tomcat의 소스를 설치했다면 다음과 같이 하여 만들수도 있다.    
만약 jakarta-tomcat을 소스로 설치한다면 jakarta-ant도 필요하다    

cd /usr/local/jakarta-tomcat/src/native/apache/jserv    
apxs -c -o mod_jserv.so *.c    

apxs는 아파치의 bin디렉토리에 존재한다.    
mod_jserv.so를 /usr/local/apache/libexec에 복사한다.    

mv mod_jserv.so /usr/local/apache/libexec/    


이제 설정을 잡자    
/usr/local/apache/conf/httpd.conf의 마지막 라인에 다음을 추가    

Include /usr/local/jakarta-tomcat/conf/tomcat-apache.conf    

TOMCAT-HOME, JAVA_HOME 환경변수설정    

# Tomcat 설정    
export TOMCAT_HOME=/usr/local/jakarta-tomcat    
# Java 설정    
export JAVA_HOME=/usr/java/jdk1.3    

설정끝.



tomcat테스트

startup.sh (시작)    
shutdown.sh(종료)

http://localhost/examples/jsp/index.html
http://localhost/examples/servlets/index.html

만일 8080포트를 사용하지 않겠다면 server.xml에서 다음처럼 주석처리한다.  

<!--
        <Connector className="org.apache.tomcat.service.SimpleTcpConnector">  
            <Parameter name="handler" value="org.apache.tomcat.service.http.HttpConnectionHandler"/>  
            <Parameter name="port" value="8080"/>  
        </Connector>
-->

jsp테스트
jsp를 테스트하기 위해 2개의 파일이 필요하다.


kang.jsp

<!--
        이 파일은 /usr/local/jakarta-tomcat/webapps/test/에 kang이라는 디렉토리를 만들고
        kang.jsp로 저장한다.
-->

<%@ page import="hello.NameHandler" %>

<jsp:useBean id="mybean" scope="page" class="hello.NameHandler" />
<jsp:setProperty name="mybean" property="*" />

<html>
<head><title>JSP예제</title>

<body>

<form method="get">
당신의 이름은?<input type="text" name="username" size="25"><br>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</form>

<%
    if ( request.getParameter("username") != null ) {
%>
        당신의 이름은 <jsp:getProperty name="mybean" property="username" />이군요
<% } %>

</body>
</html>



NameHandler.java

// 이 파일은 /usr/local/jakarta-tomcat/webapps/test/WEB-INF/classes에 hello라는 디렉토리를
// 만들고 여기에 파일 저장후 컴파일한다.

package hello;

public class NameHandler {

    private String username;

    public NameHandler() {
        username = null;
    }

    public void setUsername( String name ) {
        username = name;
    }

        public String getUsername() {
        return username;
    }
}


다음과 같이 브라우저에 입력한다.

http://10.0.0.102/test/kang/kang.jsp


자바와 MySQL연동테스트
아무래도 찝찝하니 MySQL과 Java와의 연동도 테스트해 보자
웹에서는 알아서 하고 그냥 쉘상에서 테스트하겠다..  
귀찮아서..


www.mysql.com의 download메뉴에 가면 JDBC라는 링크가 걸린데로 가서
JDBC드라이버를 다운받는다.

[root@piruks /down]# tar xvzf mm.mysql.jdbc-1.2c.tar.gz -C /usr/local

export CLASSPATH=$CLASSPATH:/usr/local/mm.mysql.jdbc-1.2c/:.

쩝..
이제까지 myset.sh에 등록한 환경변수를 알아보자

[root@piruks htdocs]# cat /etc/profile.d/myset.sh
#!/bin/bash

# Java 설정
export JAVA_HOME=/usr/java/jdk1.3

# Oracle 설정
ORACLE_OWNER=oracle
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/8.1.6
NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
ORACLE_SID=piruks
ORACLE_DOC=$ORACLE_BASE/doc

LD_LIBRARY_PATH=$ORACLE_HOME/lib
#CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/product/jlib:$ORACLE_HOME/JRE
CLASSPATH=$JAVA_HOME/jre
TNS_ADMIN=$ORACLE_HOME/network/admin    # tnsnames.ora가 위치하는 곳 지정
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
EDITOR=vi

export ORACLE_OWNER ORACLE_BASE ORACLE_HOME NLS_LANG ORA_NLS33 ORACLE_SID ORACLE_DOC
export LD_LIBRARY_PATH CLASSPATH TNS_ADMIN PATH EDITOR

# Tomcat 설정
export TOMCAT_HOME=/usr/local/jakarta-tomcat
export CLASSPATH=$CLASSPATH:/usr/local/jakarta-tomcat/lib/servlet.jar
export PATH=$PATH:/usr/java/jdk1.3/bin:/usr/local/apache/bin:/usr/local/jakarta-tomcat/bin

# MySQL JDBC 추가
export CLASSPATH=$CLASSPATH:/usr/local/mm.mysql.jdbc-1.2c/:.
alias l='ls -l'
alias ll='ls -la'


그럼 아무 디렉토리에서 DBTest.java를 만들고 다음과 같이 작성하자
import org.gjt.mm.mysql.*;
import org.gjt.mm.mysql.Connection;
import org.gjt.mm.mysql.Statement;
import org.gjt.mm.mysql.Driver;
import java.sql.*;

public class DBTest
{
    final static String strConn = "jdbc:mysql://localhost:3306/test";
    final static String strDbId = "kang";
    final static String strDbPass = "xxxxxx";

    public static void main(String args[])
    {
        Connection con;
        Statement stmt;
        java.sql.ResultSet rs;
        String sql = "select name, age from test";

        String name=null;
        int age;

        // 드라이버를 인스톨/로드(제공벤더에 따라 상이하다.)
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
        } catch(java.lang.ClassNotFoundException e) {
            System.err.print("ClassNotFoundException: ");
            System.err.println(e.getMessage());
        }

        try {
            // DB와의 연결(url, 사용자이름, 사용자암호)
            con = (Connection) DriverManager.getConnection( strConn, strDbId, strDbPass );
            System.out.println ("SQL Server와 연결되었습니다");

            // SQL문 생성
            // select는 executeQuery지만 insert, update, delete등은 executeUpdate를 사용한다.
            stmt = (Statement)con.createStatement();
            rs = (java.sql.ResultSet)stmt.executeQuery(sql);

            // 패스워드를 가져왔다. rs.next()안해줘도 되나?
            while(rs.next())
            {
                                name = rs.getString("name");
                                age = rs.getInt("age");
                                System.out.println("이름: "+name+", 나이: "+age);
            }
            stmt.close();
            con.close();
        } catch(SQLException ex) {
            System.err.println("==> SQLException: ");
            while (ex != null) {                                                 
                                System.out.println("Message:   " + ex.getMessage ());                                                 
                                System.out.println("SQLState:  " + ex.getSQLState ());                                                
                                System.out.println("ErrorCode: " + ex.getErrorCode ());                                                 
                                ex = ex.getNextException();
            }
        }
    }
}

컴파일&실행
[root@piruks htdocs]# javac DBTest.java
[root@piruks htdocs]# java DBTest
SQL Server와 연결되었습니다
이름: 강명규, 나이: 27
이름: 강병욱, 나이: 29
[root@piruks htdocs]#


This article comes from dbakorea.pe.kr (Leave this line as is)

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,091 명
  • 현재 강좌수 :  36,052 개
  • 현재 접속자 :  265 명