레이블이 tomcat인 게시물을 표시합니다. 모든 게시물 표시
레이블이 tomcat인 게시물을 표시합니다. 모든 게시물 표시

tomat springboot 환경변수 적용

# springboot 의 spring.profiles.active 값에 따라 다른 설정을 사용해야 할때가 있다.
# 이 경우 tomcat_home/bin 에 setenv.sh 파일을 생성하면 된다.
vi setenv.sh
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=test"

# tomcat_home/bin/catalina.sh 에서 setenv.sh 파일이 존재하면 로드한다.
# 이제 tomcat 을 시작
tomcat_home/bin/catalina.sh start

# tomcat 프로세스를 확인해보면 
# -Dspring.profiles.active=test 가 적용된걸 알 수 있다.
ps -ef | grep tomcat

tomcat AJP connector error

# tomcat 9.x server.xml 설정에서
# 아래와 같이 AJP(Apache JServ Protocol) 를 명시하고
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

# tomcat 을 실행하면 다음과 같은 에러가 발생한다.
bin/catalina.sh stop

... 생략 ...

The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.

# AJP 취약점으로 인해 tomcat 특정 버전부터 AJP 커넥터 사용시
# 기본으로 secretRequired=true(비밀키 항상 필요) 설정하기 때문에 발생한다.
# AJP 커넥터 설정을 삭제 하거나
# secretRequired=false 로 명시하면 된다.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="false" />

mac apr tomcat native 라이브러리 문제

# mac 에서 tomcat conf/logging.properties 에서 로그레벨을 DEBUG 으로 하고
# tomcat 을 실행하면
./apache-tomcat-9.0.31/bin/catalina.sh run

# 다음과 같이 apr tomcat native 라이브러리를 찾을 수 없다는 에러가 발생한다.
org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 프로덕션 환경들에서 최적의 성능을 제공하는, APR 기반 Apache Tomcat Native 라이브러리가, 다음 java.library.path에서 발견되지 않습니다: [/Users/ysoftman/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]

# tomcat-native 설치 후
brew install tomcat-native

# 링크를 걸어주면 된다.
sudo ln -s /usr/local/opt/tomcat-native/lib/libtcnative-1.* /Library/Java/Extensions

jenkins github credential 실패시 확인사항

[문제]
github.aaa.com 에서 github.bbb.com 으로 마이그레이션
github.bbb.com 계정으로 developer settings -> personal access token 을 생성
jenkins -> credentials -> ysoftman bbb secrect key (personal access token 를 사용한다.) 생성
jenkins -> 환경설정 -> github 에 다음과 같이 설정하고
API URL : https://github.bbb.com/api/v3
Credentials : ysoftman bbb secrect key
Test connection 실행하면 다음과 같이 실패한다.
Failed to validate the account

[원인 및 해결]
/var/jenkins/jenkins.log 로그를 보면 403(bad request)로 실패한다.
그런데 jenkins 서버 터미널로 테스트 하면 github.bbb.com 에 잘 접속된다.
curl http://ysoftman:토큰@github.bbb.com/api/v3

원인은 jenkins 에 설정된 프록시 서버 문제로
jenkins -> plugin manager -> 고급 -> http 프록시 설정에 no proxy host 에 github.bbb.com 추가하면 접속 된다.
jenkins job 까지 프록시 설정을 반영하기 위해선 http://젠킨스주소/restart 로 재시작해야 한다.

[추가로]
tomcat 상으로 jenkins 가 구동되는 경우, jenkins 만 재시작하면 안된다.
tomcat 데몬이 올라갈때의 no_proxy 설정이 유지되기 때문에
bash 상에서 다음과 같이 no_proxy 설정 후 tomcat 을 재시작해야 한다.
export no_proxy=github.aaa.com,github.bbb.com

access log - get null 400 에러

# tomcat 에러 중 다음과 같이 path 부분이 null 이 찍히는 경우가 있다.
# 참고로 로그는 apache httpd mod_log_config 를 사용한다.
https://httpd.apache.org/docs/2.4/ko/mod/mod_log_config.html

# /var/lib/tomcat8/conf/server.xml 에서 로그 포맷 설정
# %{Foobar}i - Foobar 헤더
# %h - 원격 호스트
# %l - 원격 identid가 제공한 로그인명, 기본값(-)
# %u - 원격 auth가 제공한 사용자명, 기본값(-)
# %t - 표준 영어 시간
# %r - 요청 첫번째 줄
# %s - 상태코드
# %b - http 헤더를 제외한 전송 바이트 수
# %h %l %u %t "%r" %s %b 포맷

# tomcat access log 확인
sudo tail -f /var/log/tomcat8/localhost_access_log.2019-01-31.txt

# 브라우저에서 '아이유' 요청하면 URL 인코딩 되고 다음과 같이 정상 동작(로깅)
127.0.0.1 - - [31/Jan/2019:18:15:30 +0900] "GET /%EC%95%84%EC%9D%B4%EC%9C%A0 HTTP/1.1" 404 1110

# curl 로 다음처럼 한글이 URL인코딩 없이 요청하는 경우 null 로 되고
# tomcat server.xml 의 protocol 기본 설정이 HTTP/1.1 로 돼있어
# HTTP/1.0 을 사용해도 로그에 HTTP/1.1 로 기록된다.
curl "http://localhost:8080/아이유" --http1.0 -s > /dev/null

# path 가 null 로 되어 처리할 수 없게 된다.
127.0.0.1 - - [31/Jan/2019:18:15:30 +0900] "GET null HTTP/1.1" 400 800

# tomcat 에러 로그를 확인을 위해 모든 로그를 확인해보자.
sudo vi /var/lib/tomcat8/conf/logging.properties
java.util.logging.ConsoleHandler.level = ALL

# tomcat 재시작
sudo service tomcat8 restart

# 에러 로그를 확인해보면
sudo tail -f /var/log/tomcat8/catalina.out

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

# 관련 내용을 구글링 해보니 tomcat 7.0.73, 8.0.39, 8.5.7 이상에서 발생하고
# http connector 에 relaxedQueryChars 를 설정하라고 한다.
https://stackoverflow.com/questions/41053653/tomcat-8-is-not-able-to-handle-get-request-with-in-query-parameters

# tomcat 버전 확인하면 8.5.30.0 이다.
sudo bash /usr/share/tomcat8/bin/version.sh

# 다음과 같이 특수문자를 처리해봤지만 한글 utf8코드는 처리 되지 않았다.
sudo vi /var/lib/tomcat8/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" />

# relaxedQueryChars 특수문자는 명시할 수 있지만 non-alphabet 범위의 문자코드는 어떻게 명시할 방법이 없어, client 가 URL 인코딩을 해줘야 한다.

tomcat 설치 및 실행

# mac 에서 설치
brew install tomcat

# ubuntu 에서 설치
sudo apt-get install tomcat8 tomcat8-docs tomcat8-examples tomcat8-admin

# bin path
/usr/share/tomcat8/bin/

# conf path
/var/lib/tomcat8/conf/

# log path
/var/log/tomcat8/

# mac 에서 path
brew ls tomcat
/usr/local/Cellar/tomcat/9.0.14/bin/catalina
/usr/local/Cellar/tomcat/9.0.14/homebrew.mxcl.tomcat.plist
/usr/local/Cellar/tomcat/9.0.14/libexec/bin/ (17 files)
/usr/local/Cellar/tomcat/9.0.14/libexec/conf/ (10 files)
/usr/local/Cellar/tomcat/9.0.14/libexec/lib/ (30 files)
/usr/local/Cellar/tomcat/9.0.14/libexec/logs/ (5 files)
/usr/local/Cellar/tomcat/9.0.14/libexec/temp/safeToDelete.tmp
/usr/local/Cellar/tomcat/9.0.14/libexec/webapps/ (571 files)
/usr/local/Cellar/tomcat/9.0.14/libexec/work/ (2 files)
/usr/local/Cellar/tomcat/9.0.14/libexec/ (2 files)
/usr/local/Cellar/tomcat/9.0.14/RELEASE-NOTES
/usr/local/Cellar/tomcat/9.0.14/RUNNING.txt

# 포트 변경
sudo vi /var/lib/tomcat8/conf/server.xml
# mac 에선
sudo vi /usr/local/Cellar/tomcat/9.0.14/libexec/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443 />


# 설정 파일 아래 내용 추가
sudo vi /var/lib/tomcat8/conf/tomcat-users.xml
# mac 에선
sudo vi /usr/local/Cellar/tomcat/9.0.14/libexec/conf/tomcat-users.xml

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="ysoftman" password="1234" roles="manager-gui,admin-gui"/>
</tomcat-users>

# 버전 확인
sudo bash /usr/share/tomcat8/bin/version.sh

# mac 에서 버전 확인
/usr/local/bin/catalina version

# mac 에서 시작
/usr/local/bin/catalina start

# mac 에서 종료
/usr/local/bin/catalina stop

# 시작
systemctl start tomcat8

# 종료
systemctl stop tomcat8

# 재시작
systemctl restart tomcat8

# WSL(windwos subsystem for linux)환경에서는
# systemctl 을 사용하면 다음과 같이 에러가 발생한다.
# 부팅시 systemd 를 초기화 할 수 없기 때문인것 같다.
System has not been booted with systemd as init system (PID 1). Can't operate

# 이 경우 다음과 같이 service 로 실행하자.
sudo service tomcat8 start

# stop, restart 도 service 로 실행
sudo service tomcat8 stop
sudo service tomcat8 restart

# 로컬로 톰캣 동작을 확인
http://localhost:8080/ ->  manager webapp 에서 위 설정한것으로 로그인

Java Tomcat Servlet 인코딩 설정

1. 톰캣 서버 환경파일 server.xml 의  Connector 태그 속성에 URIEncoding 을 추가한다.
톰캣홈/conf/server.xml  에서
<Connector port="8080" .... URIEncoding="EUC-KR">

2. 서블릿 소스(.java)에서 setCharacterEncoding() 을 사용한다.
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
        request.setCharacterEncoding("EUC-KR");
        response.setCharacterEncoding("EUC-KR");
}

Apache Httpd + Tomcat 설치 및 연동

# apache.org 에서 최신 버전의 httpd 다운 받아 압축 풀고 컴파일 하기
tar jxvf httpd-2.2.19.tar.bz2
cd httpd-2.2.19
./configure --prefix=/home/ysoftman/httpd/

# root 권한에서
make && make install

# httpd 설정 파일 수정
vi  /home/ysoftman/httpd/conf/httpd.conf

# 웹서버 의 root 경로(httpd 가 설치된 경로들 뜻한다.)
ServerRoot "/home/ysoftman/httpd/"

# 웹서버가 바인딩하여 작동할 포트번호
Listen 80

# 웹서버는 다음의 명시된 사용자/그룹으로 동작된다.
# 따라서 서비스 되는 디렉토리는 아래 명시된 사용자/그룹으로 권한이 설정되어야 웹서버에서 접근이 가능하다.
User ysoftman
Group ysoftman

# 웹서버의 기본 다큐먼트 디렉토리
# 웹서버 ip 로 접속했을때 기본적으로 보여지는 페이지가 있는 경로이다.
DocumentRoot "/home/ysoftman/httpd//htdocs"

# 디렉토리에서 기본적으로 서비스할 파일
DirectoryIndex index.html

# mime_module 이라는 모듈이 로드되었다면
# .cgi 확장자는 cgi-script 로 처리한다.
<IfModule mime_module>
AddHandler cgi-script .cgi
</IfModule>

# /web 별명으로 /home/ysoftman/web/를 사용
Alias /web "/home/ysoftman/web/"


# 지정 디렉토리 /home/ysoftman/web/ 에 대한 설정
Options ExecCGI 로 이 디렉토리에서는 CGI 를 사용할 수 있도록 한다.
AllowOverride None 로 .htaccess(디렉토리별 설정파일)을 오버라이드 하지 않는다.
Order allow,deny 로 allow 지시자와 deny 지시자가 있을때 allow 지시자를 우선하도록 한다.
Allow from all 로 모든 ip 로 부터의 접속을 허용한다.
# (만약 Allow from 10.10.10.11 라 하면 10.10.10.11 ip 로부터의 요청만 허용한다.)
# (만약 Deny from 10.10.10.11 라 하면 10.10.10.11 ip 로부터의 요청을 거부한다.)
<Directory "/home/ysoftman/web/">
    Options ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

# 아파치 시작/정지 등은 apachectl 스크립트를 사용해야 안전한다.
/home/ysoftman/httpd/bin/apachectl start

# 참고
# httpd.conf 파일 위치가 변경되었을때 apachectl 파일을 다음과 같이 수정하여 바뀐 경로를 httpd 에 알려주도록 한다.
HTTPD='/home/ysoftman/httpd/bin/httpd -f /home/ysoftman/web/httpd.conf'


#####


# apache.org 에서 최신 버전의 tomcat 다운 받아 압축 풀기
tar zxvf apache-tomcat-7.0.23.tar.gz

# apache.org 에서 최신 버전의 tomcat Connector 다운 받아 압축 풀고 컴파일하기
tar zxvf tomcat-connectors-1.2.32-src.tar.gz
cd tomcat-connectors-1.2.32-src/native
./buildconf.sh
./configure --with-apxs=/home/ysoftman/httpd/bin/apxs
make && make install

# 그럼 apache httpd 에 모듈 파일이 추가된것을 볼 수 있다.
ls /home/ysoftman/httpd/modules/mod_jk.so

# 아래와 같이 작성(vi /home/ysoftman/httpd/conf/workers.properties )
worker.list=testworker
worker.testworker.port=8009
worker.testworker.host=localhost
worker.testworker.type=ajp13
worker.testworker.lbfactor=1

# httpd.conf 수정(vi /home/ysoftman/httpd/conf/httpd.conf)
DocumentRoot "/home/ysoftman/apache-tomcat-7.0.23/webapps"
<Directory "/home/ysoftman/apache-tomcat-7.0.23/webapps/">
AllowOverride None
Order allow,deny
Allow from all
</Directory>
LoadModules jk_module modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile /home/ysoftman/httpd/conf/workers.properties
JkShmFile /var/log/httpd/mod_jk.shm
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel info

# JkMount 로 특정 패턴을 톰캣으로 넘긴다.
JkMount /*.jsp testworker
JkMount /examples/servlets/servlet/* testworker
</IfModule>

# tomcat 실행
/home/ysoftman/apache-tomcat-7.0.23/bin/startup.sh

# tomcat 끝내기
/home/ysoftman/apache-tomcat-7.0.23/bin/shutdown.sh

http://호스트/examples/index.html 으로 동작 확인
# 참고로 웹서비스할 대상 디렉토리의 WEB-INF/web.xml 설정을 통해 Servlet(컴파일된 java class)을 실행한다.