Nginx, PHP-fpm, userdir

동아리에서 실습 서버를 구축하는데 아이들이 각자 웹페이지를 만들 수 있도록 userdir를 설정하고 싶었다.
userdir을 설정하면 계정마다 ~/public_html 디렉터리 밑에 파일들을 만들어 두면 server-name/~username 같은 URL로 접속할 수 있게 해 주어서 학교에서 자주 쓰인다.

아파치에서는 userdir 모듈을 로드하고 PHP도 주석 하나만 풀면 되는데 Nginx에서는 좀 어려웠다. 아무리 설정파일들을 찾아 봐도 PHP는 실행이 안 되었다. 그러다가 되는 설정을 찾았고 역시나 location 구문을 두 번 적고 중복되는 부분도 참 많다. Nginx에서 이 부분은 얼른 개선해 주면 좋겠는데 일부러 안 하는 듯 하다.

Nginx에서 sub-directory에 proxy pass 설정하기

btsync 서버를 띄우면 기본적으로 0.0.0.0:8888에 Web UI가 바인딩 되는데 아무리 http basic auth를 지원한다지만 어차피 평문으로 전송되기에 별 의미는 없다. 그래서 nginx에 있는 reverse proxy 기능을 이용해서 /btsync/에 물려보기로 했다. 이러면 https로 통신하니 조금 안전해지기 때문이다.
설정은 대충 아래와 같다.

처음에 proxy_redirect를 써주지 않았는데 이러면 btsync에서 처음에 302 redirect를 주는데 이걸 nginx에서 그대로 전달하기 때문에 /btsync/gui/로 가야 할 것을 /gui/로 가게 된다. 그래서 저렇게 써야 하는데 왜 nginx는 저렇게 설계했나 모르겠다. 저 정도는 써주지 않아도 알아서 잘 동작해야 하는 것 아닌가.

nginx로 넘어오고나서 저렇게 중복해서 적어줘야 하는 게 많은 것 같아 아쉽다.

uWSGI에서 thread 활성화

며칠 전에 웹서버 환경을 apache2, php5, mod_wsgi에서 nginx, php5-fpm, uwsgi로 바꿨는데 오늘 확인해보니 flask 앱중 하나가 계속 DB를 잡고 놔주질 않아서 Lock이 걸린 채로 서비스가 동작하질 않고 있었다.
uwsgi를 끄면 lock이 해제되는 걸 봐서 uwsgi로 돌리고 있던 게 문제인게 확실한데 테스트 해보면 잘 돌아가서 삽질을 또 엄청 했다.

확인 해보니 계산이 많이 필요한 작업은 스레드를 따로 돌려놨는데 이게 그냥 돌리면 돌아가지만 uwsgi 위에선 전혀 돌지 않고 있었다. 찾아보니 uwsgi는 기본적으로 멀티스레드가 꺼져 있었다. 실행 할 때 --enable-threads를 붙여서 실행해야 하고 ini파일에선 enable-threads = true라는 한 줄을 추가해주면 된다. 이제서야 정상적으로 돌아간다.

최근 nginx로 바꾸면서 익숙하지 않은 걸 여러 개 접하다 보니 삽질을 많이 하는 것 같다.
아직도 내가 찾지 못한 문제가 있을 것만 같아 두렵다.