Django + Nginx + Gunicorn Linux 배포 사이트 시스템
Nginx+Gunicorn
을 사용한다. 。 배치 환경
프로젝트 준비
우선 로 컬 프로젝트 를 서버 위 에 올 려 야 합 니 다. 저 는 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.