NGINX rewrite 버그 패치하기

NGINX rewrite 버그 패치하기

웹서버 데몬으로 주로 아파치를 사용하는데 점차 NGINX를 이용하는 사례가 늘고 있습니다. NGINX는 가볍고 아파치보다 속도가 빠르다고 하네요. nginx에 대한 자세한 스펙 및 설명은 http://nginx.org 를 참고하시기 바랍니다.

아마존 EC2에 enginx + php-fpm + maria db를 패키지로 설치하고 기존에 운영하던 웹사이트를 이전해보았습니다. 체감 속도가 빠른것 같은데 약간의 문제가 있습니다. 게시물을 작성하고나서 get이나 post로 넘어오는 변수값이 사라지는 문제를 발견하고 이를 수정하기 위해 구글링을 해보았습니다.

결국 문제의 해결은 페이스북 nginx korea 그룹에서 김지원 님께서 해주셨는데 nginx의 소스까지는 자세하게 모르기 때문에 얻어 들은 해법을 공개합니다.

 

nginx-1.7.7의 소스를 기준으로 설명하겠습니다.

src/http/modules/ngx_http_rewrite_module.c:586 입니다.

clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];
clcf->loc_conf = ctx->loc_conf;
clcf->name = pclcf->name;
clcf->noname = 1;

if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {
return NGX_CONF_ERROR;
}

위에서 보면 clcf 는 실제 nginx에 설정된 location 설정 값들이 저장되어 있습니다. 우선 설명하고 넘어가야 할것이 nginx는 if의 처리를 location의 처리와 동일한 방법으로 처리하고 있습니다. location 처리는 이전까지 가지고 있던 request와 config값을 저장 후 필요한 처리가 끝나면 다시 이전의 설정을 복원해주게 됩니다. if도 역시 해당 처리 부분이 있는데 try_files 같은 경우는 불행히 값을 복원해주지 않습니다…. 정확은 개발자의 의도는 모르겠습니다. . . 실수라고 하기에는 너무 오래전부터 공공연하게 있던 이야기라 …
암튼 해당 부분을

clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];
clcf->loc_conf = ctx->loc_conf;
clcf->name = pclcf->name;
clcf->noname = 1;
//해당 라인을 추가하면 if를 거치더라도 try_files의 설정을 사용 가능
clcf->try_files = pclcf->try_files;

if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {
return NGX_CONF_ERROR;
}

딱 한라인만 추가하시면 if구문을 태우더라도 try_files 설정이 사라지는 경우는 없어집니다.
이뿐만 아니라 특정 모듈들의 config 설정 후 if를 태우게 되면 심각한 경우 nginx thread에서 segfault가 발생되는데 해당 부분도 역시 비슷한 방법으로 수정 가능합니다.

 

수정한 소스 다운로드 : nginx-1.7.7

Tags: