클라우드 서버에 Django+uwsgi+Nginx 배포

15597 단어
전언
Django 프로젝트를 로컬에서 실행할 때
python3 manager runserver

그러나 이것은 Django의 개발 모델에만 적용되고 단일 사용자 방문만 지원한다. 서버에 배치하여 대량의 사용자 방문을 제공하려면 인터넷의 많은 자료를 종합하여 몇 가지 다른 Django 배치 방안을 나열한다.
도구: CentOS7 텐센트 클라우드 서버, Python3.6、 MySQL5.7、 Django2.2.7、 uwsgi2.0.18、 Nginx1.16.1
Django(Git)+uwsgi+Nginx
콘셉트python web 개발에서 우리는 자주 uwsgi를 사용하여nginx와 함께 웹 프레임워크를 배치한다. 예를 들어Django나flask이다.또한 프레임워크와 웹 서버 간에 WSGI 프로토콜에 부합되어야 하며 WSGI와 uwsgi를 더욱 깊이 이해하려면 여기를 보십시오
Nginx는 웹 서버이고 Django나flask는 웹 프레임워크입니다. 웹 서버와 웹 프레임워크가 WSGI 프로토콜을 충족시키기만 하면 서로 어울릴 수 있습니다.그래서 WSGI는 하나의 협의, 하나의 약속일 뿐이다.python의 모듈, 프레임워크 등 구체적인 기능이 아니라
uWSGI는 WSGI 프로토콜을 실현한 웹 서버입니다.클라이언트 요청을 받아들여 응답을 전달하는 프로그램입니다.실제로 uWSGI의 웹 서버에 Django와 같은 웹 프레임워크를 더하면 사이트의 기능을 실현할 수 있다.Nginx가 필요한 이유는 무엇입니까?
일반적인 개인 사이트로 방문량이 많지 않으면 당연히 uWSGI와 Django로 구성될 수 있다.그러나 방문량이 너무 많으면 클라이언트가 연결을 요청할 때 장시간 기다려야 한다.이때 분포식 서버가 나왔습니다. 우리는 몇 대의 웹 서버를 더 가져와서 요청을 처리할 수 있습니다.그런데 누가 클라이언트의 요청 연결과 웹 서버를 분배합니까?Nginx는 바로 이런 관리인의 존재로 그것에 의해 분배된다.이것이 바로 Nginx에서 역방향 프록시, 즉 프록시 서버를 실현하는 것이다.
개술
먼저 클라이언트 요청 서비스 자원,nginx는 직접 대외적인 서비스 인터페이스로서 클라이언트가 보낸 http 요청을 받으면 패키지를 해제하고 분석한다. 정적 파일 요청이면nginx가 설정한 정적 파일 디렉터리에 따라 요청한 자원을 되돌려주고,동적 요청이면nginx는 설정 파일을 통해 요청을 uWSGI에 전달한다.uWSGI는 수신한 패키지를 처리하여 wsgi에게 전송한다. wsgi는 요청에 따라django 프로젝트의 어떤 파일이나 함수를 호출한다. 처리가 끝난 후에django는 반환 값을 wsgi에게 전달하고 wsgi는 반환 값을 포장하여 uWSGI에게 전송한다. uWSGI는 수신한 후에nginx에게 전송하고,nginx는 최종적으로 반환 값을 클라이언트(예를 들어 브라우저)에게 되돌려준다. 주: 서로 다른 구성 요소 간에 데이터 형식과 프로토콜의 변환과 관련된 정보를 전달한다.
역할
  • 1급nginx는 필수적인 것이 아니라 uwsgi는 전체 브라우저와 상호작용하는 절차를 완성할 수 있다.
  • nginx에 안전성 또는 다른 제한을 더하면 보호 프로그램의 역할을 할 수 있다.
  • uWSGI 자체는 내부 네트워크 인터페이스로 여러 개의work와processes를 켜도 충분하지 않을 수 있으며,nginx는 여러 대의 uWSGI를 대리하여 uWSGI의 부하 균형을 완성할 수 있다.
  • django는 debug=False에서 정적 파일 처리 능력이 좋지 않은데,nginx로 처리하는 것이 더욱 효율적이다.

  • 단계
    Python3 설치
    서버에 Python3 등 의존 장치 설치
    #   home  
    cd ~
    
    #      
    yum -y groupinstall "Development tools"
    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    yum -y install gcc
    yum install -y libffi-devel zlib1g-dev
    yum install zlib* -y
     
    #   python3.6   
    wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
     
    #        
    mkdir /usr/local/python3
     
    #      
    tar -zxvf Python-3.6.8.tgz
     
    #         
    cd Python-3.6.8
     
    #   ,      /usr/local/python3.6
    #           ,     ,                        ,        ,        .
    #        python10%-20%      .   :https://blog.csdn.net/whatday/article/details/98053179
    #         pip    ssl,        .
    ./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl
     
    #   ,        
    make && make install
     
    #      
    ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
    ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
     
    #   pip
    pip3 install --upgrade pip
    
    

    mysql 설치
    텐센트 클라우드 Centos7을 참조하여 Mysql5를 설치하십시오.7
    분기 deploy
    로컬 생성 및 분기 deploy로 전환
    git checkout -b deploy
    

    참고: commit 취소
    git reset --soft HEAD^
    

    제출하기 전에 Django 프로젝트에서 setting을 설정합니다.py의 설정:
    DEBUG = False
    
    ALLOWED_HOSTS = ['     IP    ', 'localhost', '127.0.0.1']
    

    그리고 로컬 Django 코드를 github 프로젝트의 deploy 분기에 제출합니다
    Django 프로젝트 끌어오기
    git clone https://github.com/xxx/xxx.git
    

    github에서 원본 코드 클론 비마스터 지점 다운로드 코드
    드래그 후 기본적으로 마스터 지점입니다. deploy 지점으로 전환해야 합니다
    git checkout deploy
    

    Django+uwsgi+nginx 설치
    이렇게 하면 당신의 서버에 Django 프로젝트의 코드가 생겼지만, 우리는 아직 Django 등 제3자 라이브러리를 설치하지 않았습니다.
    다음 서버에 설치:
    pip3 install django==2.2.7
    pip3 install uwsgi
    
    #   yum  nginx
    yum install nginx -y
    
    #      
    ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
    # ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
    # ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn
    ln -s /usr/local/python3/bin/django-admin.py /usr/bin/django-admin
    

    Django 테스트
    프로젝트 루트 디렉터리에 들어가기
    python3 manage.py runserver
    

    나의 출현 보고 오류:
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.7.11.None.
    

    오류에 따라 mysqlclient 설치
    pip3 install mysqlclient
    

    또 잘못 보고:
    ERROR: Command errored out with exit status 1:
         command: /usr/local/python3/bin/python3.6 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-p6v1q25n/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-p6v1q25n/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r
    '"'"', '"'"'
    '"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-p6v1q25n/mysqlclient/pip-egg-info cwd: /tmp/pip-install-p6v1q25n/mysqlclient/ Complete output (10 lines): /bin/sh: mysql_config: command not found Traceback (most recent call last): File "", line 1, in File "/tmp/pip-install-p6v1q25n/mysqlclient/setup.py", line 18, in metadata, options = get_config() File "/tmp/pip-install-p6v1q25n/mysqlclient/setup_posix.py", line 53, in get_config libs = mysql_config("libs_r") File "/tmp/pip-install-p6v1q25n/mysqlclient/setup_posix.py", line 28, in mysql_config raise EnvironmentError("%s not found" % (mysql_config.path,)) OSError: mysql_config not found ---------------------------------------- ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

    자료를 찾았는데 mysqlclient를 설치하는 데 필요한 의존이 필요합니다. 시간이 좀 걸립니다.
    yum install mysql-devel gcc gcc-devel python-devel
    

    mysqlclient 다시 설치
    pip3 install mysqlclient
    

    성공적으로 설치되었지만 Django가 런서버에서 다시 실행되었지만 오류가 발생했습니다.
    File "/usr/local/python3/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 36, in 
        raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.7.11.None.
    

    자료 찾았어,django2.2pymysql 버전과 일치하지 않습니다.mysqldb는python3 참조django를 지원하지 않습니다.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2
    해결 방법:
    Python이 로드맵을 설치하는 Python36-32\Lib\site-packages\django\db\backends\mysql\base를 찾습니다.py 파일
    vi /usr/local/python3/lib/python3.6/site-packages/django/db/backends/mysql/base.py
    

    파일에 있는 아래의 코드를 주석하면 된다
    if version < (1, 3, 3):
        raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
    

    이어서
    python3 manage.py makemigrations
    
    python3 manage.py migrate
    
    python3 manage.py createsuperuser
    
    python3 manage.py runserver
    

    CSRF 유효성 검사에 장애가 발생했습니다.요청이 중단되었습니다.
    방화벽을 닫아 보세요.
    systemctl stop firewalld.service
    
     :
    #  .        
    systemctl status  firewalld
    
    #   
    firewall-cmd --state
    
    #  .     
    systemctl stop firewalld.service
    
    #            
    systemctl disable firewalld.service
    
    #  ,     
    systemctl start firewalld.service
    
    #          
    systemctl enable firewalld.service
    
    #      
    systemctl restart firewalld.service
    

    그리고 로그인할 수 있어요.
    테스트 uwsgi
    설치된 uwsgi 버전 보기
    uwsgi --version
    

    Django 프로젝트와 동일한 레벨 경로에 배치할 수 있는 테스트 스크립트 작성
    vim test.py
    
    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World"]
    

    다음 실행
    uwsgi --http :8008 --wsgi-file test.py
    

    다음 액세스: http://서버 IP:8008/
    출현Hello World하면 성공
    uwsgi+Django 테스트
    uwsgi가django 프로젝트와 성공적으로 결합할 수 있는지 확인하기 위해 아래 명령을 실행합니다
    uwsgi --http :8008 --chdir /home/LVideo --wsgi-file LVideo.wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192
    

    일반적인 옵션은 다음과 같습니다.
    http       :        
    processes  :       
    workers    :       ,   processes(      spawn the specified number ofworkers / processes)
    chdir      :      (chdir to specified directory before apps loading)
    wsgi-file  :  wsgi-file(load .wsgi file)
    stats      :       ,      (enable the stats server on the specified address)
    threads    :    。  GIL   ,          。(run each worker in prethreaded mode with the specified number of threads)
    master     :       (enable master process)
    daemonize  :        ,               udp   (daemonize uWSGI)。       ,                 。
    pidfile    :  pid     ,      pid 。
    vacuum     :               ,  unix socket   pid  (try to remove all of the generated file/sockets)
    
      :--wsgi-file         
    

    방문http://IP:8008성공, 당신의 Django 프로젝트 페이지가 나타납니다
    인자가 너무 많아서 ini 파일에 쓸 수 있습니다
    저는 Django 프로젝트의 동급 디렉터리에서 lvideouwsgi.ini 파일, 다음 내용에 쓰기 (사전 형식)
    /home의 파일, LVideo는 clone에서 내려온 프로젝트입니다.
    [root@VM_0_14_centos home]# ls
    LVideo  lvideo_uwsgi.ini  test.py  uwsgi.log  uwsgi.pid
    

    새 lvideouwsgi.ini
    vi lvideo_uwsgi.ini
    

    참고:
    # lvideo_uwsgi.ini file
    [uwsgi]
    
    # Django-related settings
    http = :8008
    #        
    
    # Django      (    )
    chdir           = /home/LVideo
    
    # wsgi.py         
    module          = LVideo.wsgi
    
    # process-related settings
    # master
    master          = true
    
    #       
    processes       = 4
    
    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    #                ,  unix socket   pid  
    vacuum          = true
    
    #         ,               udp   
    daemonize = /home/uwsgi.log
    
    #   pid     ,      pid 
    pidfile = /home/uwsgi.pid
    
    #           ,       uWSGI        
    disable-logging = true
    

    이 내용을 복사할 수 있습니다.chdir,module,daemonize,pidfile 수정에 주의하십시오.
    [uwsgi]
    
    socket          = :8008
    chdir           = /home/LVideo
    module          = LVideo.wsgi
    master          = true
    processes       = 4
    vacuum          = true
    daemonize       = /home/uwsgi.log
    pidfile         = /home/uwsgi.pid
    disable-logging = true
    

    포트는 다음과 같은 두 가지로 구성됩니다.
    http   =:8008               ,    
    socket =:8008       nginx      
    

    두 개가 뒤바뀌면 오류가 발생하기 때문에 브라우저 테스트가 끝난 후에 socket을 수정해야 합니다
    이렇게 저장한 후 시작
    uwsgi --ini lvideo_uwsgi.ini
    

    만약 당신의 ini 파일이 http =:8008라면 브라우저를 통해 8008 포트에 접근한 다음 수정을 주의하십시오 socket =:8008왜냐하면 저희가 뒤에 nginx를 결합시켜야 돼요.
    주: 데모니즈를 설정한 후 uwsgi가 성공적으로 실행된 모습입니다
    [root@VM_0_14_centos home]# uwsgi --ini  lvideo_uwsgi.ini 
    [uWSGI] getting INI configuration from lvideo_uwsgi.ini
    

    Nginx 테스트
    앞에 Yum을 통해서 nginx가 설치되어 있어요.
    Nginx 버전 보기
    nginx -v
    

    그리고 서버 IP에 액세스하면 CentOS의 시작 화면을 볼 수 있습니까?나도 왜 Nginx의 환영 인터페이스가 아닌지 모르겠는데...(index.html 문제인 것 같다)
    80 포트를 차지하는 프로세스가 있는지 확인하십시오
    lsof -i:80
    

    여기 있습니다.
    kinsing   11406 root    5u  IPv4 3066592      0t0  TCP VM_0_14_centos:47296->ip255.ip-139-99-50.net:http (ESTABLISHED)
    kinsing   11406 root    7u  IPv4 3068905      0t0  TCP VM_0_14_centos:48120->ip255.ip-139-99-50.net:http (ESTABLISHED)
    kdevtmpfs 11537 root   15u  IPv4 3021919      0t0  TCP VM_0_14_centos:46146->45.89.230.240:http (ESTABLISHED)
    kdevtmpfs 11537 root  175u  IPv4 3068497      0t0  TCP VM_0_14_centos:42542->178.170.189.5:http (SYN_SENT)
    kdevtmpfs 11537 root  176u  IPv4 3068779      0t0  TCP VM_0_14_centos:42604->178.170.189.5:http (SYN_SENT)
    kdevtmpfs 11537 root  177u  IPv4 3068921      0t0  TCP VM_0_14_centos:42656->178.170.189.5:http (SYN_SENT)
    

    채광 바이러스(내가 산 텐센트 서버)는 이따가 다시 처리하여 80포트가 점유되었다는 것을 설명한다. 그러면 우리는 8088포트로 배치할 것이다.nginx -t를 입력하여nginx를 보세요.conf 위치
    [root@VM_0_14_centos ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    그런 다음 수정
    vi /etc/nginx/nginx.conf
    

    서버 부분을 아래의 것으로 대체합니다
    server {
        listen       8088;
        server_name  localhost;
    
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
    
        charset UTF-8;
        #         
        access_log  /var/log/nginx/LVideo_access.log;
        error_log   /var/log/nginx/LVideo_error.log;
    
        client_max_body_size 75M;
        location / {
            #   uwsgi_params     
            include /etc/nginx/uwsgi_params;
            #   uwsgi  
            uwsgi_pass 127.0.0.1:8008;
            #       
            uwsgi_read_timeout 30;
        }
    }
    

    보존
    8088 포트에 접근한 페이지가 있는지 확인하세요
    나타나면502 Bad Gateway nginx/1.16.1다음 명령을 입력하여 이미 존재하는 uwsgi나nginx 프로세스가 있는지 확인하십시오
    ps -ef | grep uwsgi
    
    ps -ef | grep nginx
    

    있으면 죽일 수 있어.
    killall -9 uwsgi
    
    killall -9 nginx
    

    그리고 uwsgi와nginx를 다시 실행합니다
    uwsgi --ini lvideo_uwsgi.ini
    
    systemctl start nginx.service
    

    그리고 꼭 8088 포트의 페이지를 보실 수 있습니다. 저는 4번(전전후후 10번 조정)!!
    만약 당신의 프로젝트 인터페이스가 매우 low로 변했다면, 그것은nginx가 정적 파일을 분석하도록 설정하지 않았기 때문입니다.conf의 location/{} 앞에 Django 프로젝트 정적 폴더의 경로를 추가합니다
    location /static/ {
            #   static     
            alias /home/LVideo/LVideo/static/;
        }
    

    uwsgi+nginx 프로세스
    uwsgi를 시작할 때 pid를 지정하면 pid를 통해 uwsgi를 정지할 수 있습니다. 지정하지 않으면 kill uwsgi의 프로세스 id를 직접 지정하면 uwsgi를 다시 시작하여 닫을 수 없습니다.
    부록:
    # nginx     
    systemctl enable nginx.service
    
    #   uwsgi  
    # 1、    daemonize:
    Ctrl+c(         )
    
    # 2、  daemonize pidfile:
    uwsgi --stop uwsgi.pid
    
    # 3、  daemonize,    pidfile   ps,  uwsgi    
    ps aux|grep uwsgi
    # kill pid   SIGTERM,      ,      。    SIGINT SIGQUIT,    INT   
    killall -s INT /usr/local/bin/uwsgi
    
    #    
    -bash: killall: command not found
    
    #  
    # debian、ubuntu   :
      apt-get install psmisc
    
    # centos  :
      yum install psmisc
    
    #        :
    lsof -i:80
    
    ps -ef | grep nginx
    
    killall -9 nginx
    

    코드 커밋
    서버 Django 코드를 github에 업데이트
    find / -name id_rsa
    

    ssh 열쇠 없음
    cd ~ 아래: ssh-keygen -t rsa -C "[email protected]"돌아오다
    보기: Enter file in which to save the key (/root/.ssh/id_rsa)
    cat /root/.ssh/id_rsa.pub
    

    내용을 github에 복사하면 됩니다
    Django(Git)+uwsgi+Nginx+venv
    참고 자료
    하나
    django 프로젝트를 서버+가상 환경에 배치하여nginx+uwsgi배치 Django의 모든 문제를 해결하려면 로컬의 Django 프로젝트를 서버(친측)centos6에 어떻게 배치합니까?5 다음 django+uwsgi+nginx centos 다음 django, uwsgi와nginx(친측 성공) Python+Django+Nginx+Uwsgi(사상 전 단계) uWSGI+django+nginx의 작업 원리 절차와 배치 과정 Linuxvim 명령 uwsgi, wsgi와nginx의 차이와 관계!!
    두 번째
    uwsgi 프로세스 uWSGI의 설치 및 설정 (홈페이지 발췌) centos7 nginx 설치/시작/프로세스 상태/프로세스 nginx 버그 502 오류, 로그 connect () failed (111: Connection refused) while connecting to upstream 해결 Linux에서 Git와 GitHub의 연결을 구축하고 로컬로 복제하는 방법

    Django + Vue를 사용합니다.js 앞뒤 분리 프로젝트 신속하고 우아하게 구축

    좋은 웹페이지 즐겨찾기