Linux--部署Django項目

簡單部署

1.安裝虛擬環境virtualenvwrapper,建立虛擬環境目錄,進入虛擬環境,個人虛擬環境目錄叫venv2html

[root@HH ~]# workon venv2
(venv2) [root@HH ~]# ls

2.cd進入到項目目錄裏面,安裝項目必須的模塊,例如django,djangorestframework,pymysql等等。node

3.修改settings.py的配置文件python

修改數據庫配置mysql

DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'mydjango', #數據庫名
                'HOST': '127.0.0.1',  #這裏服務器的ip地址
                'PORT': 3306,    #端口
                'USER': 'root',    #用戶名 
                'PASSWORD': 'zou123456',   #用戶密碼
            }
        }

更改容許主機nginx

ALLOWED_HOSTS = ['*']

關閉debug程序員

debug=True

4.進入數據庫建立mydjango數據庫web

5.啓動項目sql

python manage.py runserver 0.0.0.0:8008

注意點:檢查mysql數據庫是否啓動,啓動時加0.0.0.0,關閉防火牆,若是時雲服務器,檢查安全組數據庫

什麼是wsgi

WSGI是web服務器網關接口,它是一個規範,描述了web服務器如何與web應用程序通訊。以及web應用服務器如何連接在一塊兒處理一個請求。django

django的主要部署平臺是WSGI,這是用於web服務器和應用程序的python標準。django的startproject管理命令設置一個簡單的WSGI配置,能夠根據須要爲你的項目進行調整。使用WSGI部署的關鍵概念是應用服務器用於與代碼通訊的application可調用。它一般在服務器可訪問的python模塊中做爲名爲application的對象提供。

startproject命令建立包含這樣的application可調用的文件<project_name>/wsgi.py,它被django的開發服務器和生產WSGI部署使用。WSGI服務器從配置中獲取application可調用的路徑,django的內置服務器,既runservre命令,從WSGI_APPLICATION設置讀取它。

爲何要用nginx+uwsgi

nginx是對外的服務接口,外部瀏覽器經過url訪問nginx,nginx接收到瀏覽器發送來的http請求,將包進行解析,分析url,若是是靜態文件請求就直接訪問用戶給nginx配置的靜態文件目錄,直接返回用戶請求的靜態文件資源。

若是不是靜態文件,而是一個動態的請求。那麼nginx就將請求轉發給uwsgi,uwsgi 接收到請求以後將包進行處理,處理成wsgi能夠接受的格式。併發給wsgi,wsgi根據請求調用 應用程序的某個文件的某個函數。處理完將返回值在交給wsgi,wsgi將返回值進行打包,打包成uwsgi可以接受的格式,uwsgi接收wsgi發送的請求,並轉發給nginx,nginx最終將返回值返回給瀏覽器。

nginx並非必須的,uwsgi徹底能夠完成整個和瀏覽器交互的流程,但要考慮到某些狀況

1.安全問題:程序不能直接被瀏覽器訪問到。而是經過nginx,nginx只開放某個接口。uwsgi自己是內網接口,在nginx上加上安全性的限制,能夠達到保護程序的做用。

2.負載均衡:一個uwsgi極可能不夠用, 即便開了多個work也不行,畢竟一臺機器的cpu和內存是有限的,有了nginx作代理,一個nginx能夠代理多臺uwsgi完成uwsgi的負載均衡。

3.靜態文件:用django或者uwsgi這種東西來負責靜態文件的處理是很浪費的行爲,並且他們自己對文件的處理也不如nginx好,因此整個 靜態文件的處理都由nginx完成,靜態文件的訪問徹底不通過uswgi以及後面的東西。

uwsgi    # 和wsgi同樣是通訊協議,是uWSGI服務器的單獨協議,用於定義傳輸信息的類型

uWSGI # 是一個web服務器,實現了WSGI協議,uwsgi協議。a

nginx # web服務器,更加安全,更好的處理處理靜態資源,緩存功能,負載均衡,所以nginx的強勁性能,配合uWSGI服務器會更加安全,性能有保障。

django # 高級的python web框架,用於快速開發,解決web開發的大部分麻煩,程序員能夠更專一業務邏輯,無須從新造輪子

若是將一次通訊轉化爲「對話」的過程

Nginx:hello wsgi,我剛收到一個請求,你準備下而後讓django來處理吧

WSGI:好的nginx,我立刻設置環境變量,而後把請求交給django

Django:謝謝WSGI,我處理完請求立刻給你響應結果

WSGI:好的,我在等着

Django:搞定啦,麻煩wsgi吧響應結果傳遞給nginx

WSGI:太棒了,nginx,響應結果請收好,已經按照要求傳遞給你了

nginx:好滴。我把響應交給用戶。合做愉快

Django+Nginx+uwsgi 安裝配置

在前面咱們使用python manage.py runserver 0.0.0.0:8008來運行服務器,這隻適用於測試環境中使用。正式發佈的服務,須要一個能夠穩定而持續的服務器。

在使用Django+Nginx+uwsgi部署時,請確保簡單部署沒問題。仍是在虛擬環境venv2裏部署。

1.進入虛擬環境venv2,安裝uwsgi,Apitest爲個人django項目名,代表我如今在項目的根目錄下。

(venv2) [root@HH Apitest]# pip3 install -i https://pypi.douban.com/simple uwsgi

檢查uwsgi的版本

(venv2) [root@HH Apitest]# uwsgi --version
2.0.18

2.經過uwsgi啓動django項目(uwsgi不處理static靜態文件的配置)

確保當前的路徑爲項目根目錄下,也就是和manage.py文件同級,注意--http後面有空格

(venv2) [root@HH Apitest]# uwsgi --http :9001 --module Apitest.wsgi
*** Starting uWSGI 2.0.18 (64bit) on [Sun Oct  6 14:33:07 2019] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-39) on 06 October 2019 05:24:14
os: Linux-3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019
nodename: HH
machine: x86_64
clock source: unix
  • --http   指明是http協議
  • :9001  指定端口號
  • --module Apitest.wsgi 加載指定的wsgi模塊,根據本身的項目名稱本身指定

訪問咱們的django自帶的後臺,靜態文件不加載

 啓動後查看進程

[root@HH ~]# ps -ef | grep uwsgi

 補充:你們都知道pycharm會自動檢測django項目,若是代碼有變更,會自動重啓,uswgi也能夠,加上一個參數就能夠了

(venv2) [root@HH Apitest]# uwsgi --http :9001 --module Apitest.wsgi --py-autoreload=1

--py-autoreload是告訴uwsgi自動重啓加載django項目,1表示爲True

咱們能夠把上面的配置也在文件裏,經過配置文件啓動,uwsgi支持ini、xml等多種配置方式,本文以 ini 爲例, 在項目的根目錄下(和manage.py)建立一個uwsgi.ini文件,寫入下面內容

[uwsgi]
# 項目的絕對路徑,定位到項目的第一層,個人項目是放在tmp下
chdir           = /tmp/Apitest# 指明項目的wsgi文件路徑
module          =Apitest.wsgi
# 指明你的虛擬解釋器的第一層路徑
home            = /root/Envs/venv2
#指明經過uwsgi,啓動多少個進程
processes       = 5

#若是你已經配置了nginx(啓動了nginx服務,配置了uwsgi_pass),請用這個socket鏈接
#socket          = 0.0.0.0:8000

#若是你沒用nginx,想經過uwsgi直接啓動web服務,指明http協議
http = 0.0.0.0:9999

#在退出uwsgi環境後,清空環境變量
vacuum          = true

而後就能夠經過下面命令啓動了

(venv2) [root@HH Apitest]# uwsgi --ini uwsgi.ini 

注意uwsgi不會處理靜態文件,若是有,也是瀏覽器的緩存

3.配置django的settings.py,收集全部Apitest項目所需的靜態文件

在settings.py配置文件加下面一行

STATIC_ROOT='/tmp/static/'    #  路徑本身指定

執行命令

python manage.py collectstatic

此時Apitest的全部靜態文件,都跑到/tmp/static/底下了

4.配置nginx

配置一個網站入口,當用戶訪問192.168.88.67:80 這個web應用時,自動將請求轉發給uwsgi,uwsgi處理後,返回給nginx,返回給用戶

當請求是192.168.88.67:80的時候,其實訪問的是192.168.88.67:9999  這是動態請求,由於我是找到的uwsgi

確保nginx啓動的

配置文件

nginx.conf配置以下

#定義負載均衡池,裏面放入uwsgi的地址
    upstream Api{
        server 127.0.0.1:8000;
}

    server {
       listen 80;
       server_name  localhost;
       # 將nginx入口的請求,直接反向代理給uwsgi
       location / {
         uwsgi_pass  Api;
         include /opt/nginx1-16/conf/uwsgi_params;
}
    # 經過nginx處理nbcrm的靜態文件
    location /static {
        alias /tmp/static/;
        }
    }

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    # 定義負載均衡池,裏面放入uwsgi的地址
    upstream Api {
       server 127.0.0.1:8000;
      } 
    server {
        listen       80;
        server_name  localhost;
       # 將nginx入口的請求,直接反向代理給uwsgi
        location / {
             uwsgi_pass Api;
             include /opt/nginx1-16/conf/uwsgi_params;
     }
      #經過nginx處理nbcrm的靜態文件
        location /static{
              alias /tmp/static/;
         }
        location /status {
              stub_status on;
         }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

}
server {
        listen       80;
        server_name  www.balabala.com;
        location / {
            root   /data/balabala;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

}
}
個人nginx的配置文件,僅供參考

檢查配置文件,加載配置文件

(venv2) [root@HH sbin]# ./nginx -t
(venv2) [root@HH sbin]# ./nginx -s reload
(venv2) [root@HH sbin]# ./nginx

5.更改uwsgi.ini ,指明socket鏈接,結合uwsgi 和nginx

若是你已經配置了nginx,請用這個socket鏈接socket = 0.0.0.0:8000

[uwsgi]
#項目的絕對路徑,定位到項目的第一層
chdir           = /tmp/LuffyBoy
#指明項目的wsgi文件路徑
module          =LuffyBoy.wsgi
#指明你的虛擬解釋器的第一層路徑
home            = /root/Envs/venv2
#指明經過uwsgi,啓動多少個進程
processes       = 5

#若是你已經配置了nginx(啓動了nginx服務,配置了uwsgi_pass),請用這個socket鏈接
socket          = 0.0.0.0:8000    # 使用這個,將下面的http註釋掉

#若是你沒用nginx,想經過uwsgi直接啓動web服務,指明http協議
#http = 0.0.0.0:9999

#在退出uwsgi環境後,清空環境變量
vacuum          = true

6.啓動uwsgi.ini 

(venv2) [root@HH Apitest]# uwsgi --ini uwsgi.ini 

7.而且訪問nginx的域名入口,查看是否能訪問到uwsgi項目,而且靜態文件是否正常

 這樣靜態文件也加載上了

相關文章
相關標籤/搜索