웹서버 에러 – APACHE2가 메모리를 차지해 NGINX 구동 불가 사례

| Updated

요즘 서버가 불안정하면서 평소에 접해보지 못하던 희귀한 사례들을 만나게 되었습니다. 이중 NGINX의 443 포트 메모리가 이미 사용중이라서 NGINX 구동 불가하는 웹서버 에러를 만나 대처한 이야기를 풀어보고자 합니다.

이 현상은 멀웨어에 감염된 사이트를 지우고 다시 설치하는 가운데 만났습니다. 아마 해커가 교묘하게 사이트에서 얼웨어를 제거하면 웹서버가 작동되지 않토록 장난을 친것으로 추정하고 있는데요.

아무튼 멀웨어를 치료 후 서버를 다시 시작하면 시스템이 죽어버립니다.

그럴 겨우 보통 NGINX 웹서버를 체크 시 nginx -t 옵션을 사용해 점검합니다. 그러면 NGINX 세팅 중 문제 없는지를 체크해 이상이 없으면 OK 메세지를 보내는데요.

# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

그리고나서 NGINX 웹서버를 다시 구동시키면 아무런 문제가 없이 작동합니다.

문제 상황

그런데 이 경우는 nginx -t에서는 아무런 문제가 없다가 service nginx restart 명령을 받아 NGINX 웹서버를 다시 가동하려면 에러 메세지를 내면서 NGINX 웹서버를 가동시키지 못합니다.

아래 메세지처럼 ‘systemctl status nginx.service’로 점검하라고 메세지 나오며, systemctl status nginx.service를 이용해 점검해보면

  • NGINX활성화할 수 없으며
  • 여러 address가 이미 사용하고 있다고 합니다.
# service nginx restart Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. # systemctl status nginx.service ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2020-07-02 16:37:00 KST; 28s ago Docs: http://nginx.org/en/docs/ Process: 1109 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE) Jul 02 16:36:57 etrend systemd[1]: Starting nginx - high performance web server... Jul 02 16:36:57 etrend nginx[1109]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in us> Jul 02 16:36:58 etrend nginx[1109]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in us> Jul 02 16:36:58 etrend nginx[1109]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in us> Jul 02 16:36:59 etrend nginx[1109]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in us> Jul 02 16:36:59 etrend nginx[1109]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in us> Jul 02 16:37:00 etrend nginx[1109]: nginx: [emerg] still could not bind() Jul 02 16:37:00 etrend systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE Jul 02 16:37:00 etrend systemd[1]: nginx.service: Failed with result 'exit-code'. Jul 02 16:37:00 etrend systemd[1]: Failed to start nginx - high performance web server

원인 파악

그러면 누가 이미 address를 사용하고 있는지 점검하기 위해 netstat를 점검해 봅니다.

먼저 net-tools을 설치하구요.

apt install net-tools

다음으로 아래 명령어로 네트워크 상황을 점검해 봅니다.

netstat -tulpN

그랬더니 아래와 같이 http로 apache2가 이미 사용하고 있다고 합니다. 여기는 NGINX 웹서버이므로 hhtps는 NGINX가 사용해야 정상이겠죠.

# netstat -tulpN Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost:6010 0.0.0.0:* LISTEN 1185/sshd: root@pts tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN 958/mysqld tcp 0 0 localhost:submission 0.0.0.0:* LISTEN 1315/sendmail: MTA: tcp 0 0 0.0.0.0:***** 0.0.0.0:* LISTEN 687/sshd: /usr/sbin tcp 0 0 localhost:domain 0.0.0.0:* LISTEN 585/systemd-resolve tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN 1315/sendmail: MTA: tcp6 0 0 localhost:6010 [::]:* LISTEN 1185/sshd: root@pts tcp6 0 0 [::]:http [::]:* LISTEN 702/apache2 tcp6 0 0 [::]:***** [::]:* LISTEN 687/sshd: /usr/sbin udp 0 0 localhost:domain 0.0.0.0:* 585/systemd-resolve udp 0 0 45.77.96.212.vul:bootpc 0.0.0.0:*

해결 방안

그렇게 때문에 이 문제 해결을 위해서는 apache2 사용을 중지하고 NGINX를 다시 구동시키면 해결할 수 있습니다. 아래 코드를 사용합니다.

참 쉽죠.

sudo /etc/init.d/apache2 stop sudo service nginx restart

이러면 문제가 해결됩니다. 답을 알았기에 쉬워보이지만 원인과 해결 방안을 모르면 엄청나게 당혹스러운 상황이기도 합니다.