Django + Nginx + Gunicorn Linux 배포 사이트 시스템

11655 단어 Django사이트 배치
사이트 시스템 을 생산 조건 기준 에 따라 배치 하고 배치 방안 은 현재 유행 하 는 Nginx+Gunicorn 을 사용한다. 。
배치 환경
  • CentOS 7.1 64bit
  • Python 3.6.5

  • 프로젝트 준비
    우선 로 컬 프로젝트 를 서버 위 에 올 려 야 합 니 다. 저 는 Github 클론 프로젝트 를 사용 합 니 다. 코드 라 이브 러 리 에서 복제 하 는 방식 은 서버 위의 프로젝트 를 코드 창고 와 동기 화 할 수 있 기 때 문 입 니 다.우선 설치 git
    # yum install git

    이어서 새 항목 파일 저장 디 렉 터 리 webapps/blog
    # mkdir -p /webapps/blog

    디 렉 터 리 에 들 어가 원 격 창고 코드 를 복제 합 니 다.
    # cd /webapps/blog
    # git clone https://github.com/leeyis/jbt_blog.git jbt_blog

    위의 이 git 명령 은 jbt 를blog. git 이 프로젝트 는 로 컬 로 복제 되 어 jbt 라 고 명명 되 었 습 니 다.블 로그, 물론 프로젝트 의 이름 은 원 하 는 대로 이름 을 지 을 수 있 습 니 다.
    네트워크 접근 이 성공 할 수 있 도록 서버 80 포트 를 개방 해 야 합 니 다. 본 고 는 서버 가 CentOS 7.1 이 므 로 다음 명령 을 실행 하여 80 포트 를 개방 합 니 다. (열 린 것 은 무시 할 수 있 습 니 다)
    # firewall-cmd --add-service=http --permanent
    # firewall-cmd --add-port=80/tcp --permanent

    방화벽 재 부팅
    # firewall-cmd --reload

    서버 포트 오픈 상황 보기
    # firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0
      sources:
      services: dhcpv6-client ssh http
      ports: 80/tcp
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:

    80 포트 가 열 려 있 는 것 을 볼 수 있 습 니 다.
    배치 과정
    1. 시스템 사용자 만 들 기
    기본 루트 사용자 권한 이 너무 큽 니 다. 시스템 보안 위험 을 낮 추기 위해 서 는 웹 애플 리 케 이 션 을 실행 할 시스템 사용 자 를 따로 새로 만들어 야 합 니 다. 이 사용 자 는 제 한 된 권한 을 사용 하여 웹 애플 리 케 이 션 을 실행 해 야 합 니 다.
    먼저 시스템 그룹 webapps 을 새로 만 든 다음 응용 프로그램 에 사용 자 를 만 듭 니 다. 이름 은 jbt 이 고 시스템 그룹 webapps 에 첨부 합 니 다.
    # groupadd --system webapps
    # useradd --system --gid webapps --home /webapps/blog jbt

    2. 가상 환경 만 들 기
    가상 환경의 생 성 사용 Virtualenv 도 구 는 시스템 에서 독립 된 Python 환경 을 만 들 수 있 고 여러 응용 프로그램 간 에 서로 영향 을 받 지 않 으 며 서로 다른 응용 프로그램 이 사용 하 는 의존 라 이브 러 리 는 서로 충돌 하지 않 습 니 다.가상 환경 을 설치 하기 전에 pip 이 패키지 관리 도 구 를 사용 해 야 합 니 다. 서버 에 없 는 것 은 이 글 http://jinbitou.net/2016/11/13/2148.html 을 참고 하여 설치 할 수 있 으 면 설명 하지 않 습 니 다.
    다음 명령 을 실행 하여 가상 환경 만 들 기 jbt_env
    # cd /webapps/blog/
    # virtualenv jbt_env
    Using base prefix '/usr/local'
    New python executable in /webapps/blog/jbt_env/bin/python
    Installing setuptools, pip, wheel...done.

    다음 명령 을 실행 하여 가상 환경 을 활성화 합 니 다.
    # source jbt_env/bin/activate

    프로젝트 코드 가 있 는 디 렉 터 리 로 전환 하여 찾기 requirements.txt
    (jbt_env) # cd jbt_blog/
    (jbt_env) # ls -al
        416
    drwxr-xr-x 7 root root 144 5  4 17:57 .
    drwxr-xr-x 4 root root 35 5  4 21:30 ..
    drwxr-xr-x 3 root root 35 5  4 17:57 apps
    -rw-r--r-- 1 root root 413696 5  4 17:57 db.sqlite3
    drwxr-xr-x 8 root root 152 5  4 17:57 .git
    drwxr-xr-x 2 root root 70 5  4 17:57 jbt_blog
    -rw-r--r-- 1 root root 540 5  4 17:57 manage.py
    -rw-r--r-- 1 root root 1867 5  4 17:57 README.md
    -rw-r--r-- 1 root root 72 5  4 17:57 requirements.txt
    drwxr-xr-x 6 root root 49 5  4 17:57 static
    drwxr-xr-x 2 root root 108 5  4 17:57 templates

    다음 명령 을 사용 하여 설치 의존:
    (jbt_env) # pip install -r requirements.txt

    개발 모드 로 프로젝트 가 정상적으로 작 동 할 수 있 는 지 시험 해 보 세 요.
    (jbt_env) # python manage.py runserver
    Performing system checks...
    
    System check identified no issues (0 silenced).
    May 05, 2018 - 22:28:56
    Django version 2.0.3, using settings 'jbt_blog.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.

    이로써 프로젝트 의 기본 운행 조건 은 이미 준비 되 었 다.
    3. settings. py 파일 수정
    (jbt_env) # vi jbt_blog/settings.py

    다음 두 곳 을 수정 합 니 다.
    DEBUG = False ALLOWED_HOSTS = [‘127.0.0.1’, ‘localhost’, ‘demo1.jinbitou.net’]
    그 중 demo1.jinbitou.net 은 나의 도 메 인 이름 이 니, 너 는 너 자신의 것 으로 바 꿔 야 한다.
    4. Gunicorn 설치 및 설정
    생산 환경 에서 우 리 는 Django 가 자체 적 으로 가지 고 있 는 단일 스 레 드 개발 서버 를 사용 해 서 는 안 된다. GUNICORN 을 설치 하 는 것 이 좋 은 선택 이다.
    (jbt_env) # pip install gunicorn
    Collecting gunicorn
      Downloading https://files.pythonhosted.org/packages/55/cb/09fe80bddf30be86abfc06ccb1154f97d6c64bb87111de066a5fc9ccb937/gunicorn-19.8.1-py2.py3-none-any.whl (112kB)
        100% |████████████████████████████████| 122kB 6.6MB/s
    Installing collected packages: gunicorn
    Successfully installed gunicorn-19.8.1

    설치 에 성공 하면 다음 명령 을 통 해 django 응용 프로그램 이 gunicorn 에서 실 행 될 수 있 는 지 테스트 할 수 있 습 니 다.
    (jbt_env) # gunicorn jbt_blog.wsgi:application --bind 0.0.0.0:8000
    [2018-05-05 22:41:51 +0800] [17262] [INFO] Starting gunicorn 19.8.1
    [2018-05-05 22:41:51 +0800] [17262] [INFO] Listening at: http://0.0.0.0:8000 (17262)
    [2018-05-05 22:41:51 +0800] [17262] [INFO] Using worker: sync
    [2018-05-05 22:41:51 +0800] [17265] [INFO] Booting worker with pid: 17265

    출력 을 통 해 모든 것 이 정상 임 을 알 수 있 습 니 다. Gunicorn 이 설치 되 어 있 으 면 다음 에 bash 스 크 립 트 를 새로 만들어 서 사용 하기에 편리 하도록 설정 합 니 다. 파일 은 / webapps / blog / gunicorn 로 저 장 됩 니 다.start.sh
    (jbt_env) # deactivate
    # touch /webapps/blog/gunicorn_start.sh
    # vi /webapps/blog/gunicorn_start.sh

    다음 내용 을 추가 하고 저장 합 니 다.
    #!/bin/bash
    NAME='jbt_blog' #     
    DJANGODIR=/webapps/blog/jbt_blog #django     
    SOCKFILE=/webapps/blog/jbt_blog/gunicorn.sock #    sock   
    USER=jbt #        
    GROUP=webapps #       
    NUM_WORKERS=3 #gunicorn        
    DJANGO_SETTINGS_MODULE=jbt_blog.settings #django     
    DJANGO_WSGI_MODULE=jbt_blog.wsgi #wsgi  
    LOG_DIR=/webapps/blog/logs #    
    
    echo "starting $NAME as `whoami`"
    
    #  python      
    cd $DJANGODIR
    source ../jbt_env/bin/activate
    export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
    export PYTHONPATH=$DJANGODIR:$PYTHONPATH
    
    #  gunicorn.sock          
    RUNDIR=$(dirname $SOCKFILE)
    test -d $RUNDIR || mkdir -p $RUNDIR
    
    #  Django
    
    exec ../jbt_env/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
        --name $NAME \
        --workers $NUM_WORKERS \
        --user=$USER --group=$GROUP \
        --log-level=debug \
        --bind=unix:$SOCKFILE \
        --access-logfile=${LOG_DIR}/gunicorn_access.log

    Django 를 시작 하 는 코드 의 일부 인자 설명:
  • --workers 설정 한 개수 규칙 은 2 * CPU + 1 입 니 다.따라서 단일 핵 CPU 기기 의 프로 세 스 수 는 3 개 로 설정 되 어 있 습 니 다.
  • --name  기본 값 은 gunicorn 입 니 다. top 이나 ps 를 통 해 프로 세 스 를 표시 할 수 있 습 니 다.
  • /webapps/blog/gunicorn_start.sh 실행 가능 한 권한 추가
    # chmod +x /webapps/blog/gunicorn_start.sh

    사용자 jbt 가 이 프로그램 을 실행 하려 면 이 디 렉 터 리 권한 을 jbt 에 게 넘 겨 야 합 니 다.
    # chown -R jbt:webapps /webapps/blog

    이 스 크 립 트 를 실행 하려 면 사용자 jbt 로 전환 할 수 있 습 니 다.
    # su - jbt
    # ./gunicorn_start.sh

    성공 하면 다음 출력 을 볼 수 있 습 니 다:
    [2018-05-05 23:30:54 +0800] [18417] [INFO] Starting gunicorn 19.8.1
    [2018-05-05 23:30:54 +0800] [18417] [DEBUG] Arbiter booted
    [2018-05-05 23:30:54 +0800] [18417] [INFO] Listening at: unix:/webapps/blog/jbt_blog/gunicorn.sock (18417)
    [2018-05-05 23:30:54 +0800] [18417] [INFO] Using worker: sync
    [2018-05-05 23:30:54 +0800] [18424] [INFO] Booting worker with pid: 18424
    [2018-05-05 23:30:54 +0800] [18425] [INFO] Booting worker with pid: 18425
    [2018-05-05 23:30:55 +0800] [18417] [DEBUG] 3 workers
    [2018-05-05 23:30:55 +0800] [18427] [INFO] Booting worker with pid: 18427

    5. Nginx 설정
    이 부분 작업 은 모두 root 사용자 신분 으로 로그 인하 여 실 행 됩 니 다.
    일단 Nginx 설치.
    # yum install nginx

    nginx 로그 저장 디 렉 터 리 만 들 기
    # mkdir -p /webapps/blog/logs

    Nginx 프로필 백업 및 편집:
    # cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
    # vi /etc/nginx/nginx.conf

    전체 설정 정 보 는 다음 과 같 습 니 다.
    # For more information on configuration, see:
    # * Official English Documentation: http://nginx.org/en/docs/
    # * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log /var/log/nginx/access.log main;
    
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
    
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
        upstream app_server {
    
        # for UNIX domain socket setups
        server unix:/webapps/blog/jbt_blog/gunicorn.sock fail_timeout=0;
    
        }
        server {
            charset utf-8;
            listen 80;
            server_name www.demo1.jinbitou.net;
    
            #   
            access_log /webapps/blog/logs/nginx.access.log;
            error_log /webapps/blog/logs/nginx.error.log;
    
            #         favicon.ico      
            location = /favicon.ico { access_log off; log_not_found off; }
    
            # static   media    
            location /static {#  !!!:static     /  ,         404
                alias /webapps/blog/jbt_blog/static;
            }
            location /media {
                alias /webapps/blog/jbt_blog/media;
            }
    
    
            location / {
                proxy_pass http://app_server;           
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
            }
        }
    
        server {
            listen 80;
            server_name demo1.jinbitou.net;
            rewrite ^(.*) http://www.demo1.jinbitou.net$1 permanent;
        }
    
    
    
    # Settings for a TLS enabled server.
    #
    # server {
    # listen 443 ssl http2 default_server;
    # listen [::]:443 ssl http2 default_server;
    # server_name _;
    # root /usr/share/nginx/html;
    #
    # ssl_certificate "/etc/pki/nginx/server.crt";
    # ssl_certificate_key "/etc/pki/nginx/private/server.key";
    # ssl_session_cache shared:SSL:1m;
    # ssl_session_timeout 10m;
    # ssl_ciphers HIGH:!aNULL:!MD5;
    # ssl_prefer_server_ciphers on;
    #
    # # Load configuration files for the default server block.
    # include /etc/nginx/default.d/*.conf;
    #
    # location / {
    # }
    #
    # error_page 404 /404.html;
    # location = /40x.html {
    #
    # ssl_certificate "/etc/pki/nginx/server.crt";
    # ssl_certificate_key "/etc/pki/nginx/private/server.key";
    # ssl_session_cache shared:SSL:1m;
    # ssl_session_timeout 10m;
    # ssl_ciphers HIGH:!aNULL:!MD5;
    # ssl_prefer_server_ciphers on;
    #
    # # Load configuration files for the default server block.
    # include /etc/nginx/default.d/*.conf;
    #
    # location / {
    # }
    #
    # error_page 404 /404.html;
    # location = /40x.html {
    # }
    #
    # error_page 500 502 503 504 /50x.html;
    # location = /50x.html {
    # }
    # }
    
    }

    첫 번 째 server 는 주요 설정 입 니 다. 두 번 째 server 는 ww 가 없 는 도 메 인 이름 을 ww 가 있 는 도 메 인 이름 으로 옮 기 는 것 입 니 다.
    프로필 을 수정 한 후 다음 명령 을 실행 하여 프로필 이 규범 에 맞 는 지 확인 합 니 다.
    # nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

    출력 에서 알 수 있 듯 이 프로필 에 문제 가 없습니다.
    Nginx 다시 시작
    # systemctl restart nginx

    좋은 웹페이지 즐겨찾기