docker를 이용해서 alpine3.2에 apk로 apache2 php83-apache2를 설치하고,
php에선 error_log에 아무것도 설정하지 않고,
apache 에러로그를 /dev/stderr 로 설정하고 실행한 다음,
PHP에서 에러를 냈는데 에러메시지 중 한글이 \xaa\xbb\xcc 이런 식으로 깨져서 나옴.

이유는 apache 2.0.49 버전부터 apache의 에러로그는 무조건 escape되는 정책인 것.
https://perl.apache.org/docs/2.0/user/install/install.html#Apache

문서를 보면 build 할 때 CFLAGS를 이용해 escape 안하게 만들 수도 있지만 production에선 하지 마라고 되어 있음.

이런 저런 방법을 구상해보다가 그냥 php의 error_log를 분리하고 tail -F 하는 방법이 가장 깔끔할 것 같다고 결론을 내림.

그리고 entrypoint의 스크립트에서 이렇게 처리함.

# apache 기본정책으로 UTF-8이 전부 \xXX 식으로 escape되는 문제때문에 php 에러로그 분리
echo "error_log = /tmp/php_error.log" >> /etc/php83/php.ini
touch /tmp/php_error.log && chmod 666 /tmp/php_error.log
tail -F /tmp/php_error.log >&2 &
 
exec httpd -D FOREGROUND

 

Dockerfile에선 이렇게 실행.

ENTRYPOINT ["/path/to/entrypoint"]

 

 

 

Dockerfile에서 바로 하려면 이렇게 해도 됨.

RUN echo "error_log = /tmp/php_error.log" >> /etc/php83/php.ini
RUN touch /tmp/php_error.log && chmod 666 /tmp/php_error.log
CMD sh -c "tail -F /tmp/php_error.log >&2 & httpd -D FOREGROUND"

 

 

그럼 이제 docker logs로 로그를 봐도 php 에러로그로 나온 한글은 깨지지 않음.

 

 

 

 

 

 

 

 

Posted by bloodguy
,