Apache Http Server의 기본 프로세스 모델과 systemd-exec 연관
Apache는 기본적으로 다중 프로세스 모델이며 크게 두가지로 볼수 있다.
마스터 프로세스 : 특권 포트(80,443)를 Bind 하고 설정파일(httpd.conf)를 읽고 자식 프로세스를 관리
자식 프로세스 : 실제로 클라이언트의 요청 처리(http 요청 수신 및 응답 생성)
이러한 동작은 MPM(Multi-Processing Module)을 통해 스레드 관리를 한다
prefork: 각 자식 프로세스가 단일 스레드로 동작, 요청마다 별도의 프로세스 할당 |
worker: 다중 프로세스-다중 스레드 하이브리드 모델, 각 프로세스가 여러 스레드 실행 |
event: worker 기반이지만 Keep-Alive 연결 관리 최적화 |
Apache 시작 방식의 차이점
systemctl start httpd | systemd를 통하기 때문에 journalctl -u httpd 로 확인이 가능함. systemd는 자체적으로 프로세스 상태를 모니터링하고 필요한 경우에 재시작함. |
httpd -k start | apache 자체 제어 명령 httpd 바이너리가 직접 마스터 프로세서가 되고, 자식 프로세서를 생성함. systemd를 거치지 않고 직접 제어함. 따라서 자동 재시작은 별도로 구현해야함. |
기본적인 Prod 환경에서의 동작방식에는 Systemd를 보편적으로 많이 쓰고있다
Systemd에서 httpd.service 파일을 읽어 Execstart에 정의된 명령으로 실행하게 되는데.
이 둘에 대해 이해를 해보도록 하자.
■ Systemd.
기본적인 리눅스 현대 시스템 및 서비스 관리자.
리눅스에서 시스템 초기화와 서비스 관리를 담당하는 소프트웨어이다.
컴퓨터가 켜질때 커널이 로드 된 후 가장 먼저 실행되는 프로세스(PID 1)가 되며
Unix 시스템에서는 Init이 담당했으나 교체되었다. 정도로만 알고있으면 된다.
Systemd에서 d는 daemon을 의미하며 시스템 전체를 관리하기 하는 데몬 이라는 의미이다
Exec로 시작하는 지시어들은 서비스의 다양한 생명주기 단계에서 실행할 명령을 지정한다.
그렇다면 Daemon은 Exec를 유지하기 위해 필요한 것인가? 맞기도 하고 틀리기도 하다.
두 개념은 서로 다른 목적을 가지고 있다.
■ Deamon
사용자 상호작용 없이 백그라운드에서 실행되는 특수한 유형의 프로세스
> 터미널이나 사용자 세션에 연결되지 않고 독립적으로 실행된다. 그렇기에 사용자와 직접 상호작용하지 않는다.
마치 베스천서버에 접근시 동작시키는 ~/.profile과는 다른 방식이다.
■ Exec
시스템 서비스를 제공하기 위한 시스템 호출, 명령
> 단순히 프로세스를 다른 프로그램으로 대체하는 시스템 호출이고, 데몬화 과정에서 사용될수는 있지만 필수적인 것은 아니다. 직접 서비스를 제공하는 것이 아니라 서비스를 제공하는 프로그램을 실행하는 매커니즘이다.
요약 및 정리.
Apache HTTP Server의 경우, systemd를 통해 시작할 때(systemctl start httpd), systemd가 서비스 파일의 ExecStart 지시어를 사용하여 httpd 프로세스를 실행하게되는데. 이때 내부적으로 exec 메커니즘이 사용된다.
따라서 웹서비스가 동작중인데 아래와 같이 systemd로 조회가 안될때는
[root@web~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: failed (Result: protocol) since Tue 2025-02-25 18:32:20 KST; 2 weeks 5 days ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 21544 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)
Main PID: 21544 (code=exited, status=0/SUCCESS)
Feb 25 18:32:19 gjao-con-erp-web.novalocal systemd[1]: Starting The Apache HTTP Server...
Feb 25 18:32:20 gjao-con-erp-web.novalocal httpd[21544]: httpd (pid 7633) already running
Feb 25 18:32:20 gjao-con-erp-web.novalocal systemd[1]: Failed to start The Apache HTTP Server.
Feb 25 18:32:20 gjao-con-erp-web.novalocal systemd[1]: Unit httpd.service entered failed state.
Feb 25 18:32:20 gjao-con-erp-web.novalocal systemd[1]: httpd.service failed.
Mar 05 03:41:01 gjao-con-erp-web.novalocal systemd[1]: Unit httpd.service cannot be reloaded because it is inactive.
아래와 같이 httpd 프로세스가 돌고있는지 체크하도록 하자
[root@web ~]# ps -ef |grep httpd
root 7633 1 0 2023 ? 01:06:48 httpd -k start
apache 29291 7633 0 17:11 ? 00:00:00 httpd -k start
apache 29608 7633 0 17:11 ? 00:00:00 httpd -k start
apache 29609 7633 0 17:11 ? 00:00:00 httpd -k start
apache 30314 7633 0 17:12 ? 00:00:00 httpd -k start
apache 31074 7633 0 17:13 ? 00:00:00 httpd -k start
apache 31075 7633 0 17:13 ? 00:00:00 httpd -k start
apache 31935 7633 0 17:14 ? 00:00:00 httpd -k start
apache 31968 7633 0 17:14 ? 00:00:00 httpd -k start
apache 31982 7633 0 17:14 ? 00:00:00 httpd -k start
apache 31983 7633 0 17:14 ? 00:00:00 httpd -k start
apache 32428 7633 0 17:14 ? 00:00:00 httpd -k start
root 32655 28632 0 17:14 pts/0 00:00:00 grep --color=auto httpd