Linux

apache http1.1 aws alb http2 enable error

safari 계열의 브라우저에서 내 블로그가 정상적으로 열리지 않았다.
여러번 시도해야 열렸고, 한번에 열리지 않았다.

이원인을 찾기위해서 로그분석부터 부단한 노력을했으나, 한동안 해결할수 없었다.

그런데 어제 오픈카톡방의 박주혁 님께서 safari에서 정상적으로 열리지 않는다는 스크린샷을 올려주셨다.

인증문제가 아닐까 생각했지만 인증문제는 아니었고 이문제를 해결하기 위해선 내 웹서버의 설정을 설명해야 한다.

amazon linux에서는 httpd-2.4.39-1.amzn2.0.1.x86_64이 기본으로 설치되는 apache 이다. 그리고 php는 여러가지 버전을 repo로 지원하고 있는데
amazon-linux-extras 명령어로 사용가능한 repo를 확인할수 있다.

일단 이부분에서 내가 old한 엔지니어라는 사실을 알았다.
나는 apache-php 연동은 반드시 module로 연동을 한다.
그런데 amazon linux는 amazon-linux-extras install php7.3 명령어를 사용하면 module로 설치하는 것이 아닌 php-fpm 방식으로 php가 설치된다.

그렇기에 나는 몇가지 old한 설정을 추가하였다.

apache 는 온프레미스에서 의례 사용하던 방식인 prefrok 방식으로 설정하였고, php는 fpm이 아닌 module로 셋팅하였다.

여기서 문제가 발생한것이다.
아래 URL에서 발췌한 내용이다.
HTTP/2 is supported in all multi-processing modules that come with httpd. However, if you use the prefork mpm, there will be severe restrictions.

https://httpd.apache.org/docs/trunk/howto/http2.html

http2 를 사용하려면 prefork를 사용하기 어렵다.
그런데 필자는 prefork 를 사용하였기 때문에 정상적으로 호환이 되지 않은 것이다.

aws alb(http2) - apache (prefork)강제로 http2사용

aws의 ALB는 http2를 기본으로 enable하게 되어있기때문에 정상적인 커넥션이 불가능했던것이다.

일단 급하게 ALB에서 http2를 껏다.

그리고 오늘 mpm을 event로 돌리고 http2를 강제로 사용하게 했던 설정을 빼고 php-fpm으로 웹사이트를 사용할수 있게 변경하였다.
이후엔 정상적으로 사이트가 동작했으며, 간헐적으로 열리지 않는 증상은 사라졌다.

이글을 빌어 다시한번 박주혁님께 감사를 드린다.

앓던 이가 빠진기분이다.

유레카!

ssm 과 user 디렉토리 퍼미션의 상관 관계

고객사에서 ubuntu user 에 777 퍼미션을 부여해 버렸다.

chmod -R 777 /home

home 디렉토리 하단으로 모든 퍼미션이 777이 부여되었고 ubuntu계정까지 777 권한이라 KEY를 사용하여 로그인을 할수 없는 상태가 되어버렸다.

이경우에 할수있는 방법은 SSM session manager로 접속할수 있다면 간단하게 해결되었을 문제이나 신규로 생성된 인스턴스인터라 SSM을 사용하고 있지 않았다.

이경우엔 다른인스턴스에 /home 파티션만 떼서 붙여서 권한을 복구한다음에 정상화 할수 있었다.

session manager 는 권한과 상관없이 동작하는지 확인하고 싶었다.

세션 매니저로 접속

root 15229 1.0 1.5 543752 15912 ? Sl 10:30 0:00 _ /usr/bin/ssm-session-worker root-0f7a9e1a4bbc90b i-052ebb4feade551
ssm-user 15242 0.0 0.3 124264 3280 pts/0 Ss 10:30 0:00 _ sh

쉘에서 확인시에 세션을 연결하면 위와같이 확인이된다.

유저 접속 확인

root@ip-10-0-0-12 home]# w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root@ip-10-0-0-12 home]# last
reboot system boot 4.14.133-113.112 Wed Aug 28 12:43 - 10:34 (21:50)

session manager 는 w나 last에서 확인할수 없다. 로그인 내역은 aws console 에서 확인해야 하고 실제로 인스턴스 내에서 확인하려면 messages 로그에서 확인해야 한다.

Aug 29 11:33:49 ip-10-0-0-12 amazon-ssm-agent: 2019-08-29 11:33:49 INFO [MessageGatewayService] [EngineProcessor] [OutOfProcExecuter] [root-0aa231b76382aca8c] channel: root-0aa231b76382aca8c not found, creatinga new file channel…

Aug 29 11:33:49 ip-10-0-0-12 amazon-ssm-agent: 2019-08-29 11:33:49 INFO [MessageGatewayService] [EngineProcessor] [OutOfProcExecuter] [root-0aa231b76382aca8c] inter process communication started

ssm 세션 생성시에 발생하는 로그다.

이제 ssm user 에 777 부여후에 정상적으로 로그인 되는지 확인해 보겠다.

root@ip-10-0-0-12 home]# chmod 777 -R ssm-user

root@ip-10-0-0-12 home]# ls -al
drwxrwxrwx 2 ssm-user ssm-user 83 Aug 20 22:27 ssm-user

root@ip-10-0-0-12 ssm-user]# ls -al
-rwxrwxrwx 1 ssm-user ssm-user 265 Aug 28 13:26 .bash_history
-rwxrwxrwx 1 ssm-user ssm-user 18 Jul 28 2018 .bash_logout
-rwxrwxrwx 1 ssm-user ssm-user 193 Jul 28 2018 .bash_profile
-rwxrwxrwx 1 ssm-user ssm-user 231 Jul 28 2018 .bashrc

정상적으로 연결되는것을 확인할 수 있었다.

key로 연결되는 계정은 권한으로 인해 접속불가 상태에 빠질수 있지만
session manager 는 인스턴스가 클라이언트가 되어 동작하는 방식이라 user 디렉토리 권한과는 상관없이 정상적으로 접근이 가능한것을 알수있다.

사실 조금 쓸데없는 테스트이긴 하나 도움이 되면 좋겠다!

아디오스!

aws ec2 instance 상태이상 확인

갑자기 블로그가 안열렸다. 따로 모니터링을 설정한건 아니라서 다운된지 몰랐다. 먼저 aws console 에서 인스턴스의 상태를 확인해 보기로 했다.

상태검사를 통과 하지못한 인스턴스가 확인된다. 이럴땐 ec2 상태검사 탭을 확인한다.

서버가 죽은지 벌써10시간째. 모니터링을 설정해 놨어야 했는데 불찰이 느껴진다. 일 단 트러블 슈팅을 시작한다.

첫번째로 로그인을 진행해 본다. ssm 세션매니저를 통해서 접속해본다.

응. 안돼. 돌아가
접속할수 없다.

그럼 차선책으로 인스턴스의 스크린샷을 확인해 본다.

인스턴스 설정에서 시스템로그 가져오기는 dmesg 를 보여준다 그래서 이경우에 필요가 없다. 인스턴스가 행이 아니라 리부팅중 멈추거나 인스턴스 부팅 장애의 경우에는 시스템 로그가져오기로 봐야한다.

메모리...메ㅗㅁㅣㄹ............!!!!!!!!!!!!!!

프리티어라 죽었다.

재시작은 안되고 인스턴스를 중지한다. 재시작이 안될경우 중지/시작을 해야한다.

EIP 가 연결되지 않은 인스턴스의 경우엔 IP가 변경된다 EIP를 붙여서 사용하자

중지중이다.
중지중에 모니터링 그래프를 확인해 본다.

며칠전 포스팅했던 cloudwatch 를 이용한 메모리와 하드디스크 체크이다.
메모리가 훅 날라간게 보인다.

리부팅 완료하고 인스턴스의 상태가 정상으로 변경되었다. 그렇다면 정확한 이유를 알아야한다.

messages 로그에서 확인한 내용이다 스왑도 없고 메모리도 없어서 죽었다.
사실 프리티어라 swap 이 없다. 이후에 파일스왑으로 2G정도 만들어줄계획이다.

Aug 27 21:19:51 ip-10-0-0-12 kernel: active_anon:214310 inactive_anon:7454 isolated_anon:0#012 active_file:326 inactive_file:360 isolated_file:0#012 unevictable:0 dirty:0 writeback:0 unstable:0#012 slab_reclaimable:3331 slab_unreclaimable:5159#012 mapped:7669 shmem:7487 pagetables:3235 bounce:0#012 free:12190 free_pcp:180 free_cma:0
Aug 27 21:19:51 ip-10-0-0-12 kernel: Node 0 active_anon:857240kB inactive_anon:29816kB active_file:1304kB inactive_file:1440kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:30676kB dirty:0kB writeback:0kB shmem:29948kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB writeback_tmp:0kB unstable:0kB all_unreclaimable? no
Aug 27 21:19:51 ip-10-0-0-12 kernel: Node 0 DMA free:4464kB min:736kB low:920kB high:1104kB active_anon:11168kB inactive_anon:44kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:15988kB managed:15904kB mlocked:0kB kernel_stack:0kB pagetables:32kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kBAug 27 21:19:51 ip-10-0-0-12 kernel: lowmem_reserve[]: 0 932 932 932
Aug 27 21:19:51 ip-10-0-0-12 kernel: Node 0 DMA32 free:44296kB min:44316kB low:55392kB high:66468kB active_anon:846072kB inactive_anon:29772kB active_file:1304kB inactive_file:1440kB unevictable:0kB writepending:0kB present:1032192kB managed:991428kB mlocked:0kB kernel_stack:6352kB pagetables:12908kB bounce:0kB free_pcp:720kB local_pcp:720kB free_cma:0kB
Aug 27 21:19:51 ip-10-0-0-12 kernel: lowmem_reserve[]: 0 0 0 0
Aug 27 21:19:51 ip-10-0-0-12 kernel: Node 0 DMA: 84kB (UME) 88kB (UME) 1116kB (UE) 932kB (UE) 964kB (UME) 4128kB (UE) 5256kB (UME) 1512kB (E) 11024kB (E) 02048kB 04096kB = 4464kBAug 27 21:19:51 ip-10-0-0-12 kernel: Node 0 DMA32: 10224kB (UE) 4008kB (UE) 24116kB (UME) 13832kB (UME) 14364kB (UME) 61128kB (UE) 12256kB (ME) 13512kB (UE) 21024kB (UM) 02048kB 04096kB = 44296kB
Aug 27 21:19:51 ip-10-0-0-12 kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB

그럼 왜 스왑도 메모리도 없었을까? 웹서버 이므로 웹로그를 확인해 보았다.

어제 급하게 포스팅하느라 업로드한 파일들을 재대로 처리못하고 죽은거다.

아놔~~~~~~~~~~~~

이후로 모니터링 체크하나 만들어서 알럿하도록 설정하는 포스팅을 작성하겠다.

좋은하루 되시라!

사이트는 잘열리는것을 확인할수 있었다!

mysql innodb extra backup 스크립트

#엑스트라 백업 설치
rpm -Uhv https://www.percona.com/redir/downloads/percona-release/redhat/percona-release-0.1-4.noarch.rpm

#yum 으로 설치
yum install xtrabackup

#디렉토리 확인
ll /backup
ll /backup/full_backup
ll /backup/incre_backup

#디렉토리 생성
mkdir /backup
mkdir /backup/full_backup
mkdir /backup/incre_backup

#crontab 에 설정
* */1 * * * root /root/bin/mysql_innodb_backup.sh


crontab 와 db_full_backup_time 은 중요합니다.스크립스트는 crontab 실행될때 백업이 되며, db_full_backup_time이 아닐경우 차등백업을 실행합니다.


따라서 1시간마다 백업을하며 db_full_backup_time이 있을경우에 full 백업을 합니다.

아래의 스크립트에서 03 15을 변수로 줄경우 배열로 받아서 참일경우 full 백업 거짓일경우 차등백업을 진행합니다.따라서 새벽 3시 오후3시에 백업을 진행 합니다. 

!/bin/bash

DB Backup

BAK_DIR=/backup;
TODAY=$(date +%Y%m%d --date '12 hours ago')

TODAY=$(date +%Y%m%d)

RMTODAY=$(date +%Y%m%d --date '10 days ago')

Delete DB File

rm -rf $BAK_DIR/full_backup/$RMTODAY*
rm -rf $BAK_DIR/incre_backup/$RMTODAY*

Backup Time

db_full_backup_time=("03 15")

Now Time & Time Check

TOTIME=$(date +%H)

TOTIME=$(date +%H)

echo $TOTIME
in_array() {
local needle array value
needle="${1}"; shift; array=("${@}")
for value in ${array[@]}; do [ "${value}" == "${needle}" ] && echo "true" && return; done
echo "false"
}

db_full_backup_check=in_array $TOTIME ${db_full_backup_time[@]}

if [ "$db_full_backup_check" == "true" ]; then
# full backup
/bin/nice -n 10 /usr/bin/ionice -c2 -n 7 /usr/bin/innobackupex --defaults-file=/etc/my.cnf \
--user=root --password='1234' --slave-info --no-timestamp \
--compress $BAK_DIR/full_backup/$TODAY
else
# hot backup
/bin/nice -n 10 /usr/bin/ionice -c2 -n 7 /usr/bin/innobackupex --defaults-file=/etc/my.cnf \
--user=root --password='1234' --no-timestamp --compress --incremental \
--incremental-basedir=$BAK_DIR/full_backup/$TODAY $BAK_DIR/incre_backup/$TODAY/$TOTIME
fi

aws cloud watch 여러대의 인스턴스에 대한 하나의 경보 생성.ver2

cloudwatch 경보생성 입니다.

여러대의 인스턴스를 하나로 묶어서 경보생성할때 사용하는 방법입니다.

경보 생성을 누릅니다.

지표 선택을 눌러서 지표를 확인합니다.이번에 경보를 생성할 지표는 "CPUUtilization"입니다.

검색하여 체크 후에 '그래프로 표시된 지표' 를 누릅니다.
표시된 지표는 9개 까지 체크하여 추가할수 있습니다.

제한사항으로

 수학표현식을 추가합니다.
수학 표현식은 상황에 따라 잘 사용하기로 바랍니다.https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/using-metric-math.html
이번에는 CPU사용량이 1대라도 70% 를 넘을 경우 경보를 생성할 것이므로 사용한 표현식은 MAX(METRICS()) 입니다.

전체를 체크할 경우 아래와 같이 지표선택 버튼이 활성화 되지 않습니다.

사용할 수학 표현식 하나만 체크해야 생성이 가능합니다.

위와같이 지표를 생성후에 경보생성은 SNS 를 사용해야 하므로 SNS 사용법은 각자 확인해보시기 바랍니다. 

즐거운 하루되세요~