AliyunOS 에 Flask + uWSGI + Nginx 배치

6371 단어
지식 도입
uWSGI 가 뭐 예요?
Flask 개발 에서 웹 서버 를 자체 적 으로 가 져 왔 습 니 다. Werkzeug 를 통 해 우 리 는 WSGI 서 비 스 를 구축 하고 우리 의 사 이 트 를 운영 할 수 있 습 니 다. 그러나 Flask 는 웹 프레임 워 크 입 니 다. 웹 서버 가 아니 라 웹 서버 입 니 다. 비록 Werkzeug 가 강하 지만 개발 에 만 사용 할 수 있 고 생산 에 사용 할 수 없습니다. 웹 서버 에 대해 우 리 는 더욱 전문 적 인 선택 이 있 습 니 다. 그것 이 바로 uWSGI 입 니 다.uWSGI 는 응용 서버 (다양한 프로 그래 밍 언어 지원), 프 록 시, 프로 세 스 관리자, 모니터 를 실현 하 는 전역 식 위탁 관리 서비스 입 니 다.uWSGI 라 는 이름 을 지은 것 은 Python 언어의 WSGI 가 최초 로 실현 되 었 기 때문이다.uwSGI 는 C 언어 로 작 성 된 것 으로 성능 이 비교적 높다.uwSGI 는 네 부분 을 포함한다.
  • uwsgi 프로 토 콜
  • 웹 서버 에 지원 프로 토 콜 모듈 내장
  • 애플 리 케 이 션 서버 프로 토 콜 지원 모듈
  • 프로 세 스 제어 프로그램
  • uWSGI 는 웹 서버 로 WSGI 프로 토 콜 (Web Server Gateway Interface), uwsgi, http 프로 토 콜 등 을 실현 하여 요청 을 수신 하고 처리 하 며 응답 을 보 낼 수 있 습 니 다.그래서 Nginx 를 쓰 지 않 고 uWSGI 만 써 도 됩 니 다.
    Nginx 가 뭐 예요?
    Nginx 는 효율 적 인 웹 서버 와 리 버스 프 록 시 서버 로, 부하 균형 (n 명의 사용자 가 서버 에 접근 할 경우 분류 가 가능 하고 서버 의 압력 을 분담 할 수 있 음) 으로 사용 할 수 있 으 며, 보안 필터 링, 디 도스 공격 방지 등 이 가능 하 다.Apache 에 비해 Nginx 는 높 은 병발 을 지원 하고 백만 개의 TCP 연결 을 지원 할 수 있 으 며 10 만 개의 병발 연결 을 지원 할 수 있 으 며 배치 가 간단 하고 메모리 소모 가 적 으 며 원가 가 낮 지만 Nginx 의 모듈 은 Apache 가 풍부 하지 않다.Nginx 는 uWSGI 의 uwsgi 프로 토 콜 을 지원 하기 때문에 우 리 는 Nginx 와 uWSGI 를 결합 시 킬 수 있 습 니 다. Nginx 는 uwsgi 를 통 해pass 는 동적 내용 을 uWSGI 에 맡 깁 니 다.
    uWSGI 가 있 으 면 Nginx?
    가장 보편적 인 표현 은 Nginx 가 정적 파일 을 처리 하 는 데 유리 하고 성능 이 좋다 는 것 이다.사실 작은 사이트 라면 정적 파일 을 처리 할 필요 가 없고 uWSGI 만 사용 해도 됩 니 다. 그러나 Nginx 라 는 층 을 더 하면 장점 은 구체 적 입 니 다. 운영 에 있어 서 편리 합 니 다. 만약 에 서버 가 특정한 IP 에 공격 을 받 으 면 Nginx 설정 파일 블랙리스트 에 이 IP 를 추가 하면 됩 니 다. 만약 에 uWSGI 만 사용 하면 코드 에서 수정 해 야 합 니 다.다른 한편, Nginx 는 백전백승 의 웹 서버 로 표현 에 있어 서 uWSGI 가 더욱 전문 적 으로 보인다. 예 를 들 어 uWSGI 는 초기 버 전에 서 https 를 지원 하지 않 았 기 때문에 Nginx 가 더욱 안전 하 다 고 할 수 있다.Nginx 의 특징 은 부하 균형 과 HTTP 캐 시 를 만 들 수 있다 는 것 입 니 다. 한 대의 서버 가 아니라면 Nginx 는 기본적으로 필수 옵션 입 니 다. Nginx 를 통 해 자원 을 서로 다른 서버 노드 에 배분 할 수 있 고 한 대의 서버 만 있 으 며 성능 도 잘 향상 시 킬 수 있 습 니 다. Nginx 는 headers 의 Expires or E - Tag, gzip 압축 등 방식 으로 정적 자원 을 잘 처리 할 수 있 기 때 문 입 니 다.C 언어 로 작 성 된 것 이기 때문에 native 함 수 를 호출 하여 I / O 를 최적화 시 켰 습 니 다. 동적 자원 에 있어 Nginx 는 캐 시 기능 을 실현 하고 CDN 최적화 와 결합 할 수 있 습 니 다 (이것 은 uWSGI 가 할 수 없 는 것 입 니 다).Nginx 는 epoll / kqueue 등 효율 적 인 네트워크 라 이브 러 리 를 지원 하여 높 은 병렬 연결 요청 을 잘 처리 할 수 있 으 며, 성능 이 uwSGI 보다 어디 까지 높 은 지 모른다.서버 호스트 에서 PHP, Python 등 언어 로 작 성 된 여러 애플 리 케 이 션 을 실행 하려 면 80 포트 를 감청 해 야 합 니 다. 이 럴 때 Nginx 는 필수 옵션 입 니 다.리 트 윗 서비스 가 필요 해서 요.그 러 니까 Nginx 도 기본적으로 필수 옵션 이다.그래서 uWSGI 자체 가 웹 서비스 이지 만 여기 서 Nginx 를 다시 도입 한 것 은 Nginx 를 역방향 대리 로 하기 위해 서 이다. 그러면 일부 이미지, js 등 정적 자원 은 Nginx 로 서 비 스 를 제공 할 수 있 고 다른 것 은 uWSGI 에 전달 하 는 것 도 우리 의 이 배치 구조의 최종 목적 이다.
    조작 하 다.
    기본 경로
    프로젝트 경로
    /var/www/py3env/project
    

    가상 파 이 썬 환경 경로
    /var/www/py3env/venv
    

    프로젝트 구조
    ├── config.py
    ├── exts.py
    ├── main.py
    ├── models.py
    

    uwsgi 프로필 추가 uwsgi. ini
    본인 은 /var/www/py3env 아래 uwsgi.ini 에 두 고 자신의 파일 보관 상황 에 따라 설정 하면 됩 니 다.
    [uwsgi]
    
    # uwsgi             
    socket = 127.0.0.1:8000
    
    #       
    chdir = /var/www/py3env/project
    
    # python       
    wsgi-file = main.py
    
    # python          application    
    callable = app
    
    #    
    threads = 2
    

    매개 변수 설명:
  • socket: 소켓 통신 포트 는 외부 에 uWSGI 서버 의 인 터 페 이 스 를 남 겨 놓 고 Nginx 와 통신 하 는 것 과 같 지만 socket 은 http 를 통 해 직접 접근 할 수 없 음 을 주의 하 십시오.
  • pythonpath: 프로젝트 목록.
  • module: 프로젝트 시작 스 크 립 트 이름 을 지정 합 니 다. 로 컬 에서 python run. py 로 flask 프로젝트 를 시작 할 수 있 습 니 다
  • callable: 프로그램 에서 사용 하 는 application 변수 이름 은 일반적으로 app = Flask (name) 이기 때문에 여 기 는 app 입 니 다.
  • stats: uwsgi 통계 정 보 를 얻 는 서비스 주소
  • daemonize: uWSGI 프로 세 스 를 배경 에서 실행 시 키 고 로 그 를 지정 한 로그 파일 이나 udp 서버 에 기록 합 니 다.
  • processes: 프로세서 개수.
  • threads: 스 레 드 수.

  • processes 와 threads 는 uwsgi 서버 를 시작 한 후에 서버 는 몇 개의 병렬 프로 세 스 를 엽 니 다. 모든 프로 세 스 는 몇 개의 스 레 드 를 열 어 처리 요청 을 기다 리 고 있 습 니 다. 이 숫자 는 합 리 적 이 어야 합 니 다. 너무 작 으 면 처리 성능 이 좋 지 않 고 너무 크 면 서버 자체 에 큰 부담 을 줄 수 있 습 니 다.
    uWSGI 시작
    uwsgi uwsgi.ini
    

    uWSGI 프로필 을 사용 하지 않 고 명령 으로 실행 합 니 다.
    uwsgi --socket 127.0.0.1:8008 --wsgi-file run.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
    

    Nginx 를 사용 하면 uWSGI 가 socket 을 사용 하여 Nginx 와 통신 하도록 설정 할 수 있 습 니 다.즉, Nginx 가 uWSGI 이전에 에이전트 가 있 으 면 socket 을 맞 춰 야 하고, 요청 을 uWSGI 에 게 직접 떨 어 뜨리 려 면 http 를 맞 춰 야 한 다 는 것 이다.uWSGI 프로필 을 사용 하지 않 고 명령 으로 실행 합 니 다.
    uwsgi --http :8008 --wsgi-file run.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
    

    Nginx 서버 설정
    설정 파일 의 경로 가 다 릅 니 다. centos 에서 yum 으로 설치 할 때 일반 설정 파일 은 /etc/nginx/nginx.conf다음 부분 만 수정:
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  121.196.210.237;
            charset utf-8;
            #root         /var/www/webroot;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
                    include uwsgi_params;
                    uwsgi_pass 127.0.0.1:8000;
                    uwsgi_param UWSGI_PYTHON /var/www/py3env/venv/;
                    uwsgi_param UWSGI_CHDIR /var/www/py3env/project/;
                    uwsgi_param UWSGI_SCRIPRT main:app;
            }
    
        }
    

    매개 변수 설명:
  • listen: 감청 포트
  • server_name: 서버 이름 또는 IP
  • charset: 문자 집합
  • access_log: Nginx 서버 에서 받 은 요청 로그 입 니 다. 디 렉 터 리 를 만 들 필요 가 없 으 면 Nginx 오류
  • error_log: Nginx 서버 에 기 록 된 오류 로그
  • include: 가 져 온 uWSGI 설정
  • uwsgi_pass: uWSGI 설정 파일 에 있 는 socket 항목 의 주소 와 같 아야 합 니 다. 그렇지 않 으 면 uWSGI 가 요청 을 받 을 수 없습니다.
  • uwsgi_param UWSGI_PYHOME: python 의 위치 (가상 환경 에서)
  • uwsgi_param UWSGI_CHDIR: 프로젝트 루트 디 렉 터 리
  • uwsgi_param UWSGI_SCRIPT: 프로젝트 를 시작 하 는 메 인 프로그램 (로 컬 에서 이 메 인 프로그램 을 실행 하면 fllask 내 장 된 서버 에서 프로젝트 를 방문 할 수 있 습 니 다)
  • 디 버 깅
    nginx 서버 다시 시작:
    systemctl restart nginx.service
    

    Python 가상 환경 에서:
    uwsgi uwsgi.ini
    

    그리고 주소 표시 줄 에 접근:
    http://     ip  
    

    접근 효과
    터미널 디 스 플레이

    좋은 웹페이지 즐겨찾기