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是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是對外的服務接口,外部瀏覽器經過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:好滴。我把響應交給用戶。合做愉快
在前面咱們使用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
訪問咱們的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; } } }
檢查配置文件,加載配置文件
(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項目,而且靜態文件是否正常
這樣靜態文件也加載上了