Servers
WebServer
Apache Setting
- module enable
LoadModule watchdog_module modules/mod_watchdog.so LoadModule xml2enc_module modules/mod_xml2enc.so LoadModule proxy_html_module modules/mod_proxy_html.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_express_module modules/mod_proxy_express.so LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so LoadModule userdir_module modules/mod_userdir.so LoadModule rewrite_module modules/mod_rewrite.so
LoadModule remoteip_module modules/mod_remoteip.so 이것은 확인 후에 적용
- Port 변경
80 --> 9180
- mkdir /data/homeplus/XXXX(4자리)
- mkdir /logs/weblog/service/XXXX(4자리)
- httpd-vhosts.conf (httpd-ssl.conf 동일)
<VirtualHost *:9180> ServerAdmin webmaster@homeplus.co.kr DocumentRoot "/data/homeplus/madm" ServerName service_name.homeplus.co.kr ServerAlias service_name.homeplus.co.kr ErrorLog "|/app/apache24/bin/rotatelogs /logs/weblog/service/madm/error.%Y-%m-%d.log 86400 540" CustomLog "|/app/apache24/bin/rotatelogs /logs/weblog/service/madm/access.%Y-%m-%d.log 86400 540" combined LogLevel warn ProxyRequests Off ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> Header add Set-Cookie "ROUTEID=route.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED <Proxy "balancer://cluster"> BalancerMember "http://10.10.21.48:8180" route=node1 BalancerMember "http://10.10.21.49:8280" route=node2 ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID </Proxy> ProxyPassMatch ^/(.*\.gif|.*\.jpg|.*\.jpeg|.*\.png|.*\.js|.*\.css|.*\.swf|.*\.html|.*\.htm)$ ! ProxyPass "/" "balancer://cluster/" <Location /> Require all granted </Location> </VirtualHost> -
WebServerStaticDeploy
-
#!/bin/sh # /data/scm/homeplus-club-admin/homeplus-club-admin-web echo echo '##### START DEPLOY #####' echo echo '##### Set Env #####' ##### JAVA ##### WEBROOT=/data/homeplus/padm export JAVA_HOME=/app/java/java8 export PATH=$PATH:$JAVA_HOME/bin/ export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar export Finalbackupfiles=5 export DeleteDate=3 PATH=$PATH:$HOME/bin export PATH echo " > JAVA_HOME=" $JAVA_HOME echo " > Final Backup File count=" $Finalbackupfiles echo " > DeleteDate=" $DeleteDate "day before" echo " > WEBROOT=" $WEBROOT echo echo '1. Backup & Stop' export NOW=`date +%Y%m%d` export OLDDAY=$((NOW -$DeleteDate)) export NOWTIME=`date +%H%M` echo ' > Today = ' $NOW$NOWTIME cd $WEBROOT find $WEBROOT -xdev | grep -v 'nas' > $WEBROOT/achiving.list tar -cf /data/homeplus/backup/homeplus-club-admin/homeplus-club-admin-web/$NOW$NOWTIME.tar -T $WEBROOT/achiving.list echo ' > Backup file : ' /data/homeplus/backup/homeplus-club-admin/homeplus-club-admin-web/$NOW$NOWTIME.tar echo '2. Delete ' $DeleteDate ' day ago = ' $OLDDAY ', but must remain ' $Finalbackupfiles ' files on the backup folder' Totalbackupfiles=`find /data/homeplus/backup/homeplus-club-admin/homeplus-club-admin-web/ -name "*.tar" | wc -l` echo ' > Total backupfiles(all files) = ' $Totalbackupfiles echo ' > Final backup files count = ' $Finalbackupfiles Targetdeletebackupfiles=`expr $Totalbackupfiles - $Finalbackupfiles` echo ' > Total backup files - Final backup files =' $Targetdeletebackupfiles BackupAllFiles=(`find /data/homeplus/backup/homeplus-club-admin/homeplus-club-admin-web/ -name "*.tar" -mtime +$DeleteDate -printf "%f\n" | sort -n`) cnt=1 echo ' > ' $DeleteDate ' day before delete target file list' for i in "${BackupAllFiles[@]}" do if [ $Targetdeletebackupfiles -ge $cnt ] then echo " " $i " , " $cnt " DELETEed !" rm /data/homeplus/backup/homeplus-club-admin/homeplus-club-admin-web/$i else echo " " $i " , " $cnt " SKIPed !" fi let cnt=cnt+1 done echo '3. Delete Web ROOT' cd $WEBROOT ls $WEBROOT | grep -v nas | grep -v export | grep -v achiving.list | grep -v somethingspecial | xargs rm -rf echo ' > Check Web ROOT = '$WEBROOT echo ' > list ' `ls $WEBROOT` echo '4. Copy tar to '$WEBROOT echo ' > cp OOT-jar.tar.gz to '$WEBROOT cp /data/scm/homeplus-club-admin/homeplus-club-admin-web/target/ROOT-jar.tar.gz $WEBROOT echo '5. Decompress TAR.GZ' echo ' > tar -zxvf '$WEBROOT'/ROOT-jar.tar.gz' cd $WEBROOT tar -zxf $WEBROOT/ROOT-jar.tar.gz -C $WEBROOT/ --strip-components=1 echo '6. Clear ' echo ' > Delete ROOT-jar.tar.gz and achiving.list in Web ROOT' cd $WEBROOT rm -rf $WEBROOT/ROOT-jar.tar.gz rm -rf $WEBROOT/achiving.list echo echo '##### FINISH DEPLOY #####' echo 'Bye' -
WebServer용량
-
Was 담당자 배국태입니다.
어떤 웹서버인가요? 웹서버의 성격에 따라 달리 구성해야 할 것으로 판단됩니다.
그룹웨어형 서비스인지, 포탈형 서비스 인지, 트래픽 폭주형 서비스인지 구분을 해야 합니다.
서버 ip 등 관련 정보를 부탁 드립니다.
일단, 간략하게 말씀드리면
사용하는 개념(서버) 이 달라 혼동이 올만합니다StartServers = 3
4이상으로 설정 (최초 기동시 만들어지는 child 프로세스 수, *child 프로세스가 실제로 서비스를 담당합니다.)ThreadsPerChild = 25
60 정도로 상향 조정 (하나의 차일드 프로세스가 가질 수 있는 하위 스레드의 수)* ServerLimit = 16
이 항목은 선언되어 있을 수도 없을 수도 있습니다.
여기서 말하는 서버가 차일드 프로세스 (실제로 서비스하는 개체) 입니다.
증설한다면 보통 50정도 설정. 즉 차일드 프로세스를 50개까지 만들 수 있음MaxRequestWorkers = 400
3000 정도로 상향 조정
워커 하나당 처리하는 request를 말함 (워커 = 워킹스레드)MaxRequestWorkers 가 위의 “ServerLimit” 와 “ThreadsPerChild” 를 곱하여 나오는 값으로 이 값이 Active user에 대응 됩니다(정확히는 리퀘스트 숫자임).
권장값을 대입해 계산해 보면
ServerLimit(50) X ThreadsPerChild(60) = MaxRequestWorkers(3000)
그리고 웹서버가 3대면 3000 X 3 = 9000
지금 22주년 기념 행사 관계로 모바일플랫폼팀에 총력지원(!?)을 하다보니 ….
일단, 지금은 시간이 없어서요
자세한 내용은 다음주 화요일 날 나누는 것으로 하겠습니다.
양해 부탁 드립니다.
From: 류현수
Sent: Wednesday, March 20, 2019 7:57 PM
To: 배국태; 이남준
Cc: 송민수; 김민아[Mina]; 임원진; 김민우; 김힘참
Subject: [Club Online TA] 서버 설정 문의안녕하십니까 Club Online Project의 TA IBM 류현수입니다.
배국태 차장님 문의드릴 내용이 있어서 메일 드립니다.
하기와 같이 서버 설정이 되어 있습니다.
제가 계산한 것이 맞는지 문의를 드립니다.
계산 상으로는 Active user 수가 너무 적은 수치가 나오네요 적어도 웹 서버 하나 당 1,000 Active user( like TPS)는 수용이 가능해야 하는데
Active user 수가 75 정도여서 잘못 계산되었거나, 설정에 문제가 아닌가 싶습니다. 운영 서버라면 웹서버 4대에 max가 300 Active Users가 되네요
설정 내용
웹서버 설정
TimeOut = 60초
MaxKeepAliveRequest = 100 동접자의 최대 요청 수
KeepAliveTimeout = 5초 (5초 동안 요청이 없으면 socket 타임 아웃. 길면 socket handshake 시간을 save할 수 있어 성능은 좋아지나 동접이 준다) 동접이냐 응답속도냐
event MPM 모듈인 mpm_event_module를 사용하고 (worker 방식, fork방식 아님)
StartServers: initial number of server processes to start = 3 (초기 프로세스) 현재 개발 서버는 4개가 동작 합니다.
MinSpareThreads: minimum number of worker threads which are kept spare = 75
MaxSpareThreads: maximum number of worker threads which are kept spare = 250
ThreadsPerChild: constant number of worker threads in each server process = 25 (3 서버 x 25 threads = 총 Max 75 thread ) 그럼 초기에 thread 준비하는 초기 값이 max ?, 250 thread는 도달 불가 ?
MaxRequestWorkers: maximum number of worker threads = 400 thread 여기는 언감생심 ?
MaxConnectionsPerChild: maximum number of connections a server process serves before terminating = 0 (unlimited) 연결은 모두 허용
MaxMemFree : The maximum number of free Kbytes per thread, without calling free() = 100 kbytes ( Max 75x100 = 7,500kbytes ) 7.5Mbytes
결론
단일 서버 최대 접속자 : unlimited client, (제한이 필요하지 않나 싶습니다. Active User 에 pending user add하여 약 1.5배 정도 정의하는 것이 맞지 않을까 합니다. 장애 시에 접속자들이 모두 대기자로 몰려서 정상화 후 바로 또 죽음 ㅠ,.ㅠ 아예 장애 시에는 정당히 대기 시켜야 하지 않을까요)
최대 Active user 75 client (좀 늘려야 하지 않나?), 약 1,000 client로 해야 web에서는 pending되지 않을 듯 싶습니다.
최대 메모리 사용량 7.5Mbytes검증은 성능테스트 시에 임계 테스트에서 확인 해 보겠습니다.
Seller API는 상기한 내용이 맞다면 사용량이 많지 않아서 늘릴 필요는 없을 것 같은데 TimeOut(wait time)이 60chaus 충분할까요 ?
Long transaction의 경우 얼마나 유지하는 것이 맞는지 의견 요청합니다.제가 설정 값을 가지고 게산 한번 해 보았는데, 저도 좀 이상하다는 생각이 듭니다 ㅎㅎ 배국태 차장님 의견 요청드립니다.
감사합니다.
류현수 드림
Tomcat
tomcat instance 분리
0. bash_profile 적용
-
##### alias ##### alias status=/home/alan/script/status.sh alias webd=/home/alan/script/webdwarf.sh alias goweb='cd /app/apache24/bin' alias goweblog='cd /logs/weblog/service' alias gowas='cd /app/tomcat8/tomcat-engine' alias gowaslog='cd /logs/waslog/instance' #### HYUNSU 20190313 ###### alias XXXstart='/app/tomcat8/tomcat-engine/launcher XXX int_XXX1 -Xmx1024m -Xms1024m start' alias XXXstop='/app/tomcat8/tomcat-engine/launcher XXX int_XXX1 -Xmx1024m -Xms1024m stop' alias goXXX='cd /app/tomcat8/instance/XXX' alias goXXXweb='cd /app/homeplus/webapps-XXX' alias goXXXlog='cd /logs/waslog/instance/XXX'
1. 폴더생성
- /app/tomcat8/instance/XXX 생성 자리수는 3자리 정의
2. 인스턴스 복제
- /app/tomcat8/tomcat-engine에서 cp -Rf ./conf ./temp ./work /app/tomcat8/instance/XXX
3. logs, webapps 심볼릭 링크만들기
- ln -s /logs/waslog/instance/adm logs ln -s /app/homeplus/webapps-adm webapps
4. webapps 파일 복사
- cp -Rf /app/homeplus/webapps/* /app/homeplus/webapps-adm
5. catalina.properties 수정
- cp catalina.properties catalina.properties.20190227 logs.dir 변경 추가 : logs.dir=/logs/waslog/instance/XXX
5. context.xml 변경
- cp context.xml context.xml.20190227 PC 관리자 사례
<!-- ######################## context.xml 2019.02.27 hsuryu (IBM) --> <ResourceLink name="jdbc/cosadm" global="jdbc/cosadm" type="javax.sql.DataSource"/> <!-- ######################## context.xml 2019.02.27 hsuryu (IBM) -->
6. server.xml 변경 포트를 설정에 따라 모두 변경한다.
- cp server.xml server.xml.20190227
-
server port : 8005 --> 8105
-
Connector port : 8080 --> 8180 (http port), redirectPort port : 8443 --> 8143
-
AJP/1.3 port : 8009 --> 8109, redirectPort 8443 --> 8143
-
<Connector 에 connectionTimeout="20000" 추가
-
<Engine name="Catalina" defaultHost="localhost">
-
--> <Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> : 웹서버 loadbalancer 설정 참조
-
- Datasource 설정 context.xml 설정 참조
-
<GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <!-- ########## 2019.02.27 hsuryu IBM Added ########## --> <Resource auth="Container" name="jdbc/cosadm" driverClassName="oracle.jdbc.driver.OracleDriver" username="cosadm" password="cos0515adm" url="jdbc:oracle:thin:@10.10.36.129:1521/COSTST" maxIdle="1" maxTotal="3" maxWaitMillis="10000" type="javax.sql.DataSource" validationQuery="SELECT 1 FROM DUAL" /> <!-- ################################################## --> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources>
-
7. tomcat-users.xml admin 사용자 추가
- cp tomcat-users.xml tomcat-users.xml.20190227
-
<role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <role rolename="admin-gui"/> <role rolename="admin-script"/> <user username="tomcat" password="tomcatadm@#" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
8. /manager 적용 (선택적 적용, 비추천)
- - goXXXweb - .../webapps-xxx/manager/META-INF의 context.xml의 주석 처리
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
-
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
-
tomcat 인증서 설치
4016 2019-04-05 14:38:38 cd /app/apache24/conf/ssl/
4028 2019-04-05 14:44:04 cat Wildcard.homeplus.co.kr.key Wildcard.homeplus.co.kr.crt GLOBALSIGN_ROOT_CA.crt > tomcat20190405.pem
4029 2019-04-05 14:44:07 openssl pkcs12 -export -out tomcat20190405.p12 -in tomcat20190405.pem
4031 2019-04-05 14:44:39 vi tomcat20190405.pem <-- 개행 수정
4032 2019-04-05 14:45:06 openssl pkcs12 -export -out tomcat20190405.p12 -in tomcat20190405.pem <-- 패스워드 정의
4035 2019-04-05 14:47:23 keytool -importkeystore -srckeystore tomcat20190405.p12 -srcstoretype pkcs12 -destkeystore tomcat20190405.jks -deststoretype jks
4037 2019-04-05 14:48:26 keytool -list -keystore tomcat20190405.jks <-- 점검
4040 2019-04-05 14:49:57 vi server.xml
<Connector port="8143" scheme="https" secure="true"
enableLookups="false" disableUploadTimeout="true" SSLEnabled="true"
clientAuth="false"
keystoreFile="/app/apache24/conf/ssl/tomcat20190405.jks" keystorePass="tomcatadm@#"
sslProtocol="TLS"
/>
4041 2019-04-05 14:54:31 prdstop
4042 2019-04-05 14:54:38 prdstart
4043 2019-04-05 14:54:45 ps -ef | grep java
4046 2019-04-05 14:57:43 netstat -ant | grep 8143
tomcat instance stop
#!/bin/sh
echo
echo '##### START Waiting for tomcat instance stop #####'
echo
TPATH=/app/tomcat8/tomcat-engine/bin/bootstrap.jar
TOMCAT_USER=alan
WAITINGTIME=60 # Total waiting 60 second
KILL15TIME=30 # Total waiting 60 second
KILL15STATUS=0 # STATUS 1 after kill -15 process
INSTID=$1
SLEEPTIME=2 # sleep 2 second
cnt=1
for (( i=0; i < $WAITINGTIME; i++ ))
do
sleep $SLEEPTIME
#echo " " $i " , " $cnt " !"
runinst=$(ps -ef | grep java | grep -v grep | grep $INSTID | awk {'print $2 $16'})
UNAME=`id -u -n`
if [ e$UNAME != "e$TOMCAT_USER" ]
then
echo "[ Use by only user Account [ $TOMCAT_USER ] Start Fail Tomcat Instance ]"
exit;
fi
if [[ $KILL15TIME -le $cnt && $KILL15STATUS != 1 ]]
then
echo "Kill -15 tomcat process [$1]"
runprocessid=$(ps -ef | grep java | grep -v grep | grep $INSTID | awk {'print $2'})
echo 'Kill -15 tomcat instance process id = '$runprocessid
#echo "##### KILL -15 PROCESS ######"
kill -15 $runprocessid
KILL15STATUS=1
fi
if [ $WAITINGTIME -le $cnt ]
then
echo "Kill -9 tomcat process [$1]"
runprocessid=$(ps -ef | grep java | grep -v grep | grep $INSTID | awk {'print $2'})
echo 'Kill -9 tomcat instance process id = '$runprocessid
#echo "##### KILL -9 PROCESS #####"
kill -9 $runprocessid
sleep 5
break
fi
if [ -z "$runinst" ]; then
echo [$cnt sec]"Stoped Tomcat Instance [$1] $runinst"
break
else
echo [$cnt sec]"Running Tomcat Instance [$1][$INSTID] $runinst"
fi
let cnt=cnt+$SLEEPTIME
done
instcount=$(ps -ef | grep java | grep -v grep | grep $INSTID | awk {'print $2 $16'} | wc -l)
echo "=============================================================="
echo " Tomcat $INSTID Instance STOP "
echo "=============================================================="
echo " Instance Running Count = "$instcount
echo "=============================================================="
echo
echo '##### END Waiting for tomcat instance stop #####'
echo
echo
Scouter
Scouter
## SCOUT 설치 ##
ip : 10.10.29.35
UDP/TCP : 6100
# 변경
/app/scouter/scouter1.7/scouter/agent.host/conf/scouter.conf
/app/scouter/scouter1.7/scouter/agent.java/conf/scouter.conf --> 인스턴스명으로 파일 변경
예)
obj_name=WAS-01
net_collector_ip=127.0.0.1
net_collector_udp_port=6100
net_collector_tcp_port=6100
launcher에 아래 추가
### SCOUT ###
JAVA_OPTS="$JAVA_OPTS -javaagent:/app/scouter/scouter1.7/scouter/agent.java/scouter.agent.jar"
JAVA_OPTS="$JAVA_OPTS -Dscouter.config=/app/scouter/scouter1.7/scouter/agent.java/conf/scouter_$INSTNAME.conf"
JAVA_OPTS="$JAVA_OPTS -Dobj_name=$INSTNAME"