최근 내 웹사이트에 대한 트래픽이 급격히 증가했습니다. 내 Apache가 계속 충돌합니다. httpd/error_log에 다음과 같은 줄이 있습니다.
[Sun Apr 13 08:57:18 2014] [warn] child process 7792 still did not exit, sending a SIGTERM
[Sun Apr 13 08:57:20 2014] [error] child process 7925 still did not exit, sending a SIGKILL
...
다음 달에 서버를 업그레이드할 예정입니다. 그 전에는 5분마다 확인하는 crond 작업을 사용하여 Apache를 자동으로 다시 시작하는 Bash 스크립트를 작성해 보았습니다.
curl
일부 페이지를 호출해도 200 코드가 반환되지 않으면 fuser -k -n tcp 80
및 /etc/init.d/httpd restart
.
나는 Bash 스크립트를 잘 작성하지 못합니다. 작동하고 Apache를 다시 시작하는 일부 코드를 찾았습니다.
#!/bin/bash
curl -I http://www.mydomain.com/some-empty-page 2>/dev/null \
| head -1 | grep -q " 200 OK"
if [ $? -eq 0 ]; then
echo ""
else
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
다시 시작하기 전에 포트 80을 사용하는 모든 작업을 종료하려면 어떻게 수정해야 합니까?
다음과 같은 작업 줄을 삽입하겠습니다.
else fuser -k -n tcp 80
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
참고: 먼저 다른 경우에 else fuser -k -n tcp 80
실행합니다 ./etc/init.d/httpd restart
답변1
포트 80의 사용법을 오해하신 것 같습니다. 포트 80에서 수신 대기하는 데몬은 하나만 있습니다. 그런 다음 들어오는 요청을 Apache 작업자 데몬으로 전달합니다. 명령 curl
이 HTTP 상태 200을 반환하지 않으면 다시 시작 스크립트를 실행하면 됩니다.
시작되었지만 종료되지 않으려는 Apache를 처리하기 위해 서비스 중지/시작 스크립트에 이미 조항이 있어야 합니다.
다음과 같이 실행된 후에도 다음과 같은 사실을 발견했다면:
$ /etc/init.d/httpd stop
$ pgrep httpd
... returns process ID's...
그런 다음 접근 방식을 약간 변경하여 다음을 수행할 수 있습니다.
$ /etc/init.d/httpd stop
$ pkill httpd
$ /etc/init.d/httpd start
하지만 내가 말했듯이. 이런 일은 정말 해서는 안 됩니다. 서비스 스크립트 /etc/init.d/httpd
자체는 이러한 상황을 올바르게 처리할 수 있을 만큼 강력해야 합니다.
스크립트 수정
나는 당신이 가지고 있는 것을 다음과 같이 수정하겠지만, 그렇지 않으면 IMO를 있는 그대로 사용해도 괜찮습니다.
#!/bin/bash
response=$(curl --write-out %{http_code} --connect-timeout 5 \
--silent --output /dev/null http://www.mydomain.com/some-empty-page)
if [ $response -eq 200 ]; then
echo "All's well"
else
/etc/init.d/httpd restart
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
기능을 종료하려면 else 절을 변경하십시오.
else
/etc/init.d/httpd stop
pkill httpd
/etc/init.d/httpd start
echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi
예를 들어 수행하려는 재시작의 심각도에 따라 pkill
더 심각한 종료 신호(SIGKILL이라고도 함 -9
)를 제공하도록 확장할 수 있지만 저는 전자부터 시작하겠습니다. Apache 중단이 발생하면 다음에 else 절을 추가하세요. Apache가 여전히 응답하지 않는 경우 SIGKILL을 사용하십시오.