아 리 클 라 우 드 배치 우 분투 1.4 Flask + WSGI + Nginx 상세 설명

10501 단어
친구 의 유혹 에 못 이 겨 오늘 드디어 아 리 클 라 우 드 서버 를 구 입 했 습 니 다. 우 분투 1.432 비트 버 전 입 니 다. 처음에 신선 한 것 을 맛 보 려 고 했 는데 가장 낮은 것 만 샀 습 니 다. 가격 을 계산 해 보면 외국 에서 공간 을 사 는 가격 과 비슷 합 니 다. (1 년 에 100 여 위안 이 비 쌀 수도 있 습 니 다) 하지만 사용 하면 좋 습 니 다. 속도 가 빠 릅 니 다.
Linux 세계 로 무 너 진 후에 모든 크 고 완전한 개발 프레임 워 크 와 소프트웨어 에 대해 반 갑 지 않 은 느낌 을 가지 게 되 었 습 니 다. 개인 은 작고 정교 하 며 고성능 의 생산 능력 이 높 은 소프트웨어 와 개발 프레임 워 크 를 사용 하 는 것 을 좋아 합 니 다. 그래서 제 첫 번 째 언어 는 Python 과 Coffee 입 니 다. 개발 프레임 워 크 는 당연히 AngularJS (전단) + Flask (백 엔 드) 입 니 다.AngularJS 와 Flask 는 본 고의 서술 범위 안에 있 지 않 고 본 고 는 Flask 의 마지막 킬로미터 의 문 제 를 해결 했다. 즉, Linux 배치 이다.
내 가 채택 한 배치 방안 은:
  • 웹 서버 는 uwsgi host Flask
  • 를 사용 합 니 다.
  • Supervisor 로 uwsgi 를 인용 하여 일반적인 시작 서비스
  • Nginx 기반 역방향 대리
  • 우선, 아 리 클 라 우 드 서버 는 SSH 명령 을 통 해 본 컴퓨터 의 단말기 에서 원 격 으로 연결 할 수 있다.ssh root@
    암 호 를 입력 하고 들 어가 면 모든 작업 이 로 컬 터미널 과 완전히 일치 합 니 다.
    Python 환경 설치
    다음은 python 입 니 다. Ubuntu 의 기본 환경 은 python 2.7 을 미리 설 치 했 기 때문에 python 의 pip 설치 도구 만 설치 하면 됩 니 다.pip 는 python 기반 소프트웨어 도 구 를 설치 하 는 데 사 용 됩 니 다. 다음 글 에서 자주 사용 할 것 입 니 다.
    PIP
    python 으로 모 르 면 [pip |http://pypi.python.org/] 그럼 빨리 뇌 보 를 하 는 게 좋 을 것 같 아 요. 명령 은 다음 과 같 아 요.sudo apt-get install pip
    서로 다른 항목 은 다양한 의존 패 키 지 를 참조 할 수 있 습 니 다. 버 전과 응용 간 의 충돌 을 피하 기 위해 '지옥 의존' [Virtualenv | https://virtualenv.readthedocs.org/en/latest/] 바로 우리 python 프로젝트 의 필수품 입 니 다.VirtualEnv 는 모든 Python 응용 프로그램 에 독립 된 개발 환경 을 만들어 서로 영향 을 주지 않 게 할 수 있 습 니 다. Virtualenv 는 할 수 있 습 니 다.
  • 권한 없 이 새 키 트 설치
  • 서로 다른 응용 프로그램 은 서로 다른 세트 버 전
  • 을 사용 할 수 있다.
  • 세트 업 그 레이 드 는 다른 응용 에 영향 을 주지 않 습 니 다
  • 설치:sudo pip install virtualenv
    VirtualEnv 설치 후 프로젝트 디 렉 터 리 에서 만 실행  virtualenv 디 렉 터 리 이름 가상 환경 폴 더 를 만 들 고 사용 할 수 있 습 니 다.  activate  명령 은 이 python 가상 환경 을 사용 할 수 있 습 니 다. 구체 적 인 동작 은 다음 과 같 습 니 다.
    내 프로젝트 목록 이름 을 가정 하 다.  /home/www/my_flask 먼저 가상 환경 을 설치 합 니 다. venv )
    
    my_flask root$ virtualenv venv
    
    >> New python executable in venv/bin/python
    >> Installing setuptools, pip...done.

    프로젝트 디 렉 터 리 에 새 venv 디 렉 터 리 를 만 듭 니 다. python 을 실행 하 는 기본 환경 을 위 한 도구 와 명령, 패키지 입 니 다. 그리고 이 환경 을 사용 하면 현재 명령 행 상 태 를 가상 환경 에 들 어가 가상 환경 에 들 어가 면 python 을 설치 하 는 모든 작업 은 패키지 와 인용 을 가상 링 에 설치 합 니 다. 전체 python 환경 에 영향 을 주지 않 습 니 다.
    
    my_flask root$ source venv/bin/activate 
    
    (venv)my_flask root$ 
    activate 명령 어 를 호출 하면 명령 문자 앞 에 (venv) 글자 가 나타 납 니 다. deactivate 를 통 해 가상 환경 을 종료 할 수 있 습 니 다.
    uWSGI 설치
    Flask 의 실제 생산 운영 환경 에 대한 선택 이 많 지 않 고 비교적 성숙 한 것 은 [Gunicon |http://gunicorn.org/uWSGI |https://github.com/unbit/uwsgi], Gunicon 의 설정 이 매우 간단 하 다 고 들 었 는데, 안 타 깝 게 도 나 는 설정 에 성공 한 적 이 없다. 나 는 현재 uWSGI 를 사용 하고 있다. 다음은 uWSGI 를 설치 하 자.
    
    (venv)my_flask root$ pip install uwsgi

    가상 환경 에서 사용 할 필요 가 없습니다 sudo. virtualenv 는 권한 이 없 기 때 문 입 니 다.
    이 설 치 는 매우 빠 르 고 기본적으로 초 단위 입 니 다. 설치 가 끝 난 후에 우 리 는 먼저 uWSGI 를 내 려 놓 고 뒤에서 다시 그 를 설정 할 수 있 습 니 다. 왜냐하면 우 리 는 먼저 관건 적 인 Flask 환경 과 우리 의 프로젝트 파일 을 서버 디 렉 터 리 에 전송 해 야 하기 때 문 입 니 다.
    Flask 설치
    나 는 목록 파일 로 Flask 와 그 에 대한 의존 도 를 한꺼번에 설치 하 는 것 이 더 빠 를 것 입 니 다. 나의 인용 목록 은 다음 과 같 습 니 다: requirements. txt
    
    Flask==0.10.1
    Flask-Login==0.2.11
    Flask-Mail==0.9.1
    Flask-Moment==0.4.0
    Flask-PageDown==0.1.5
    Flask-SQLAlchemy==2.0
    Flask-Script==2.0.5
    Flask-WTF==0.10.2
    Flask-Cache==0.13.1
    Flask-Restless==0.15.0
    Flask-Uploads==0.1.3
    Jinja2==2.7.3
    Mako==1.0.0
    Markdown==2.5.1
    MarkupSafe==0.23
    SQLAlchemy==0.9.8
    WTForms==2.0.1
    Werkzeug==0.9.6
    html5lib==1.0b3
    itsdangerous==0.24
    six==1.8.0
    awesome-slugify==1.6

    미 친 척 하지 않 으 면 안 된다 고 상상 할 수 있 습 니 다. 목록 파일 설치:
    
    (venv)my_flask root$ pip install -r requirements.txt

    이 설 치 를 실행 하기 전에 python 가상 환경 을 사용 하 는 것 을 주의해 야 합 니 다. 그렇지 않 으 면 전역 에 직접 설치 할 것 입 니 다!
    프로젝트 파일
    다음은 Flask 의 프로젝트 파일 을 올 리 는 것 입 니 다. 그 전에 저 는 각 대형 '전재 전문 업 체' 에서 많은 자 료 를 찾 았 습 니 다. 이 단계 에서 대부분 위 에 표준 Flask 실행 파일 만 추 가 했 습 니 다. 범례 를 만 들 수 있 지만 사실은 이것 은 사람 을 현혹 시 켰 습 니 다. 왜 요? 먼저 코드 를 보 세 요.
    
    from flask import Flask
     
    app = Flask(__name__)
     
    @app.route("/")
    def hello():
      return "Hello World!"

    생산 환경 에서 누가 이런 코드 를 사용 할 수 있 습 니까? 이것 은 Flask 의 가장 간단 한 입문 범 위 였 습 니 다. 제 Flask 프로젝트 에서 app 은 가방 안에 만 들 어 졌 습 니 다. 많은 사람들 이 이렇게 할 것 이 라 고 믿 습 니 다. 가방 밖에서 저 희 는 Flask Script 로 manage. py 파일 을 시작 파일 로 쓰 면 각종 프로젝트 를 지원 할 수 있 습 니 다. window 에 설치 할 수 있 는 FastCGI 를 포함 합 니 다.
    그럼 나의 이 manage. py 는 이렇게 생 겼 다.
    
    #!/usr/bin/env python
    import os
    
    if os.path.exists('.env'):
      print('Importing environment from .env...')
      for line in open('.env'):
        var = line.strip().split('=')
        if len(var) == 2:
          os.environ[var[0]] = var[1]
    
    from app import create_app
    from flask.ext.script import Manager, Shell
    
    #        app 
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
    manager = Manager(app)
    
    def make_shell_context():
      return dict(app=app)
    
    
    manager.add_command("shell", Shell(make_context=make_shell_context))
    
    @manager.command
    def deploy():
      """Run deployment tasks."""
      pass
    
    
    if __name__ == '__main__':
      manager.run()

    이렇게 하면 나의 개발 환경 은 이렇게 Flask 를 운행 할 수 있다.
    
    python manage.py runserver

    더 자세 한 방법 은 [Flask Script |http://flask-script.readthedocs.org/en/latest/확장
    좋 습 니 다. SSH 를 지원 하 는 FTP 도구 로 Flask 프로젝트 파일 을 서버 에 업로드 할 수 있 습 니 다. 다음은 전체 프로젝트 파일 구조 입 니 다.
    
    www/
    └── my_flask 
    │  ├── logs
    │  └── venv //    
    │  │  ├── bin
    │  │  │     ├── activate
    │  │  │     ├── easy_install
    │  │  │     ├── gunicorn
    │  │  │     ├── pip
    │  │  │     └── python
    │  │  ├── include
    │  │  │     └── python2.7 -> /usr/include/python2.7
    │  │  ├── lib
    │  │  │     └── python2.7
    │  │  ├── local
    │  │  │     ├── bin -> /home/shenye/shenyefuli/bin
    │  │  │     ├── include -> /home/shenye/shenyefuli/include
    │  │  │     └── lib -> /home/shenye/shenyefuli/lib
    │  └── app //Flask     
    │  │      └── __init__.py //       。                
    │  ├── manage.py  
    │  ├── requirements.txt 

    uwsgi 설정
    자, 프로젝트 준비 작업 이 끝 났 습 니 다. uwsgi 를 설정 할 때 가 되 었 습 니 다. 구체 적 인 명령 은 공식 문 서 를 볼 수 있 습 니 다. 우 리 는 여기 서 명령 방식 을 사용 합 니 다. 시작 을 설정 합 니 다. 저 는. ini 파일 을 설정 하여 프로젝트 디 렉 터 리 에 config. ini (구체 적 으로 다음 글 참조) 를 만 든 후에 이렇게 실행 할 수 있 습 니 다.  
    
    (venv)my_flask root$ uwsgi config.ini

    나 는 가장 간단 한 방식 이 라 고 생각 하고 변경 하기 쉽다. 중요 한 부분 이 왔 다. config. ini 는 이렇게 썼 다.
    
    [uwsgi]
    
    # uwsgi             
    socket = 127.0.0.1:8001 
    
    #       
    chdir = /home/www/ 
    
    # python       
    wsgi-file = manage.py 
    
    # python          application    
    callable = app 
    
    #     
    processes = 4
    
    #    
    threads = 2
    
    #      
    stats = 127.0.0.1:9191

    메모: callable = app 이 app 은 manage. py 프로그램 파일 의 변수 입 니 다. 이 변수의 유형 은 Flask 의 application 류 입 니 다.
    uwsgi 실행
    ``` (venv)my_flask root$ uwsgi config.ini
    [uWSGI] getting INI configuration from config.ini
    *** Starting uWSGI 2.0.8 (64bit) on [Fri Dec 19 14:34:11 2014]  // 쓸모없는 시작 정보 Stats server enabled on 127.0.0.1: 9191 fd: 15 * * ` ` 를 생략 합 니 다.
    OK, 이 때 는 uwsgi 를 정상적으로 시작 하고 Flask 프로젝트 를 불 러 왔 습 니 다. ctrl + c 는 프로그램 을 닫 습 니 다. 그러나 이것 은 명령 시작 형식 일 뿐 입 니 다. 서버 와 함께 시작 하고 백 엔 드 서비스 로 실행 하 는 것 이 운영 환경의 실제 필요 합 니 다. 따라서 다음 에는 다른 도 구 를 설치 하여 uwsgi 를 유도 해 야 합 니 다.
    Supervisor 설치
    [Supervisor|http://supervisord.org/configuration.html] 여러 애플 리 케 이 션 을 동시에 시작 할 수 있 습 니 다. 가장 중요 한 것 은 Crash 를 사용 할 때 이 애플 리 케 이 션 을 자동 으로 다시 시작 하여 가용성 을 확보 할 수 있 습 니 다.
    
    sudo apt-get install supervisor

     Supervisor 의 전역 프로필 위 치 는 다음 과 같 습 니 다.
    
    /etc/supervisor/supervisor.conf

    정상 적 인 상황 에서 우 리 는 그것 에 대해 어떠한 변경 도 할 필요 가 없다. 단지 새로운 *. conf 파일 을 추가 해서 두 어야 한다
    
    /etc/supervisor/conf.d/

    다음 에 가능 합 니 다. my flask 프로젝트 를 시작 하 는 uwsgi 의 슈퍼 바 이 저 설정 을 새로 만 듭 니 다. (이름: my flask 슈퍼 바 이 저. conf):
    
    [program:my_flask]
    #       
    command=/home/www/my_flask/venv/bin/uwsgi /home/www/my_flask/config.ini
    
    #         
    directory=/home/www/my_flask
    #        
    user=root
        
    autostart=true
    autorestart=true
    #    
    stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log  

    시작 서비스
    
    sudo service supervisor start

    서비스 종료
    
    sudo service supervisor stop

    Nginx 설치
    [Nginx|http://nginx.com/] 경량급, 성능 이 강하 고 자원 을 적 게 차지 하 며 높 은 병행 을 잘 처리 할 수 있 는 역방향 대리 소프트웨어 입 니 다.
    
    sudo apt-get install nginx

    Nginx 설정
    Ubuntu 에서 Nginx 를 설정 하 는 것 도 간단 합 니 다. 기본 nginx. conf 를 바 꾸 지 마 십시오.
    
    /ext/nginx/sites-available/default

    파일 을 바 꾸 면 됩 니 다.
    기본 파일 새로 만 들 기:
    
    server {
       listen 80;
       server_name XXX.XXX.XXX; #    
      
       location / {
        include   uwsgi_params;
        uwsgi_pass  127.0.0.1:8001; #   uwsgi         ,        uwsgi   
        uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; #         
        uwsgi_param UWSGI_CHDIR /home/www/my_flask; #        
        uwsgi_param UWSGI_SCRIPT manage:app; #       
       }
      }

    default 프로필 을 교체 하면 큰 성 과 를 거 둘 수 있 습 니 다! 그리고 설정 을 변경 하려 면 nginx 를 다시 시작 하 는 것 을 기억 해 야 합 니 다:
    
    sudo service nginx restart

    총결산
    아 리 클 라 우 드 의 서버 운행 속도 가 매우 좋 은 데다 가 Flask + uWSGI + nginx 와 같은 고성능 구 조 를 사용 하면 전체 사이트 의 응답 속도 가 매우 빠 르 고 각 페이지 의 응답 속도 가 0.1 s 가 되 지 않 습 니 다. 이에 비해 저 는 C \ # Avarix 에 배 치 된 사이트 (같은 프로그램, 서로 다른 언어 구현) 를 사 용 했 습 니 다.각 페이지 의 응답 속 도 는 적어도 2s 이다. 이것 은 200 대 1 의 성능 이다. 물론 나 는 전문가 들 이 소프트웨어 로 이 두 가지 차 이 를 측정 할 여유 가 없다. 본 고 를 쓰 는 목적 도 이에 대해 기록 을 해서 나중에 돌 이 켜 볼 수 있 도록 하 는 것 이다.

    좋은 웹페이지 즐겨찾기