Linux-centos

centos에 python, uwsgi, flask, nginx 설치하고 설정하기

말하는감자 2021. 3. 29. 17:56

python3.5 설치

  • python3.5, 기본적으로 필요한 것들을 모두 설치해준다
  1. repository 추가

sudo yum install -y epel-release.noarch
sudo yum install -y https://repo.ius.io/ius-release-el7.rpm

 

  1. python 3.x 버젼 확인

yum search python3

 

  1. 설치

yum install -y python35u.x86_64, python35u-debug.x86_64, python35u-devel.x86_64,python35u-libspython35u-libs.x86_64, python35u-pip.noarch, python35u-setuptools.noarch, python35u-tools.x86_64, python35u-libs, python35u-lxml 
pip3.5 install --upgrade pip

 

  1. 심볼릭 링크 추가

  • python3.5 로 호출해서 사용할 예정이라면 심볼릭 링크를 추가하지 않아도 괜찮다
[root@centos] which python3.5
/usr/bin/python3.5
[root@centos] cd /usr/bin
[root@bin] ln -s python3.5 python3

 

 


 

pip 설치

  • 각종 라이브러리를 설치하기 위해서 pip를 설치해준다
  1. repository 추가

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

 

  1. 설치

yum install -y python35u-pip

 

  1. 버젼 확인

[root@bin] pip3.5 --version
pip 9.0.1 from /usr/lib/python3.5/site-packages (python 3.5)

 

  1. 심볼릭 링크 추가

  • pip3.5로 호출해서 사용할 예정이라면 심볼릭 링크를 추가하지 않아도 괜찮다
which pip3.5
cd /usr/bin
ln -s pip pip3.5

 

  1. 업그레이드

pip install --upgrade pip

 


가상환경 설정

  • 가상환경을 설치해주지 않아도 파이썬 사용은 가능하지만 각종 오류로 환경이 오염된 경우에는 가상환경만 날려주면 깔끔하게 새 가상환경에서 설치해줄 수 있기 때문에 설치해주는 것이 좋다
  1. 가상환경 설치

pip install virtualenv

 

  1. 가상환경 만들기

  • 내 경우에는 /home/env/로 잡았다
  • 이 경로 안에서 virtualenv test_env를 하면 test_env가 생기고 그 안에 설치된다
cd /가상환경설치할 경로
virtualenv 가상환경이름

 

  1. 가상환경 path 설정

cd /가상환경설치경로/가상환경이름/bin
vim activate
  • 가장 아래줄에 path 추가
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export PYTHONPATH=${PYTHONPATH}:/home/프로젝트경로/

 



MySQLdb 설치 - 가상환경 activate 상태로 진행

  • 굳이 이걸 따로 빼놓은 이유는 각종 라이브러리중에 설치 도중에 이정도로 오류 많이 나는애는 MySQLdb밖에 못봐서 ㅠ..... MySQLdb 관련 글만 한 3개는 쓴듯 한데 이 방법이 그나마 오류가 덜나는 방법이다
  1. 설치 파일 다운로드

wget https://pypi.python.org/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/mysqlclient-1.3.12.tar.gz#md5=dbf1716e2c01966afec0198d75ce7e69 

 

  1. 압축 해제 후에 설치

tar xvfz mysqlclient-1.3.12.tar.gz
cd mysqlclient-1.3.12 
yum -y install mariadb-devel gcc python35u-devel 
python3 setup.py clean 
python3 setup.py build
python3 setup.py install

 

  1. 오류 발생시

  • 이 아래 내용까지 실패하면 그냥 깨끗하게 버리고 가상환경 새로 파는게 빠르다
yum -y install gcc-c++ zlib zlib-devel libffi-devel
wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz tar xzf Python-3.5.0.tgz cd Python-3.5.0.tgz 
./configure --enable-optimizations
make
make install
pip install mysqlclient, MySQL-db

 


라이브러리 설치

pip install uwsgi, flask, flask_restful

 


 

nginx 설치

  • nginx는 웹 서버의 일종으로 tomcat 에 비해서 설정이 간단한 편이다
  • 단점이 있다면 windows에서는 볼일이 거의 없다는 점?...;ㅅ;??
  1. repository 추가

  • vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

 

  1. 설치

yum -y install nginx

 

  1. 설정 파일 수정

  • vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        try_files $uri @test;
    }

    location @test {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/test.sock;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

  1. 시작

  • systemctl enable nginx
  • systemctl start nginx

 


 

테스트

  1. 테스트 수행 조건

  • 제대로 설치 되었는지, 제대로 동작하는지 확인이 필요하다면 3단계의 테스트가 필요하다
    • python project
    • python project + uwsgi
    • python project + uwsgi + nginx
  • 이렇게 3단계 테스트를 진행하는 이유는 3번만 덜렁 테스트 진행시 오류가 발생하면 누가 바보인지 알기 힘들기 때문이다. 차라리 깔끔하게 3단계로 진행하는것이 좋다.

 

  1. 테스트 프로젝트 생성

  • /home/test 경로에 파일을 생성하고 테스트를 수행한다

 

  • wsgi.py
from app import app

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

 

 

  • app.py
from flask import Flask
import requests

app = Flask(__name__)
@app.route("/test/<test>", methods=["GET"])
def test1(test):
    print(test)
    return test

 

 

  • test-uwsgi.ini
[uwsgi]
chdir = /home/test/
module = wsgi:app
master = true
processes = 5
socket = /tmp/test.sock
chown-socket = nginx:nginx
chmod-socket = 666
vacuum = true
die-on-term = true
pyargv=123
socket-timeout = 3000
http-timeout = 3000
ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

 

 

  1. 테스트

  • python project
    • 테스트용 프로젝트를 설치해둔 경로로 이동 후에 백그라운드로 실행해서 확인한다
(test_env) [root@test] nohup python3 wsgi.py &
(test_env) [root@test] curl -X GET http://localhost:5000/test/testProjectPrint
(test_env) [root@test] curl -X GET http://localhost:5000/test/testProjectPrint
testProjectPrint(test_env)

 

 

  • python + uwsgi
(test_env) [root@test] uwsgi --socket :5000 --protocol=http --wsgi-file wsgi.py --callable app
(test_env) [root@test] curl -X GET http://localhost:5000/test/testProjectPrint
testProjectPrint(test_env)

 

  • python + uwsgi + nginx
systemctl restart nginx
uwsgi test.ini &

 


 

오류 확인하기

  1. permission denied

2021/03/29 08:31:45 [crit] 7306#7306: *1 connect() to unix:/tmp/test.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /test/test HTTP/1.1", upstream: "uwsgi://unix:/tmp/test.sock:", host: "localhost"

 

  • 여기서 이상함을 느껴야 한다.. 왜냐면 uwsgi.ini 에서 우리는 분명 아래의 2개의 설정을 추가했다
  • 이상함을 못느꼇다면 복붙만 하고 제대로 설정 안한거니까 반성타임을 가지는것이 좋겠다 ;ㅅ;
chown-socket = nginx:nginx
chmod-socket = 666

 

 

  • 혹시나 모르니까 권한을 한번 확인해본다
  • ls -al /tmp
srw-rw-rw-.  1 nginx nginx   0 Mar 29 08:31 test.sock

 

 

  • selinux 문제이다.
  • nginx는 centos 6.6 이상에서 httpd_t 컨텍스트로 레이블이 지정된다
  • 허용 도메인 httpd_t 를 목록에 추가하기
    • semanage permissive -a httpd_t
  • 허용 도메인 httpd_t 를 목록에서 삭제
    • semanage permissive -d httpd_t
[root@] ps auZ | grep nginx
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 7397 0.0  0.0 112816 980 pts/2 S+ 08:49   0:00 grep --color=auto nginx
[root@] setsebool -P httpd_can_netword_connect on
[root@] semanage permissive -a httpd_t

 

 

 

 

 

 

참고 문헌

www.nginx.com/blog/using-nginx-plus-with-selinux/

'Linux-centos' 카테고리의 다른 글

mariadb 10.5 설치  (0) 2021.03.16
SElinux  (0) 2021.03.10
scp + pem  (0) 2021.03.09
리눅스 (centos) 취약점 점검  (0) 2021.02.26
wordpress 설치하기  (0) 2021.02.24