在上一篇博文中,向你們介紹了Users App和Index的前端部分的實現,以及前端與Django的通訊部分。至此,咱們的博客已經具有一個簡單的雛形,能夠將其部署在本地的服務器上了。目前較爲流行的web服務器有apache,nginx等等,咱們這裏選擇uwsgi+nginx的方式進行部署。javascript
在部署博客以前,咱們首先來看看Django、uwsgi和nginx三者之間的關係。Django爲Web框架,它用於處理客戶瀏覽器發送給web服務器的各類Http請求,並返回相關頁面;而uwsgi則是一種uWSGI服務器提供的WSGI協議,該協議用於將發送給web服務器的各類請求轉發給Web框架,諸如Django、Flask等。在nginx+uwsgi的架構中,uWSGI服務器僅做爲中間件使用,若沒有nginx做爲web服務器,uWSGI自身也能夠做爲web服務器使用。在咱們這裏,採用nginx做爲真正的web服務器,用於接收客戶發送的各類Http請求,並經過uwsgi協議轉發給Django相關的View函數。因此,三者的關係以下圖所示:css
瀏覽器的http請求首先發到nginx服務器,nginx服務器經過uwsgi協議將http請求按照必定的格式打包好後發送給Django,而後由Django處理這些請求並返回頁面給瀏覽器。html
使用nginx服務器的好處主要有兩點:1.外部的http請求僅能發送給nginx服務器,而不能直接發送給內網,提高了網站的安全性;2. Django這種web框架比較適合用於處理動態請求,而用來處理靜態文件如圖片等會致使性能的浪費,所以能夠將處理靜態文件的工做交給nginx來處理;3. nginx提供了較好的高併發性,當訪問量較大的時候不會有太大的性能問題。前端
瞭解了這三者的關係後,咱們就能夠開始部署了。首先是uwsgi和nginx的安裝,在Ubuntu下,輸入如下命令前後安裝uwsgi和nginx:java
pip3 install uwsgi
sudo apt-get install nginx
在安裝好這兩個後,咱們就能夠對它們進行配置了。首先來看uwsgi的配置。node
uwsgi的配置分爲兩部分:uwsgi的參數配置和uwsgi的啓動配置。uwsgi的參數配置定義了uwsgi在運行中所須要的一些參數,而uwsgi的啓動配置定義了uwsgi啓動時要創建的進程數、線程數等等。首先來看uwsgi的參數配置,咱們能夠在myblog目錄中創建名爲uwsgi_params的文件,輸入如下內容:python
uwsgi_params uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length; uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; uwsgi_param REQUEST_SCHEME $scheme; uwsgi_param HTTPS $https if_not_empty; uwsgi_param REMOTE_ADDR $remote_addr; uwsgi_param REMOTE_PORT $remote_port; uwsgi_param SERVER_PORT $server_port; uwsgi_param SERVER_NAME $server_name; uwsgi_param UWSGI_SCRIPT myblog.wsgi; uwsgi_param UWSGI_CHDIR xxx/djangotest/myblog;
uwsgi的啓動配置能夠經過三種方式來配置:xml文件、ini文件和json,主流方式多使用ini文件進行配置,所以咱們也採用ini文件進行配置。咱們在myblog/myblog目錄下創建一個名爲uwsgi.ini的文件,輸入如下內容:nginx
# uwsgi.ini [uwsgi] # Django-related settings socket = 127.0.0.1:3031 # the base directory (full path) chdir = 你本身的網站目錄 # Django s wsgi file #wsgi-file = wsgi.py module = myblog.wsgi:application # process-related settings # master master = true #daemonize = 本身的Log文件路徑,如/log/xxx.log # maximum number of worker processes processes = 4 threads = 2 stats = 127.0.0.1:9191 buffer-size = 65536 plugins = python
socket = 127.0.0.1:3031:uwsgi要鏈接到的端口,能夠是ip+端口號,也能夠是unix的socket,這裏咱們綁定本地的3031端口。web
module = myblog.wsgi:application:要加載的python WSGI模塊,這裏的myblog.wsgi:application實際上是myblog目錄下的wsgi.py文件中的application,該文件由Django在創建工程時自動產生,以下所示:apache
# myblog/wsgi.py import os from os.path import join,dirname,abspath import sys from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myblog.settings") application = get_wsgi_application()
daemonize = log文件路徑:在設定了daemonize選項後,uWSGI服務器會之後臺方式運行,並把log記錄在你指定的日誌文件中。因爲uWSGI設定爲後臺後不太好關閉,不利於新功能的調試工做,所以我在這裏把它註釋掉。
processes = 4:啓動4個工做進程。
threads = 2:每一個工做進程有2個工做線程。通常來講,threads和processes參數要配合使用,用threads參數爲每一個工做進程指定線程數。
stats = 127.0.0.1:9191:uWSGI提供一個Stats服務器機制,它會將uWSGI的狀態以json的方式發送到這個服務器。這裏對咱們用途不大,能夠不加。
buffer-size = 65535:接收請求的緩存大小。若是須要接收較大的請求,能夠將其設的大一些。
plugins = python:指定python的版本
在配置好uwsgi後,咱們就能夠去配置nginx了。nginx的默認安裝路徑在/etc/nginx下,其配置文件爲該路徑下的nginx.conf,而其服務器程序放在/etc/init.d中。爲了之後操做方便,咱們能夠用alias爲其添加一個快捷命令:
alias nginx = 'sudo /etc/init.d/nginx'
sudo gedit nginx.conf
nginx.conf user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## #ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE #ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log 本身的訪問日誌路徑 error_log 本身的錯誤日誌路徑 ## # Gzip Settings ## gzip on; gzip_disable "msie6"; server { listen 80; client_max_body_size 75M; } # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## #include /etc/nginx/conf.d/*.conf; #include /etc/nginx/sites-enabled/*.conf; } #mail { # 省略此部份內容 #}
因爲nginx不只能夠做爲web服務器使用,也能夠做爲郵件服務器使用,因此其配置文件會分爲http部分和mail部分。咱們在這裏只需使用到http部分的內容,故將mail部分省略。
對於http部分,咱們基本不用動它的默認配置,只是要把access_log和error_log配置成本身的路徑,以便當服務器錯誤時查看對應的日誌。咱們要作的是在http中的server塊中添加一些配置,使nginx與剛纔配置好的uwsgi綁定在一塊兒,而且還要設置前幾篇博文中提到的圖片目錄,實現nginx處理靜態文件請求的目的。
加好的server塊內容以下:
nginx.conf http/server塊 server { listen 80; client_max_body_size 75M; location / { include uwsgi_params文件路徑; uwsgi_pass 127.0.0.1:3031; index index.html index.htm; } location /media/logoimages/ { alias /media/logoimages/的絕對路徑; } location /static/ { alias static/的絕對路徑; } }
listen 80:在nginx服務器啓動後,nginx要監聽的端口號
location塊:location塊用於與請求的URI進行比較,若URI與對應的location相匹配,則進入對應的location塊進行操做。
location /塊:當訪問網站主頁,即127.0.0.1:80時,即會匹配到/塊。這個塊主要執行了三個操做:使用include參數將以前定義好的uwsgi_params文件包含進來;用uwsgi_pass參數配置接收uwsgi發送請求的端口號,從而實現接收uwsgi轉發的請求;用index參數指定了主頁的html文件。
location /media/logoimages/塊:用alias命令將media/logoimages/指向一個絕對路徑,這樣當nginx接收到如127.0.0.1/media/logoimages/xxx.jpg文件的請求時,它就會到alias指定的目錄中去取得圖片並顯示出來,不然就會產生一個404錯誤,圖片沒法顯示。
location /static塊:與/media/logoimages/塊相似。
在修改好相關文件後,咱們就能夠依次啓動uwsgi和nginx了!
首先回到剛纔編寫uwsgi.ini的路徑下,輸入如下命令:
uwsgi uwsgi.ini這樣便啓動了一個uWSGI服務器,因爲咱們剛纔沒有設置後臺執行,它會在控制檯上顯示出一些系統的基本信息,以及咱們剛纔的配置信息等。接下來,讓咱們啓動nginx。若是剛纔爲nginx設置了別名的話,咱們能夠輸入如下命令來啓動nginx:
nginx start
在nginx配置好後,咱們可能會根據須要向nginx裏添加新的location塊。當咱們修改好以後,咱們可使用如下命令讓nginx從新加載修改好的配置文件,而無需重啓nginx:
nginx reload
此外,當咱們之後對Django的程序進行修改時,都需重啓uwsgi服務器,以使得服務器能使用新的Django程序。
好了,咱們終於把博客的雛形部署在了本地的nginx服務器上。在下一篇博文中,將陸續介紹blogs App的實現,這裏能夠提早放個提綱:
1. blogs App Model的創建
2. blogs App功能實現:發佈博客、發佈評論、博客管理、存儲草稿等
3. blogs App 前端部分的實現:ckeditor富文本編輯器的使用、Ajax定時及手動存儲草稿
4. 陸續添加的其餘功能