2015년 3월 27일 금요일

우분투 1404 server 위에 apache2 mysql tomcat7 설치 후 배포!!! mod-jk 사용 X (apache2 와 tomcat7 분리)



mod-jk의 역할은 80번 (아파치포트)로 들어 오는 것을 8080(톰캣포트)로 자동으로 연결해준다. 우리는 mod-jk를 사용하지 않기 때문에 80 포트로 들어오면 .html, .js, .css 파일을 제외한 나머지는 proxy 를 이용해 8080포트로 보낼 것이다.
우선 나같은 경우는 이런 경우를 생각하지 않고 front-end와 back-end를 한 프로젝트로 구성했는데, 보통 front-end 와 back-end 프로젝트를 나눠서 만들고 각각 배포를 달리한다. (front는 서버에 back은 was에) 이렇게 하기 위해서는 uri로 구분지어야 한다. (그런것 같다..ㅜㅜ) 예를들어 /test/로 들어오는 모든 요청은 backend로 보내고 나머지는 front에서 처리한다 이런식이다.
나는 기존에 이런 구성이 아니었기 때문에 프로젝트를 조금 수정한다.
Edit

프로젝트 수정 /api 로 오는 모든 요청은 tomcat으로 보낸다.

1) 컨트롤러에 RequestMapping("/api")
@Controller
@RequestMapping("/api")
public class TodoController {
2) js 파일에서 ajax로 보내는 모든 uri에 /api 붙여준다. 좀 노동이지만..
$http.get("./api/todos/all").success(function
여담 - 앞에 ./ 는 프로젝트 명이 어떻게 될지 모르기 때문에 상대 경로를 적어주는 것.
. 은 자기 자신 폴더를 의미함.
Edit

filter가 필요하다

apache에서 들어온 요청을 다른 서버에 있는 tomcat으로 보내는 것이기 때문에 접근제한 에러가 날 것이다. 아마
access-control-allow-origin 가 헤더게 없습니다.
이런식의 에러문구가 나타난다.
access-control-allow-origin 를 헤더에 넣기 위해서는 filter를 만들어 줘야한다.
package kr.co.kware.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class SimpleCORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
그리고 web.xml에도 filter 설정을 해준다.
<filter>
<filter-name>SimpleCORSFilter</filter-name>
<filter-class>
kr.co.kware.web.filter.SimpleCORSFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>SimpleCORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • 이후에 나는 maven packaging 과정에서 javax.servlet 이 없다는 에러가 났는데.
pom.xml에 아래와 같이 넣어주니 해결됨.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
Edit

apache2 설정파일에서 proxy 설정 해준다 (여기가 핵심)

  • 혹이 이전에 mod-jk가 설치되어있다면
#sudo find / -name jk.*
파일을 찾아서 지워준다. 2개였던 것으로 기억함.
#sudo vi /ect/apache2/sites-available/000-default.conf
여기에서 JkMount 로 된 것들을 모두 주석(#) 처리한다.
mod-jk가 역할을 안하는지 확인하려면
http://localhost:80 -> 접속시 우분투 아파치 화면
http://localhost:8080 -> 톰캣 접속화면
이 다르게 보여야 한다.
이제 본격적으로 apache2 설정파일을 수정해보자. (정적파일외 모든것은 tomcat으로 가게끔!)
먼저 아파치 설정파일로 이동
#sudo vi /ect/apache2/sites-available/000-default.conf
  • mod-jk 를 사용 했다면 JkMount 로 된 것들을 모두 주석(#) 처리한다.
  • DocumentRoot를 기본 설정인 /var/www/html 로 바꾼다
  • apache에서 처리하는 파일을 모두 /var/www/html 로 이동시켜야 한다. 그리고 처음 요청이 들어오는 것이 여기!!
    앞서 말했지만 프론트엔드와 백엔드 프로젝트를 따로 구성해, 프론트엔드 프로젝트를 /var/www/html 에다가 배포하고, 백엔드 프로젝트를 /var/lib/tomcat7/webapps 에 배포하는 것.
    우선 나는 같은 곳에서 만들었기 때문에 .war 파일을 /var/lib/tomcat7/webapps 에 넣고 html,js,css 파일을 /var/www/html 이동함.
  • 혹시 DocumentRoot가 /var/lib/tomcat7/webapps/ROOT 로 되어 있으면 주석 처리.
  • 프록시 설정을 적어준다.
ProxyPass /api http://localhost:8080/api
ProxyPassReverse /api http://localhost:8080/api
/api 로 시작되는 uri 는 모두 http://localhost:8080/api 서버로 간다는 뜻이다.
  • tomcat의 server.xml 에 프록시 등록
<Connector port="8080" ...
proxyName="localhost"
proxyPort="80"/>
  • 프록시에 링크 걸어두기
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/proxy_connect.load /etc/apache2/mods-enabled/
프록시를 등록했으면 링크 걸어서 사용가능한 프록시?로 링크를 걸어주는것...같..? ? ??ㅎㅎ 여튼 해줘야한다!!!
준비끝!!!!!
Edit

아파치와 톰캣을 재시작 해주자

#sudo service apache2 restart
#sudo service tomcat7 restart

우분투 1404 server 위에 apache2 mysql tomcat7 설치 후 배포!!! mod-jk 사용



오랜시간 삽질끝에 간신히 우분투위에 배포완료. 원래 목적은 virtual box 에 apache2 , tomcat7, mysql5.5 server 를 각각 설치할 우분투를 3곳 만들어 서로 어떻게 통신하는 지를 알고 싶었지만 어려워 한곳에다 모두 설치했다. (꼭 해봐야지...)
우선 통신은 이렇게 된다.
웹 서버 apache2 에서는 정적 콘텐츠인 .html, .js , .css 파일만 처리하고 나머지는 WAS 인 tomcat7 에 넘긴다. 그리고 tomcat7은 db와 통신한다. 따라서 apache에 html, js, css 파일을 제외한 나머지를 tomcat에 넘기라는 설정을 어딘가에서 해줘야하는데.. 잘 모르겠다. 보통 인터넷에서 아파치와 톰캣을 연동시키는 libapache-mod-jk 를 설치해서 통신하는데, 팀장님은 필요없다고 하신다..... 따로 아파치에서 설정해주면 된다고...하시는데....... 점점점....ㅎㅎㅎㅎ
결론은 우분투 14.10 server 한곳에 아파치, 톰캣, mysql 을 설치하고 , spring mvc 를 이용한 웹 어플리케이션을 배포했다. 그 과정을 적고자 한다.
Edit

apache2 설치

#sudo apt-get install apache2
설치후
#sudo /etc/init.d/apache2 나 # sudo service apache2 start
로 실행 시킨후 http://[우분투IP] 로 접속하면 "Apache2 Ubuntu Default Page"가 나온다
Edit

apache2 설정

1. 서버 네임 등록
#sudo vi /ect/apache2/apache2.conf
#ServerName
ServerName localhost
를 적어준다.
2. 가상 호스트 설정
#sudo vi /etc/apache2/sites-enabled/000-default.conf
ServerName localhost
를 적어준다.
libapache-mod-jk 를 설치해 톰캣과 연동시 이곳에 설정해 줘야 할것이 더 있다.
우선
#DocumentRoot /var/www/html
이라고 되어있는 것에 #을 이용해 주석처리를 하고
DocumentRoot /var/lib/tomcat7/webapps/ROOT/
를 적는다. 그 다음
JkMount /* ajp13_worker
를 적어준다. 잘은 모르겠지만 아파치에서 처리하지 않는 모든 것들을 톰캣이 받아서 처리해 준다는 것 같다...(추측..)
Edit

tomcat7 설치

1. 설치하기 전에 java가 설치 되어있어야 함!!!!
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java9-installer
2. 톰캣 설치
#sudo apt-get install tomcat7
#sudo apt-get install tomcat7-admin
tomcat7-admin 은 톰캣 메니져로 톰캣을 관리하기 좀더 편한 툴이다. 웹에서 어떤것이 실행중인지 확인가능..ㅎㅎㅎ
3. 설치 확인 : 설치 후 http://[우분투ip]:8080 으로 접속하면 It works! 란 화면이 나온다.
톰캣 홈 디렉토리 : /var/lib/tomcat7/webapps/ROOT
CATALINA HOME 디렉토리 : /usr/share/tomcat7
CATALINA BASE 디렉토리 : /var/lib/tomcat7
로그 : /var/log/tomcat7/ 에 들어가면 여러 파일이 있는데 내가 주로 본 것은 catalina.out 파일 사용함
4. 로그를 보고 싶다면
#sudo tail -100 /vat/log/tomcat7/catalina.out
#sudo tail -f /vat/log/tomcat7/catalina.out
이렇게 봤음. 다른 파일을 봐도 상관없음!
Edit

Apache와 Tomcat 연동

1. 연동 이유
우선 참고. 아파치와 톰캣 연동하는 이유 -> http://hmgirl.tistory.com/67 참고
요약하면 앞에 말한 이유와 같다. apache2는 정적콘텐츠만 처리하기때문에 그 외 나머지는 톰캣이 처리하게 하기위해 넘겨줘야한다. 때문에 연동한다는 내용.
2. 연동을 하기 위한 모듈(mod-jk)를 설치 한다.
#sudo apt-get install libapache2-mod-jk
3. 설치후 workers.properties 파일 수정 설정 변경한다.
#sudo vi /etc/libapache2-mod-jk/workers.properties
에서
workers.tomcat_home = /usr/share/tomcat7
workers.java_home = /usr/lib/jvm/java-7-oracle
자신의 톰캣 홈과 자바 홈 수정 해준다.
그리고 여기서 쭉 읽다 보면
workers.list = ajp13_worker
worker.ajp13_worker.type = ajp13
라는게 나오는데 이게 default 값인듯하다. 이게 apache2 설정과 관련이 있는듯.뭔가..
4. 이후에 apache2에도 다시 설정! (이미 위에서 하고 왔다. 원래 순서는 지금 )
#sudo vi /etc/apache2/sites-enabled/000-default.conf 여기서 DocumentRoot /var/lib/tomcat7/webapps/ROOT/로 수정하고 JkMount /* ajp13_worker 라고 적어준것
5. tomcat7/server.xml 수정
#sudo vi /etc/tomcat7/server.xml
(주석제거)
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
(주석제거)
이 부분 주석 제거.
하는김에 encoding 설정도 해주자
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
URIEncoding="UTF-8"
enableLookups="false"
useBodyEncodingForURI="true" />
여기도 URIEncoding="UTF-8" 적어준다
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8443"
connectionTimeout = "20000"
URIEncoding="UTF-8" />
참고 : http://warmz.tistory.com/556
Edit

mysql 설치 및 설정

1. mysql 설치
#apt-get install mysql-server-5.5
설치할때 root의 비밀번호 설정하는데 이때 비밀번호를 잘 기억하자.
2. 외부에서 접속할수 있도록 권한 부여
1) mysql db 로그인!
mysql -u root -p
mysql -p 우분투ip -P 3306 -u root -p
2) db 변경
use mysql
3) 권한 부여
GRANT ALL PRIVILEGES ON *.* to 'root'@'%' IDENTIFIED BY 'root 비밀번호';
4) 즉시 반영
flus privileges;
3. mysql 설정 파일 변경
#sudo vi /etc/mysql/my.cnf
에서
bind-address = 127.0.0.1 이 부분 주석 처리
4. my.cof 에서 한글 설정 .
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init_connect = set collation_connection = utf8_general_ci
init_connect = set names utf8
[mysql]
default-character-set=utf8
[mysqld_safe]
default-character-set=utf8
[client]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
  • 한글 설정 확인
1) mysql 로그인
2) mysql 문자셋 확인
show variables like 'char%';
에서 character set 이 모두 utf8 이것 확인 이 중에 latin1 이 있다면
set character utf8;
3) 테이블에서도 확인 >>> 난 이문제로 계속 안됐었음 ㅠㅠ
show create table 테이블명;
에서 CHARSET 곳 확인. 이곳이 잘못되어 있다면
alter table 테이블명 convert to charet utf8;
참조 : http://blog.naver.com/cjmzzang119/110114920197
Edit

배포

1. 이클립스에서 spring maven 프로젝트 war 파일 만들기
1) 프로젝트 pom.xml 우클릭
2) run as 에서 run configuration 클릭
3) Goals : _______ 빈칸에 , clean package 입력 (클린후 패키지 만든다는 뜻 )
4) run 한다.
--- maven-war-plugin:2.3:war (default-war) @ todoList ---
[INFO] Packaging webapp
[INFO] Assembling webapp [todoList] in [D:\workspace\todoList\target\todoList-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\workspace\todoList\WebContent]
[INFO] Webapp assembled in [501 msecs]
[INFO] Building war: D:\workspace\todoList\target\todoList-0.0.1-SNAPSHOT.war
5) 콘솔창에 위와 같이 뜨고, war 파일이 저장된 경로가 나타난다.
이때 주의!!!!!
maven packaging 시 src 안에 있는 properties, xml 파일은 빌드되지 않는다. 따라서 pom.xml 설정을 바꿔줘야 한다.
<build>
<resources>
<resource>
<!-- src/main/java 폴더의 xml파일들을 빌드에 포함 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<!-- src/main/resources 폴더의 xml, properties, setting파일들을 빌드에 포함 -->>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.setting</include>
</includes>
</resource>
</resources>
</build>
참조 http://blog.iotinfra.net/?cat=13&paged=3
2. .war 파일을 만들었으면
/var/lib/tomcat7/webapps 에 파일을 옮긴다.
나는 FileZilla 프로그램을 사용해서 옮김. 옮길때 권한이 문제되면 우선 되는 곳에 옮겨두고 우분투에서 mv 시킨다.
/ROOT 밑에 넣으면 파일이 올라오지도 않음. webapps위에!!!
3. 톰캣 재시작
#sudo service tomcat7 restart
4. 된다!!!!!
Edit

에러 상황

  • classNotFound로 WEB-INF/applicationContext.xml 에서 dataSource 를 찾을 수 없다는 에러 발생
<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
basicDataSource 클래스가 tomcat.dbcp 패키지를 사용한것이었는데, pom.xml에 다운받은것은 tomcat.dbcp가 아니라, commons.dbcp 것..!!!
실제로 찾아보니까 tomcat.dbcp.basicDataSource 는 없다. 여튼 xml 저렇게 수정해주니 됐음!!!

우분투 14.04 usb 인식 실패 exfat



* 문제

Error mounting /dev/sda6 at /media/gkp/Backup: Command-line 
`mount -t "exfat" -o "uhelper=udisks2,nodev,nosuid" "/dev/sda6" "/media/gkp/Backup"' 
exited with non-zero exit status 32: mount: unknown filesystem type 'exfat'


* 해결방법

sudo apt-get install exfat-fuse exfat-utils
* 참고

http://askubuntu.com/questions/364270/mount-unknown-filesystem-exfat



진짜 별개 다 문제다....하.. 

우분투 14.04 이클립스 설치


참고 : http://logon.tistory.com/136

이클립스 사이트에서 linux 버전으로 다운로드

다운로드 후

> # tar xvfz eclipse~~~.tar


우분투 14.04 chmod 파일 권한 주기


루트 계정으로 간다.

>   # sudo su

chown -R 소유자 : 소유권한  폴더 또는 파일 명

-R 은 하위 디렉토리 권한까지 모두 준다는 것.

> chown -R sooyoung:sooyoung /data/

2015년 3월 26일 목요일

오라클 jdk 설치 과정 에러 - Sub-process /usr/bin/dpkg returned an error code (1) 갬갬


* 참고 : http://askubuntu.com/questions/414885/oracle-jdk-7-is-not-installed-error


*  문제

Oracle JDK 7 is NOT installed.
dpkg: error processing oracle-java7-installer (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 oracle-java7-installer
E: Sub-process /usr/bin/dpkg returned an error code (1)


*  해결방법

sudo dpkg -P oracle-java7-installer
sudo apt-get -f install

2015년 3월 17일 화요일

[우분투 ubuntu] 우분투 14.04 server에 Mysql 설치, 외부 권한 주기, db 생성


  • Mysql 검색
    • #apt-cache search mysql-server
  • Mysql 설치 
    • #apt-get install mysql-server-5.5 
    • #apt-get install mysql-client-5.5
      -사실 클라이언트는 필요없다. 근데 우선 나는 설치함.
  • Mysql 외부 접속 권한 부여
    -설치할 당시에는 localhost만 접속할 수 있게 설정되어 있다.
    • mysql database에 로그인 
      • #mysql -u root -p
        -우선 root 로 로그인한다. 패스워드는 설치할때 설정한 패스워드 입력
      • #mysql -h 우분투ip -P 3306 -u root -p
    • default db 변경 
      • use mysql;
    • 권한 부여 
      • GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '패스워드 입력';
        - mysql에서는 sql 문을 사용할수 있다
        - root@모든 아이피로 접속된 사용자에게 모든 권한을 준다는 뜻
      • flush privileges;
        - 권한 즉시 적용
      • .my.cnf 설정 파일 변경 
        • #sudo vi /etc/mysql/my.cnf  에 들어가서 
          • bind-address = 127.0.0.1 이 부분 주석
      • mysql server 재시작 
        • #sudo /etc/init.d/mysql restart  
  • mysql db 생성
    mysql 에서는 sql문 사용이 가능하다
    • mysql 접속 : #mysql -u root -p 
    • 현재 database 보기: show databases; 
    • database 만들기 : create database 데이터베이스명; 
    • database 사용 : use 데이터베이스명'
    • table 만들기 : create table 테이블명 (
      칼럼명 데이타형식 ~~~~
      );
      원래 mysql create 문과 같다.
    • 예를들면, 나는 TODO라는 이름의 테이블을 만들때,

      CREATE TABLE TODO (
      TODO_ID int(11) NOT NULL AUTO_INCREMENT,
      CONTENT varchar(200) DEFAULT NULL,
      HASDONE varchar(10) DEFAULT NULL,
      DATE datetime DEFAULT NULL,
      PRIMARY KEY (TODO_ID)
      ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


위 블로그 참조함.  우분투 한글 인코딩 및 innodb 설정도 나와있음.