클라우드 서버에 Django+uwsgi+Nginx 배포
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는 최종적으로 반환 값을 클라이언트(예를 들어 브라우저)에게 되돌려준다. 주: 서로 다른 구성 요소 간에 데이터 형식과 프로토콜의 변환과 관련된 정보를 전달한다.
역할
단계
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 앞뒤 분리 프로젝트 신속하고 우아하게 구축
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.