Python을 사용하여 웹서버를 구축하는 경우 nginx와 uwsgi를 사용한 웹서버 구성이 많이 사용됩니다. 저 역시 오랜 기간 이와 같이 사용해왔죠.

uwsgi를 nginx서버와 연동하는 방법으로 웹소켓(socket)을 사용하는 방법이 있습니다. 얼마 전 잘 사용하던 AWS에서 Naver Cloud 서비스로 서버를 이전하면서 이 둘 사이의 연결이 잘 되지 않아 큰 위기를 겪게 되었죠.

문제가 된 상황은 소켓 파일에 Permission에러가 발생한다는 것입니다... 제가 할 수 있는 여러가지의 조치를 취해서 다시 해보았지만 결국 이를 해결하지는 못했습니다. 물론 더 많은 시도와 해결 방법을 찾을 수 있겠지만 시간이 너무 오래 걸릴 것 같아 포기하고 소켓통신을 파일에서 port로 설정을 변경하여 해결했습니다. 물론 소켓 파일을 계속 써야한다면 아래 글은 해결책이 될 수 없을 것입니다. 만약 포트 방식으로 바꾸어 해결하길 원할 경우 어떻게 해결했는지는 아래에 자세히 적어두었습니다.

@ 나타났던 에러 메시지
connect() to unix::///xxx.socket failed (13: Permission denied)



# nginx uwsgi 소켓통신을 파일이 아닌 port로 설정 방법아래 방법은 기존의 소켓 설정되어 있는 소켓파일값을 포트로 바꾸어 설정하는 방법입니다.

@ uwsgi.ini
[uwsgi]
socket = :5005
plugin = python
wsgi-file = /mypath/myapp.py
process = 3
callable = application
여기서 socket 뒤의 값이 사용할 포트가 되겠습니다. 다음은 nginx의 설정값입니다.

@ /etc/nginx/sites-available/myapp
server {
  location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:5005;
  }
}

uwsgi.ini 파일과 nginx의 설정이 가장 중요합니다. 위 nginx의 설정값을 보면 uwsgi_pass 뒤에 포트가 위치해 있습니다. 원래는 소켓의 파일명이 있었겠죠.


보통 uwsgi의 실행을 서비스에 등록해서 사용하죠 ~ 서비스의 등록값은 기본과 동일합니다. init 또는 system의 값은 변경하지 않았습니다. 설정된 내용은 아래와 같습니다.
@ /etc/init/webisfree.conf
root@webisfree:/etc/init# vim webisfree.conf
description "uWSGI server instance configuration"
start on runlevel [2345]
stop on runlevel [!2345]

setgid www-data

chdir /mypath/myapp
exec uwsgi --ini uwsgi.ini


# 해결하기 위해 시도했던 방법들이를 해결하기 위해서 다양한 방법들을 시도해 보았습니다.

1. socket 퍼미션 값 변경 660, 664, 666
uwsgi.ini 파일의 퍼미션 값을 변경하는 방법입니다.
chmod-socket = 664;

2. uid, gid 값을 확인 및 변경
uid = www-data
gid = www-data

3. uwsgi 설정의 실행을 스크립트로 변경

4. ubuntu 버전 업그레이드 후 재시도
기존의 14.04를 16.04로 바꾸고 재시도 해보았으나 실패했습니다.

그 외에도 여러가지를 시도해 보았지만 이처럼 해결이 잘 안되고 시간이 오래 걸리면 다른 방법을 생각하는 것도 하나의 해결책이더군요.. 그래서 소켓의 파일 방식에서 port 방식으로 바꾸어 해결했습니다. 물론 소켓을 사용하는 방법이 더 많이 쓰이고 선호도가 높지만 제게는 큰 차이가 없을 것 같아 현재로서도 잘 운영되고 있습니다.