PHP 8.4/8.5 + NextCloud + php-fpm 사용시 발생하는 SIGABRT (Lazy Objects 이슈))

PHP 8.4/8.5 + php-fpm 환경에서 Nextcloud를 운영하던 중, OPcache를 켜면 php-fpm 워커가 coredump를 남기며 죽는 문제를 만났다.
처음엔 OPcache가 범인인 줄 알았지만, 디버그 빌드로 coredump 백트레이스를 떠보니 진범은 전혀 다른 곳에 있었다.
이 글은 coredump 발생·캡처 → gdb 백트레이스 추출 → 해석 → 설정 적용까지 전체 과정을 그대로 정리한 것이다.

증상

PHP 8.4/8.5 + php-fpm + nginx 환경에서 Nextcloud를 운영 중이었다.
opcache.enable=1 이면 php-fpm 워커가 무작위 시점에 죽으면서 502 에러가 발생된다.
opcache.enable=0 으로 opcache를 사용하지 않도록 설정하면 정상적으로 서비스된다.

gitlab v18.5.3 업그레이드 후, Background migrations - BackfillPartitionedProjectDailyStatistics: project_daily_statistics 실패 처리

gitlab v18.5.3 이후 버전을 업그레이드하면 background migration 작업 하나가 실패한다.
"BackfillPartitionedProjectDailyStatistics: project_daily_statistics" 작업으로 실패 후
다음 버전으로 업그레이드 시, DB migration 작업에 오류가 발생해서 시스템이 꼬이는 상태가 
발생된다. 이에 대한 원인과 해결 방안을 간략하게 정리한다.

gitlab v18.5.3 버전으로 업그레이드를 진행하면 아래와 같은 background migration 오루가 발생되고 원인을 확인하면
아래와 같은 오류 메시지를 확인할 수 있다.

ansible의 custom module 만들기

ansible을 사용하다보면, 여러가지 제약 사항을 맞닥들이게 되는데 그러다 보면 custom module을 만들 때가 생기는데, 이에 대한 간단한 가이드를 만든다.

Ansible custom module 만들기

Ansible을 통해 배포를 진행할 때, roles를 구성해서 만든다.
이때 roles 하위에 component를 생성하는데, "library" 디렉토리를 생성하고 custom module을 만들면 된다.

이번에 예제로 만든 것은 Dictionary 데이터와 key(string) 데이터를 받아서 key가 존재하면 데이터를 반환하면 모듈이다.

디렉토리 구조는 아래와 같다.

ubuntu 24.04에 mongodb 4.0 설치하기

mongodb 4.0이 EOL이 된 상태로 ubuntu 24.04에서는 지원되지 않는다.
그러나 아래 방법으로 강제로 설치는 가능하다.

DB 생성, collection 생성, 데이터 입출력이 가능한 것 까지는 확인했다.

 

아래와 같이 설치에 필요한 mongodb 설치 파일을 다운받는다.
mongodb 4.0은 더 이상 repository를 통해 업데이트가 중지되어 있다.

 

https 인증서(certification) 구성, 검증, 분석 - Deep Dive

일반적으로 https 통신을 하기 위해서 인증서를 구매하거나 ACME(Automatic Certificate Management Environment) 중 하나인 "Let's Encrypt" 통해 많이들 갱신한다.

이때 발생하는 여러가지 인증서의 종류를 알고 이를 검증, 시스템에 적용하는 방법을 확인한다.

 

HTTPS 인증서의 종류

  - ROOT Certificate : 정식 인증기관에서 발행하는 인증서로 시스템에 저장되어 있다.

  - Intermediate Certificate : ROOT Certificate와 Site Certificate를 연결해주는 인증서로 Chain Certificate라고도 불린다. 

  - End-entify Certificate : 업체에서 구매하여 사이트에 적용하는 서버용 인증서

 

kubernetes의 metrics deep dive - kubelet의 cAdvisor

kubernetes에서 metrics-server와  prometheus는 kubernetes의 어딘가에서 발생하는 메트릭을 수집해서 보여준다.
pod의 CPU 사용량, Memory 사용량 등과 같은 메트릭이 어딘가로 부터 제공해주고, 이를 수집하는 것이다.
이에 대한 정확한 메커니즘을 확인한다.

 

kubelet의 cAdvisor 기능

cAdvisor는 여러가지 리소스를 위해서 Google에서 개발된 모듈이다.

https://github.com/google/cadvisor

해당 모듈이 kubelet에 포함되어 동작한다.

https://github.com/kubernetes/kubernetes/tree/master/pkg/kubelet/cadvisor

kubernetes dashboard 설치 - retired (deprecated)

kubernetes에 공식 문서에 dashboard 설치 가이드가 존재한다.
그런 이유로 간단하게 설치하는 방법만 정리한다.

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

2026/02/02일 현재 kubernetes dashboard를 기존에 나온 가이드로 설치하려면 실패한다.

https://kubernetes.github.io/dashboard/ 해당 페이지는 더 이상 존재하지 않아 helm 설치가 불가능하다. 그러나 아래 workaround로 아직은 사용이 가능하다.

최근 대안으로 headlamp가 거론되고 있다.

 

 

 

kubernetes custom metrics을 사용한 HorizontalPodAutoscaler 구현

Prometheus adapter로 구현한 custom metrics을 통해 HorizontalPodAutoscaler를 구현해본다.

 

prometheus adapter Rule 이해 - Deep Dive
https://blog.encicle.com/prometheus-adapter-rule-ihae-deep-dive

 

위 예제를 진행했다면, traefik의 메트릭에 대해서 아래와 같이 3개의 resource를 분리해서 커스텀 메트릭을 저장하고 있다.

prometheus adapter Rule 이해 - Deep Dive

prometheus adapter의 rule 수정을 통해 다양한 사례를 예제로 살펴보고 깊이 이해하는 섹션을 갖는다.

prometheus-adapter Rule의 Resouce 추가를 통한 API 리소스 분리 예제

traefik_service_requests_total 메트릭은 아래와 같이 code, container, ... , namespace, pod, service, ingress와 같은 라벨이 붙어 있다.

Prometheus에 수집된 메트릭 정보