단계 및 일반적인 문제 요약의 실제 개발하여 솔루션 정제 솔루션 단계 : 우분투에 Nginx에 배포 장고 프로젝트의 핵심 정보를 바탕으로

나는 자신의 아이디어를 적어 사람들을 기분 일부 단계의 핵심이 무엇인지 모르는 너무 장황한 있으며, 그들 중 대부분은 혼란, 일부는 너무 단순 읽을 수없는, 많은 온라인 기사의 장고와 Nginx의 배포에 대해이 있습니다. 구체적으로 표시되지 않은 많은 세부 사항이 있습니다, 리드를 얻는 방법 실패 오류입니다. 일일 시간의 힘든 탐사 후, 상세한 튜토리얼을 명확하게 표현에 강화 된 구덩이에 단계 수, 나는이 문서가 당신을 도울 수 있기를 바랍니다!

 

핵심 개념의 분석 :

WSGI는 웹 서버 게이트웨이 인터페이스의 약자입니다. 계층 뷰 각도이다 WSGI 층 CGI의 위치보다 낮다. 그러나 차이는 WSGI 단지 표준을 달성하는 방법을 정의하지 않기 때문에 그 WSGI의 CGI는, 강력한 확장 성을 가지고 있으며, 다중 스레드 환경이나 프로세스에서 실행할 수 있습니다. 이 웹 응용 프로그램 및 웹 서버 사이에 위치하며, 웹 서버가 CGI 수 있기 때문에 사실 WSGI는 CGI 없습니다. 그것은 내장 된 테스트 웹 서버 파이썬으로 이해 될 수있다.

uWSGI는 WSGI 프로토콜, uwsgi, HTTP 및 기타 프로토콜을 구현하는 웹 서버입니다. HttpUwsgiModule uWSGI에서 Nginx의 역할은 서버와 교환된다. WSGI는 웹 서버 게이트웨이 인터페이스입니다. 예를 들어, HTTP 프로토콜은 WSGI 프로토콜로 변환, 그래서 파이썬에서 직접 사용할 수 있습니다.

둘째, 프로젝트 환경
OS : 우분투 16.04

프로그래밍 언어 : 파이썬 3.5.2

웹 프레임 워크 : 장고 2.0.3

웹 서버 : uWSGI 2.0.17

웹 서버 : Nginx와의 1.10.3

여기에 특정 설치, 우분투 사용 설명하지 특히 ​​편리한 설치 APT를-얻을.

sudo apt-get install python3
sudo apt-get install python3-pip
sudo apt-get install nginx



Nginx에 성공적으로 브라우저에 설치 127.0.0.1을 입력! "nginx에 오신 것을 환영합니다"가 나타납니다 성공적인 설치를 나타냅니다.

세, uWSGI 설치 구성
설치

sudo pip3 install uwsgi


테스트
test.py 파일을 생성

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b'Hello World']


uWSGI하여 파일을 실행

uwsgi --http :8000 --wsgi-file test.py



브라우저에서 127.0.0.1:8000를 입력, "안녕하세요"는 성공적인 설치를 나타냅니다 나타납니다.

통신 사이 네, 장고 uWSGI 및
설치 장고

sudo pip3 install Django==2.0.3



장고 프로젝트를 만듭니다

django-admin startproject myweb


내가 장고 프로젝트 위치 : / 홈 / 설정 / myweb

uwsgi --http :8000 --chdir /home/setup/myweb --wsgi-file myweb/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:8001


일반적인 옵션
HTTP : 프로토콜 유형 및 포트 번호

처리 : 열려있는 프로세스의 수

근로자 : 열려있는 프로세스의 수, 프로세스와 동일

CHDIR : 실행 디렉토리를 지정합니다

WSGI 파일 :로드 WSGI 파일

통계 : 상태 서비스의 지정된 주소

스레드 : 실행 스레드. GIL로의 때문에, 나는이 정말 무의미하다 생각합니다.

마스터 : 주 과정의 존재를 허용

데몬으로 : 프로세스가 백그라운드에서 실행 및 로그는 지정된 로그 파일 또는 UDP 서버 (데몬으로 uWSGI)를 기록했다. 사실, 가장 일반적으로 사용되는, 또는 로컬 출력을 파일에 기록 할 수 있습니다.

pidfile : 기본 프로세스의 PID 파일, 기록 PID 번호의 위치를 ​​지정합니다.

진공 : 서버 종료가 자동으로 환경을 정리하면, 유닉스 소켓 파일과 PID 파일을 삭제

샤오 총통이 추천 315 346 913 파이썬 학습의 학교 인구 , 당신은 큰 또는 작은 흰색 암소 여부입니다 경력을 변경하거나 가입하고자 할 함께 진행 상황을 이해하는 법을 배워야 함께 올 수 있습니다! 그룹 내 도구가 있습니다, 건조 제품 및 기술 정보를 많이 공유!

다섯째, Nginx에, uWSGI, 장고 간의 통신
다음으로, 우리는 세 가지를 결합하려는

1. 구성 장고와 uWSGI은
먼저 장고 프로젝트의 루트 디렉토리에 uWSGI uwsgi.ini 프로필을 만들

cd myweb
touch uwsgi.ini 



다음과 같이 장고 프로젝트 디렉토리 파일 구조에서입니다 :

MyWeb /
├── manage.py를
├── MyWeb
│ ├── __init__.py가
│ ├── __pycache__
│ │ ├── __init __. CPython의-35.pyc
│ │ └── settings.cpython-35.pyc
│ ├ settings.py -
│ ├── urls.py를
│ └── wsgi.py
└── uwsgi.ini

우리가 하위 디렉토리 myweb에, 장고에 의해 myweb 프로젝트를 만들 때 우리가 wsgi.py 파일을 생성 할 수있었습니다. 그래서, 우리는 단지 uwsgi.ini 구성 파일을 작성해야합니다.

uwsgi는 등등 XML, INI과 같은 구성 파일의 여러 유형을 지원합니다. 여기에서, 구성의 INI 형식의 사용.

다음으로, 방금 만든 좋은 uwsgi.ini는 다음과 같은 구성을 추가 구성 파일을 엽니 다

[uwsgi]

socket = :8888
chdir           = /home/setup/myweb
module          = myweb.wsgi
master          = true
processes       = 4
vacuum          = true



이 구성은, 사실, 명령의 방법으로 해당 WSGI는 문서에 매개 변수의 무리 하였다.

소켓 : 프로젝트 구현에 지정된 포트 번호입니다.

CHDIR : 디렉토리에 지정된 항목.

모듈 : 모듈 = hello.wsgi 정도로 이해하여야한다. uwsgi.ini 문서의 경우와는 형제 디렉토리 myweb 디렉토리를 가지고,이 디렉토리에 wsgi.py 파일이 있습니다.

다음으로, uwsgi 명령으로 프로젝트를 시작 uwsgi.ini 파일을 읽을

uwsgi --ini uwsgi.ini



결과 :

setup@labideas-data:~/myweb$ uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
*** Starting uWSGI 2.0.17 (64bit) on [Tue Mar 20 11:11:30 2018] ***
compiled with version: 5.4.0 20160609 on 19 March 2018 09:13:12
os: Linux-4.4.0-105-generic #128-Ubuntu SMP Thu Dec 14 12:42:11 UTC 2017
nodename: labideas-data
machine: x86_64
clock source: unix
detected number of CPU cores: 4
current working directory: /home/setup/hello
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/setup/hello
your processes number limit is 64049
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8888 fd 3
Python version: 3.5.2 (default, Nov 23 2017, 16:37:01)  [GCC 5.4.0 20160609]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1f73aa0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 364520 bytes (355 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1f73aa0 pid: 7097 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 7097)
spawned uWSGI worker 1 (pid: 7099, cores: 1)
spawned uWSGI worker 2 (pid: 7100, cores: 1)
spawned uWSGI worker 3 (pid: 7101, cores: 1)
spawned uWSGI worker 4 (pid: 7102, cores: 1)



잘못이 있다면, 우리는 설정 파일이 잘못 설정의 매개 변수를 확인해야합니다보기 시작 정보 uwsgi를합니다.

2. 구성 Nginx의
/ 등 아래 / nginx를 디렉토리에 Nginx의 기본 구성 파일

setup@labideas-data:/etc/nginx$ ll
total 64
drwxr-xr-x  6 root root 4096 Mar 20 09:37 ./
drwxr-xr-x 95 root root 4096 Mar 19 19:56 ../
drwxr-xr-x  2 root root 4096 Mar 19 20:13 conf.d/
-rw-r--r--  1 root root 1077 Feb 12  2017 fastcgi.conf
-rw-r--r--  1 root root 1007 Feb 12  2017 fastcgi_params
-rw-r--r--  1 root root 2837 Feb 12  2017 koi-utf
-rw-r--r--  1 root root 2223 Feb 12  2017 koi-win
-rw-r--r--  1 root root 3957 Feb 12  2017 mime.types
-rw-r--r--  1 root root 1919 Mar 20 09:33 nginx.conf
-rw-r--r--  1 root root  180 Feb 12  2017 proxy_params
-rw-r--r--  1 root root  636 Feb 12  2017 scgi_params
drwxr-xr-x  2 root root 4096 Mar 20 10:00 sites-available/
drwxr-xr-x  2 root root 4096 Mar 19 14:59 sites-enabled/
drwxr-xr-x  2 root root 4096 Mar 19 14:59 snippets/
-rw-r--r--  1 root root  664 Feb 12  2017 uwsgi_params
-rw-r--r--  1 root root 3071 Feb 12  2017 win-utf


다음은 / etc / nginx를 / 사이트 이용 가능한 디렉토리 기본 구성 파일에 갈 필요 (일부 Linux 배포판 구성 파일 /etc/nginx/nginx.conf에, 우리는 우분투 16.04 우선 다른 장소가있다 ).

원래 구성 파일 백업 및 nginx를 구성 파일을 열 수 있습니다

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
sudo vi /etc/nginx/sites-available/default



다른 포트 번호에 기본 포트 번호 80와 같은 8080. 기본 포트 번호 80 쉽게 다른 응용 프로그램에서 사용할 수 있습니다, 우리는 우리 자신의 장고 프로젝트를 구성하기 때문에 또한 기본 포트를 사용해야합니다.

# Django 2.0 项目部署
server {

    listen          80; 
    server_name     data.labideas.cn 
    charset         UTF-8;
    access_log      /var/log/nginx/myweb_access.log;
    error_log       /var/log/nginx/myweb_error.log;

    client_max_body_size 75M;

    location / { 

        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8888;
        uwsgi_read_timeout 2;
    }   

    location /static {

        expires 30d;
        autoindex on; 
        add_header Cache-Control private;
        alias /home/setup/myweb/static/;
    }   
}


듣기 :의 nginx 프록시 외부 포트 번호 uwsgi 지정됩니다.

서버 _ : 온라인 정보의 대부분은 로컬 호스트를 지정하거나 127.0.0.1은 로컬 액세스 할 수있는 경우, 예를 들어, www.baidu.com에 대해 (설정 웹 사이트입니다.

그래서 결국은 uwsgi이 연관 nginx에 어떻게? 지금은 아마도 가장 중요한 것은 두 줄의 구성입니다 것으로 보인다.

include uwsgi_params;
uwsgi_pass 127.0.0.1:8888;


uwsgi_params로 지정해야합니다 있습니다. 그것은 uwsgi_pass 로컬 IP 및 포트 번호를 지칭하고, myweb_uwsgi.ini 프로필 IP 및 포트 번호와 일치한다.

지금의 nginx를 다시 시작

sudo /etc/init.d/nginx restart



브라우저는 127.0.0.1에 액세스

Invalid HTTP_HOST header: 'data.labideas.cn'. You may need to add 'data.labideas.cn' to ALLOWED_HOSTS.
[pid: 7924|app: 0|req: 1/1] 114.249.204.30 () {40 vars in 658 bytes} [Tue Mar 20 06:16:28 2018] GET / => generated 54903 bytes in 41 msecs (HTTP/1.1 400) 1 headers in 53 bytes (1 switches on core 0)



배경에서는 uWSGI 정보 출력을 볼 수 있습니다. IP와 포트 번호를 가리키는으로 요청하면 페이지에 어떤 요청을 수행 할 경우, 당신은 이러한 요청은 결국 다루는 uwsgi 갈 것을 볼 것이다, nginx에 가장 먼저해야합니다.

마지막으로, 우리는 카이에서 부팅하도록 구성 uWSGI합니다

열고 sudo는 VI /etc/rc.local에

uwsgi --ini /home/setup/myweb/uwsgi.ini &


파일에 추가

당신이 종료 0에 추가 할 전에, 및 서비스가 백그라운드에서 수행하고 있음을 나타냅니다.

여섯째, 발생하는 문제
구성 과정에서 항상 다양한 문제가 발생할 것이며, 여기에 내가 가장 일반적으로 몇 가지 문제를 설정 사용, 난 당신이 도울 수 있기를 바랍니다 될 것입니다. 1. 장고 시작 오류

setup@labideas-data:~/myweb$ python3 manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

March 20, 2018 - 06:28:52
Django version 2.0.3, using settings 'myweb.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.



새 프로젝트를 만들고, 장고 자신의 테스트 서버는, 위의 오류를 시작하십시오. 프로젝트 및 기본 데이터의 일부가 데이터베이스로 마이그레이션되지 않기 때문입니다.

해결 방법 :

데이터베이스에 데이터를 마이그레이션

python3 manage.py migrate


2. 오류를 시작 uwsgi
다음과 같은 오류 메시지가있는 경우 시동 정보 uwsgi를 시작할 때 :

!!! no internal routing support, rebuild with pcre support !!!


의존성 문제가 있습니다

해결 방법 :

이 시간을 제거하기 위해주의를 기울 uwsgi 제거, 주사위는 시스템 캐시에 남아

pip uninstall uwsgi


PCRE 종속 라이브러리 설치

CentOS는 설치

sudo yum install pcre pcre-devel pcre-static


우분투 설치

sudo apt-get install libpcre3 libpcre3-dev



핍 캐시를하지 않는, uwsgi를 다시 설치

pip install uwsgi -I --no-cache-dir


다시 시작 Uwsgi, 더! 더 내부 라우팅 지원하지 않는다는 PCRE 지원의 오류와 함께 다시!.

3. 포트 오류는
다음과 같이 때때로 시작과 나타날 수 있습니다 uWSGI 장고 오류를 덮어왔다

Error: That port is already in use



이 포트 번호가 이미 사용입니다 인 Servr 이미 실행 또한 백그라운드에서 실행 할 수 있습니다 또는 당신은, 그러나 해제되지 않은 자원과 포트 번호의 과정을 장고를 중지 할 수 있습니다.

해결 방법 :

이 과정은 죽일 찾을 수

sudo ps aux | grep uwsgi
sudo kill -9 PID


또는 간단한 솔루션을 직접 죽일 것입니다

sudo fuser -k 8000/tcp


이러한 포트 8000 및 관련 프로세스는 죽었을 것이다

4. 공공 포트 보안 설정은 보호
도 분명히 구성된 모든 느낌, 어떤 경우를 많은 시간을 확인합니다. 하지만 강아지의 온라인 날짜, 항상보고 "서버가 응답하지"로컬이 아닌 사소한 문제 및 기타 오류, 또는 로컬 호스트 액세스,하지만 다시 컴퓨터를 공격 할 도메인 이름 또는 외부 네트워크 액세스, 가스를 사용하지 않는 ... 그것은 어떻게되는지입니까?

라인에 공식적인 환경에서 프로젝트는, 때때로 우리는 예를 들어, 우리는 해당 포트 번호를 열어야합니다, 알리 클라우드 서버에 여기에 클라우드 서버를 선택합니다, 공용 인터넷에 있어야합니다.

스마트 학생들은 이미 위의 그림은하지 uwsgi.ini 포트 번호 8888 파일이 않는 이유를 인식 할 수있다?

보안 그룹은 알리 포트는 외부 클라우드 방패 규칙 때문입니다, 우리는 그 영향을받지 네트워크 환경에 포함되어 Nginx에와 8888의 uWSGI 사이의 통신에 사용되는 포트 번호를 소켓.

5. 정식 모드를 시작
우리가 실제 개발에, 디버그 모드를 사용할 필요가 있기 때문에,하지만, 시간에 우리는 공식적으로 출시 DEBUG 모드를 종료해야합니다.

에서 열기 장고 프로젝트 settings.py 구성 파일

DEBUG와 같은 DEBUG = 진정한 개정은 = 거짓

ALLOWED_HOSTS = [] 또는 ALLOWED_HOSTS = [ '*', ALLOWED_HOSTS = [ 'data.labideas.cn']로 변경됩니다
와일드 카드 *를 사용하는 것은 권장하지 않습니다, 당신은 특정 도메인 이름을 추가 할 수 있습니다!

6. 관리자 관리 인터페이스 스타일 시트를 분실
오래 전에, 관리자 테스트는 성공 기준 여부 장고 설치입니다. 그러나 공식적인 환경에서 종종 스타일 시트 누락의 문제가 발생합니다. 왜 그런가?

이 Nginx의 공식적인 환경 때문에, 정적 문서 장고 프로젝트를 찾을 수있다.

해결 방법 :

① 일부 정적 파일을 배치, 정적 디렉토리 장고 프로젝트를 생성

장고 프로젝트 settings.py 구성 파일을 엽니 다 ②

행 추가

STATIC_ROOT = '/home/setup/myweb/static/'


STATIC_ROOT 포인트는 정적 디렉토리 정적 파일을 저장하기

③ 등 필요한 관리자 인터페이스 스타일 시트 (스타일), 사진 (이미지)과 스크립트 (JS) 등을 포함 정적 디렉토리 STATIC_ROOT에 필요한 장고 정적 파일이 가리키는 자원 번들에서 복사.

python3 manage.py collectstatic



하지 첫 번째 단계의 ① 있다면, 직접 오류가 발생합니다이 명령을 실행하는 참고.

구성 파일의 Nginx을 수정 ④

location /static {

    expires 30d;
    autoindex on; 
    add_header Cache-Control private;
    alias /home/setup/html/data/static/;
}



별칭은 정적 파일을 저장하는 정적 디렉토리를 가리 일치하는 디렉토리를 필요로하고 장고 프로젝트 settings.py 프로파일 STATIC_ROOT 포인트.

⑤ uWSGI 다시 시작 Nginx에

# 杀掉 uwsgi.ini 进程
ps aux | grep uwsgi | grep -v grep | awk '{print $2}' | xargs kill -9
uwsgi --ini /home/setup/html/data/uwsgi.ini &

sudo /etc/init.d/nginx restart



음, 지금까지이 튜토리얼이 끝났습니다. 처음 Django2.0에서만 Python3.4 버전 이상을 지원하기 때문에 호환되지 않습니다, Django2.0 버전과 Python3 배포를 선택했다. 그리고이 구덩이 학생들에 다음 급락은 더 많은, 파이썬과 장고 사회에 뭔가 작은 기여를 할 수있는이 목적을 위해 고려 될 수있다.
나는 학교 친구를 학습하는 방법을 몰라 혼란이있다 편집자의 선택 파이썬 학습 쿤 (315) -346- (913) 함께 배우고 학습 진행으로 이해 될 수있다!

추천

출처blog.csdn.net/weixin_44995023/article/details/92419527