일반적으로  uwsgi 를 사용할 경우 하나의 server(flask 나 django) 만 돌리거나 동일한 버전 python 의 다른 virtualenv 환경의 server 를 돌리기 마련이다. 오늘은 python 3.6.5 와 python3.9.4 를 한 서버에 올릴 일이 있었다.

 대상 서버는 테스트 서버인지라 온갖 테스트 서비스들이 동작하고 있다. 이미 python3.6.5 버전의 테스트 서버가 올라가 있는데, 여기에 요즘 작업중인 서버를 올릴려고 했는데, 단순히 virtualenv 설정으로는 동작하지 않았다. 

내 테스트 서버는 Ubuntu 16.04 이다. (이 것도 이제 업데이트 시켜야 하는데....) 

 우선 pip 를 이용해서 설치 uwsgi 하는 라이브러리의 경우 다른 버전의 파이썬 서비스를 동작시키는데 문제가 있었다. 이 경우 uwsgi 를 컴파일 해서 설치해야 한다. 그리고 사용하는 파이썬 버전은 pyenv 를 통해 동작시킬 때 이상동작을 했다. sudo add-apt-repository ppa : deadsnakes / ppa 같은 것을 이용해서 python 패키지가 설치 되어야한다. 그리고 해당 버전에 맞는 python-dev 버전 설치도 필수다. (내 경우  python3.6-dev  와 python3.9-dev 설치도 필요하다. )

uwsgi 컴파일 
참고 : stackoverflow.com/a/62681907/6652082 (Install uWSGI from source and build python plugins 이후 부분부터)

# 필요한 패키지 설치
apt install libpcre3 libpcre3-dev

# 소스다운로드 후 컴파일 (X.X.X.X 는 최신 버전에 맞게 수정)
cd /usr/local/src
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar vzxf uwsgi-latest.tar.gz
cd uwsgi-X.X.X.X/
make PROFILE=nolang

# symbolic 링크 생성
ln -s /usr/local/src/uwsgi-X.X.X.X  /usr/local/src/uwsgi
ln -s /usr/local/src/uwsgi-X.X.X.X/uwsgi  /usr/local/bin

 

uwsgi 용 plugin 생성
uwsgi 가 기본적으로 plugin 을 이용해서 다양한 언어를 지원한다. 우리 case 의 경우 파이썬 버전별로 plugin 을 만들 수 있다. python 버전별 (우리 case 의 경우 3.6 과 3.9 가 필요하다. 컴파일 도중 python.h 파일이 없다고 에러난다면 python-dev 패키지가 없는 것이다. )

# uwsgi 소스 디렉토리로 이동
cd /usr/local/src/uwsgi-x.x.x.x


virtualenv 파이썬 경로는 . active 한 후 which python 했을 경우 나오는 python 실행파일 경로이다. 

# python 3.6 버전 플러그인 생성
PYTHON=virtualenv파이썬 경로  ./uwsgi --build-plugin "/usr/local/src/uwsgi/plugins/python python36"
# so 파일 이동
mv python36_plugin.so /usr/lib/uwsgi/plugins/python36_plugin.so
chmod 644 /usr/lib/uwsgi/plugins/python36_plugin.so


# python 3.9 버전 플러그인 생성
PYTHON=virtualenv파이썬 경로  ./uwsgi --build-plugin "/usr/local/src/uwsgi/plugins/python python39"
# so 파일 이동
mv python39_plugin.so /usr/lib/uwsgi/plugins/python39_plugin.so
chmod 644 /usr/lib/uwsgi/plugins/python39_plugin.so


uwsgi 설정

일반적인 uwsgi 설정에서 하나 달라지는 것이 있다.
ini 파일을 사용한다면 

plugin-dir = /usr/lib/uwsgi/plugins
plugin = python36

위 와 같이 so 파일이 들어 있는 디렉토리 경로와 plugin 이름 (여기서는 python36 과 python39) 을 추가해 줘야 한다. 


이렇게 해서 테스트 해 봤는데, 두 버전 다 동작하는 것을 확인 했다. 

Index( 'idx_index_table_unique', ref_id, unique=True, postgresql_where=("created_at > CAST('2018-01-01' AS timestamptz)"))

2018-01-01 이후에 생성되는 record 에 대해서만 ref_id 가 unique 한지 검사한다.

2018-01-01 의 의미는 그전에 입력했던 데이터들은 유일하지 않는데, 앞으로는 입력하는 데이터는 unique 검사를 하겠다는 의미임. 

<span v-if="mode='upload'">
   업로드
</span>


 위 코드는 mode=='upload' 대신 mode='upload' 를 넣은 것이다. 매우 기초적인 실수이긴 한 데, 이 때까지 템플릿 코드에 의해 변수가 변경되는 것을 본 적이 없는 나에게는 당연히 자바스크립트 코드에서만 버그를 계속 찾고 있었다.