Django+Nginx+uwsgi搭建本身的博客(五)

在上一篇博文中,向你們介紹了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

 

  1. pip3 install uwsgi  
pip3 install uwsgi
  1. sudo apt-get install nginx  
sudo apt-get install nginx

在安裝好這兩個後,咱們就能夠對它們進行配置了。首先來看uwsgi的配置。node

uwsgi的配置分爲兩部分:uwsgi的參數配置和uwsgi的啓動配置。uwsgi的參數配置定義了uwsgi在運行中所須要的一些參數,而uwsgi的啓動配置定義了uwsgi啓動時要創建的進程數、線程數等等。首先來看uwsgi的參數配置,咱們能夠在myblog目錄中創建名爲uwsgi_params的文件,輸入如下內容:python

 

  1. uwsgi_params  
  2.   
  3. uwsgi_param  QUERY_STRING       $query_string;  
  4. uwsgi_param  REQUEST_METHOD     $request_method;  
  5. uwsgi_param  CONTENT_TYPE       $content_type;  
  6. uwsgi_param  CONTENT_LENGTH     $content_length;  
  7.   
  8. uwsgi_param  REQUEST_URI        $request_uri;  
  9. uwsgi_param  PATH_INFO          $document_uri;  
  10. uwsgi_param  DOCUMENT_ROOT      $document_root;  
  11. uwsgi_param  SERVER_PROTOCOL    $server_protocol;  
  12. uwsgi_param  REQUEST_SCHEME     $scheme;  
  13. uwsgi_param  HTTPS              $https if_not_empty;  
  14.   
  15. uwsgi_param  REMOTE_ADDR        $remote_addr;  
  16. uwsgi_param  REMOTE_PORT        $remote_port;  
  17. uwsgi_param  SERVER_PORT        $server_port;  
  18. uwsgi_param  SERVER_NAME        $server_name;  
  19.   
  20. uwsgi_param UWSGI_SCRIPT myblog.wsgi;  
  21. uwsgi_param UWSGI_CHDIR xxx/djangotest/myblog;  
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_param UWSGI_SCRIPT和uwsgi_param UWSGI_CHDIR。前者決定了uwsgi要調用哪一個uwsgi模塊,然後者決定了網站的路徑。

uwsgi的啓動配置能夠經過三種方式來配置:xml文件、ini文件和json,主流方式多使用ini文件進行配置,所以咱們也採用ini文件進行配置。咱們在myblog/myblog目錄下創建一個名爲uwsgi.ini的文件,輸入如下內容:nginx

 

  1. # uwsgi.ini  
  2. [uwsgi]  
  3. # Django-related settings  
  4. socket = 127.0.0.1:3031  
  5.   
  6. # the base directory (full path)  
  7. chdir = 你本身的網站目錄  
  8.   
  9. # Django s wsgi file  
  10. #wsgi-file = wsgi.py  
  11. module = myblog.wsgi:application  
  12.   
  13. # process-related settings  
  14. # master  
  15. master = true  
  16. #daemonize = 本身的Log文件路徑,如/log/xxx.log  
  17. # maximum number of worker processes  
  18. processes = 4  
  19. threads = 2  
  20. stats = 127.0.0.1:9191  
  21. buffer-size = 65536  
  22. plugins = python  
# 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

下面解釋一下該ini文件中各個參數的含義:

 

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

 

[python] view plain copy
print ?
  1. # myblog/wsgi.py  
  2. import os  
  3. from os.path import join,dirname,abspath  
  4. import sys  
  5. from django.core.wsgi import get_wsgi_application  
  6. os.environ.setdefault("DJANGO_SETTINGS_MODULE""myblog.settings")  
  7.   
  8. application = get_wsgi_application()  
# 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()

master = True:啓動主進程

 

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爲其添加一個快捷命令:

 

  1. alias nginx = 'sudo /etc/init.d/nginx'  
alias nginx = 'sudo /etc/init.d/nginx'

而後咱們將目錄切到/etc/nginx下,而後輸入如下命令打開gedit,修改nginx.conf:

 

 

  1. sudo gedit nginx.conf  
sudo gedit nginx.conf

該文件大致可分爲http和mail兩大部分,以下所示:

 

 

  1. nginx.conf  
  2. user www-data;  
  3. worker_processes auto;  
  4. pid /run/nginx.pid;  
  5.   
  6. events {  
  7.     worker_connections 768;  
  8.     # multi_accept on;  
  9. }  
  10.   
  11. http {  
  12.   
  13.     ##  
  14.     # Basic Settings  
  15.     ##  
  16.   
  17.     sendfile on;  
  18.     tcp_nopush on;  
  19.     tcp_nodelay on;  
  20.     keepalive_timeout 65;  
  21.     types_hash_max_size 2048;  
  22.     # server_tokens off;  
  23.   
  24.     # server_names_hash_bucket_size 64;  
  25.     # server_name_in_redirect off;  
  26.   
  27.     include /etc/nginx/mime.types;  
  28.     default_type application/octet-stream;  
  29.   
  30.     ##  
  31.     # SSL Settings  
  32.     ##  
  33.   
  34.     #ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE  
  35.     #ssl_prefer_server_ciphers on;  
  36.   
  37.     ##  
  38.     # Logging Settings  
  39.     ##  
  40.   
  41.     access_log 本身的訪問日誌路徑  
  42.     error_log 本身的錯誤日誌路徑  
  43.   
  44.     ##  
  45.     # Gzip Settings  
  46.     ##  
  47.   
  48.     gzip on;  
  49.     gzip_disable "msie6";  
  50.         server {  
  51.             listen 80;  
  52.             client_max_body_size 75M;  
  53.         }  
  54.     # gzip_vary on;  
  55.     # gzip_proxied any;  
  56.     # gzip_comp_level 6;  
  57.     # gzip_buffers 16 8k;  
  58.     # gzip_http_version 1.1;  
  59.     # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;  
  60.   
  61.     ##  
  62.     # Virtual Host Configs  
  63.     ##  
  64.   
  65.     #include /etc/nginx/conf.d/*.conf;  
  66.     #include /etc/nginx/sites-enabled/*.conf;  
  67. }  
  68.   
  69. #mail {  
  70. #    省略此部份內容  
  71. #}  
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塊內容以下:

 

  1. nginx.conf http/server塊  
  2.         server {  
  3.             listen 80;  
  4.             client_max_body_size 75M;  
  5.             location / {  
  6.               include uwsgi_params文件路徑;  
  7.               uwsgi_pass 127.0.0.1:3031;  
  8.               index index.html index.htm;  
  9.             }              
  10.             location /media/logoimages/ {  
  11.                alias /media/logoimages/的絕對路徑;  
  12.             }  
  13.             location /static/ {  
  14.                alias static/的絕對路徑;  
  15.             }  
  16.   
  17.         }  
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的路徑下,輸入如下命令:

 

  1. uwsgi uwsgi.ini  
uwsgi uwsgi.ini
這樣便啓動了一個uWSGI服務器,因爲咱們剛纔沒有設置後臺執行,它會在控制檯上顯示出一些系統的基本信息,以及咱們剛纔的配置信息等。接下來,讓咱們啓動nginx。若是剛纔爲nginx設置了別名的話,咱們能夠輸入如下命令來啓動nginx:

 

  1. nginx start  
nginx start

此時,咱們打開瀏覽器,輸入12.7.0.0.1,應該就能夠看到咱們的index主界面了。

在nginx配置好後,咱們可能會根據須要向nginx裏添加新的location塊。當咱們修改好以後,咱們可使用如下命令讓nginx從新加載修改好的配置文件,而無需重啓nginx:

 

  1. nginx reload  
nginx reload

此外,當咱們之後對Django的程序進行修改時,都需重啓uwsgi服務器,以使得服務器能使用新的Django程序。

好了,咱們終於把博客的雛形部署在了本地的nginx服務器上。在下一篇博文中,將陸續介紹blogs App的實現,這裏能夠提早放個提綱:

1. blogs App Model的創建

2. blogs App功能實現:發佈博客、發佈評論、博客管理、存儲草稿等

3. blogs App 前端部分的實現:ckeditor富文本編輯器的使用、Ajax定時及手動存儲草稿

4. 陸續添加的其餘功能

相關文章
相關標籤/搜索