PHP 7.3.1+Xdebug2.7.0beta 1+opcache가 502 Bad Gateway, exited on signal 11(SIGSEGV)이 된 이유와 대응 방법

원인 및 대응 방법


어제(2019-01-24) 시점에 최신php 7.3.1를 사용하여 xdebugopcache를 조합하여 개발 환경을 만들었는데 간혹 발생502 Bad Gateway,phpfpm의 일지를 확인한 후exited on signal 11 (SIGSEGV) 발생했다.
그렇다면 어떻게 대처해야 할까... 트위터에 트윗을 올렸을 때 Derick Rethans산이 보내온 멘션을 받았어요!
There is a bug in OPcache that conflicts with Xdebug (and causes crashes). This is fixed in GIT, and will be released as part of PHP 7.3.2.— Derick Rethans (@derickr) 2019년 1월 24일

원인과 회피 전략까지 계속!




Derick Rethans san. Thank you for the information!


즉, 위에 적힌 내용만 실행하면 문제가 없다는 뜻입니다.


php 7.3.2가 되면 반영https://github.com/php/php-src/commit/325a1139744413420a62d3006c04914587628810이 되기 때문에 이 문제는 발생하지 않을 거라고 생각합니다.p>

もうちょっと細かく経緯と対応方法


어제(2019-01-24) Docker hub의php:7.3-fpm-alpine3.8를 바탕으로PHP 7.3 + xdebug + opcache 개발 환경 조성p>

우선 다음과 같은 것을 준비했다Dockerfile,docker-compose build 해봤다docker-compose upp>

FROM php:7.3-fpm-alpine3.8

RUN apk update \
  && apk upgrade \
  && apk add --no-cache --virtual .gd-deps \
      g++ \
      make \
      autoconf \
  && pecl update-channels \
  && docker-php-ext-install \
      opcache \
  && pecl install xdebug-2.7.0beta1 \
  && rm -rf /tmp/pear ~/.pearrc \
  && docker-php-ext-enable xdebug
# ホントはもっと色々書いてるのですが省略しました。

※ 2019-01-28 추기@tomoyamachiコメント를 참고하여 echo 'zend_extension=xdebug.so' > /usr/local/etc/php/conf.d/xdebug.ini에서 docker-php-ext-enable xdebug로 변경합니다.


또한 php7.3에서 xdebug를 사용하기 위해pecl에서 현재xdebug-2.7.0beta1를 설치해야 합니다.참조https://xdebug.org/의Announcements와https://xdebug.org/updates.php등:처음처럼pecl install xdebug쓰면 안 된다.문서를 잘 봐야지...)


※ phpfpm 이전에 nginx의 구성이 필요했지만, nginx용 Docker file은 생략p>

build와 up 모두 성공했습니다!


에서 브라우저로 보면 움직이는 것 같아!


, 생각해도 한순간...


설정값이 정확하게 반영되었는지phpinfo(), 대략적인 눈으로 확인하기 위해 파일을 고친 후 다시 불러오기 결과502 Bad Gateway!phpfpm 출력의 stderrexited on signal 11 (SIGSEGV)p>

에?


다시 불러옵니다.



보통 표시...어?


가 다시 앞서고 있습니다.


502 Bad Gateway ! exited on signal 11 (SIGSEGV) ! 에!!!


(중복된 후 몇 번 다시 불러보았지만 재현되지 않습니다)


가 되다니, 아, 이 코어 덤프가 되다니.docker core dump를 사용하십시오.


하지만 시간에 따라 아마opcache일 거예요


이므로 opcache를 Off로 설정하십시오.


$ docker-compose exec phpfpm sh
/var/www/app # vi /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
;zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/opcache.so
/var/www/app # kill -USR2 1

docker-compose exec 실행 중인 phpfpm 용기에 들어가sh,

시작

대상 파일을 ;zend_extension=(略)처럼 평론 출력,


kill -USR2 1에서container에서phpfpm을 다시 시작합니다.https://stackoverflow.com/questions/37806188/how-to-restart-php-fpm-inside-a-docker-container


에서 브라우저에서 재부팅을 확인한 후


예쁘게 사라졌어502 Bad Gatewayexited on signal 11 (SIGSEGV).p>

여기서 나는 먼저 "opcache가 이상한 것 같아"라는 제목을 붙였는데, xdebug도 매우 마음에 든다.p>

특히 php7.3이 발표된 후의 날짜가 비교적 짧다. 7.3xdebug의 2.7.0beta1은 이름이 가리키는 바와 같이 베타 버전이다.p>
혹시 이쪽도 이상한가요?아까와 반대로opcache를 사용한 후 다음 순서에 따라 xdebug를 사용하지 않으려고 합니다p>

/var/www/app # vi /usr/local/etc/php/conf.d/xdebug.ini
;zend_extension=xdebug.so
/var/www/app # kill -USR2 1

에서 이것도 예쁘게 사라졌어502 Bad Gatewayexited on signal 11 (SIGSEGV)p>

이기 때문에 opcache+Xdebug 2.7.0beta1+php:7.3-fpm-alpine3.8의 조합에 따라 어떤 오류를 밟을 가능성이 높다고 생각합니다.p>

opcache 또는 xdebug + php:7.3-fpm-alpine3.8라면 문제가 없습니다.


로 시작하는 Tweet에서 갑자기 Derick Rethans산에게서 멘션을 받았어요.p>

감사합니다.p>

그리고 php:7.3-fpm-alpine3.8의 현재 php 버젼을 확인하기 위해 아래 명령을 7.3.1로 확인합니다.


$ docker-compose exec phpfpm php -v
PHP 7.3.1 (cli) (built: Jan 11 2019 00:59:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.7.0beta1, Copyright (c) 2002-2018, by Derick Rethans

알려준workaround에 따라 Docker file에 추가opcache.optimization_level=0x7FFFBBFFp>
FROM php:7.3-fpm-alpine3.8

RUN apk update \
  && apk upgrade \
  && apk add --no-cache --virtual .gd-deps \
      g++ \
      make \
      autoconf \
  && pecl update-channels \
  && docker-php-ext-install \
      opcache \
  && pecl install xdebug-2.7.0beta1 \
  && rm -rf /tmp/pear ~/.pearrc \
  && docker-php-ext-enable xdebug \
  && echo 'opcache.optimization_level=0x7FFFBBFF' >> /usr/local/etc/php/conf.d/opcache.ini

※ 2019-01-28 추기@tomoyamachiコメント를 참고하여 echo 'zend_extension=xdebug.so' > /usr/local/etc/php/conf.d/xdebug.ini에서 docker-php-ext-enable xdebug로 변경합니다.


에서docker-compose build,docker-compose up하고 나니 완전히 정상적으로 작동했어요!


기쁘고 축하할 만하다p>

※ 2019-01-28 추기


원래는 echo 'opcache.optimization_level=0x7FFFBBFF' >> /usr/local/lib/php/extensions/no-debug-non-zts-20180731/opcache.so 등 엉뚱한 일을 썼는데... 정확히 /usr/local/etc/php/conf.d/ 밑에 있습니다.나는 ini다.
echo 'opcache.optimization_level=0x7FFFBBFF' >> /usr/local/etc/php/conf.d/opcache.ini 하는 부분이 잘 모르겠어요. /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini에서 추기하는 방법이 더 좋아요.br/>
아니면 자기가 준비한 거야.또는 ini로 표시된 파일 이름입니다.


ところで…


php7.3 docker에서 검색하면 @tomoyamachi의 글을 발견할 수 있습니다. 이것도 php7입니다.아마 3+xdebug+opcache의... 잘 돌아가고 있는 것 같은데?


은 아마도 상술한 글을 쓸 때 php7.3.0, https://qiita.com/tomoyamachi/items/991a0d149e9585cac15f의 버그가 php7.3.0에서도 발생할 것이라고 느낄 것이다.(단지 훑어보았을 뿐, 잘못하면 맞출 수 없다!)


또는 https://bugs.php.net/bug.php?id=77287에서 xdebug.so를 읽지 않기 위해 댓글을 달았기 때문에 발병하지 않았나요?


이따가 시간 나면 빌려보고 싶어요https://github.com/tomoyamachi/docker-laravel-fpm-7.3/blob/2f65eb12a6215759c62180585142a4d90bafec91/Dockerfile#L26손 옆에도 한번 해볼게요.del>


※ 2019-01-28 추기https://github.com/tomoyamachi/docker-laravel-fpm-7.3에서는 재현성이 있어 위에서 부정선을 추가했습니다.또 자신echo 'zend_extension=xdebug.so' > /usr/local/etc/php/conf.d/xdebug.ini이런 조잡한 글씨를 썼기 때문에docker-php-ext-enable xdebug에서 효과적인 방법을 완전히 소홀히 했으니... 정말 실례입니다!


좋은 웹페이지 즐겨찾기