DJANGO-每天生鮮項目從0到1-015-部署-uWSGI+Nginx

本項目基於B站UP主‘神奇的老黃’的教學視頻‘每天生鮮Django項目’,視頻講的很是好,推薦新手觀看學習css

https://www.bilibili.com/video/BV1vt41147K8?p=1html

 使用uWSGI作爲web服務器

  • django自帶的web服務器是經過python manager.py runserver實現,可是在正式部署時,不會使用這種方式運行項目,而是使用uWSGI
  • WSGI,全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是爲 Python 語言定義的 Web 服務器和 Web 應用程序或框架之間的一種簡單而通用的接口。
  • 不少框架都自帶了 WSGI server ,好比 Flask,webpy,Django、CherryPy等等。固然性能都很差,自帶的 web server 更多的是測試用途,發佈時則使用生產環境的 WSGI server或者是聯合 nginx 作 uwsgi 
  • uwsgi和WSGI同樣是一種通訊協議。
  • uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器。

uWSGI安裝

pip install uwsgi

django配置uWSGI

在項目根目錄新建一個uwsgi.ini文件,內容以下:python

[uwsgi]
#使用nginx鏈接時使用
#socket=localhost:8080
#直接作web服務器使用 python manager.py runserver ip:port
http=192.168.183.129:8080
#項目目錄
chdir=/home/gong/study/projects/dailyfresh
#項目中wsgi.py文件的目錄,相對於項目目錄
wsgi-file=dailyfresh/wsgi.py
#指定啓動的工做進程數
processes=4
#指定進程中的線程數
threads=2
master=True
#保存啓動以後主進程的pid
pidfile=uwsgi.pid
#設置uwsgi後臺運行(守護進程)
daemonize=uwsgi.log
#設置虛擬環境信息
virtualenv=/home/gong/.conda/envs/dailyfresh

啓動uWSGI

啓動:uwsgi –-ini 配置文件路徑 例如:nginx

uwsgi –-ini uwsgi.ini

中止:uwsgi --stop uwsgi.pid路徑 例如:web

uwsgi –-stop uwsgi.pid

 啓動後發現css樣式都沒有生效,可是一些圖片倒是有效的,由於css等靜態文件是以/static開頭的,django自帶的web服務器運行時可以讀取到這個項目路徑下的static文件,而uWSGI並不能直接讀取到,而能顯示出來的圖片是經過Nginx讀取的FastDFS中的文件,所以能夠正常顯示。這裏咱們就須要再使用Nginx來讀取/static的靜態文件,注意這裏說的靜態文件不是指以前的首頁靜態頁面,是項目路徑下的static文件,還包括一些django自帶的靜態文件。django

使用Nginx

由於用戶瀏覽器直接訪問uWSGI的話不能正常顯示項目目錄中的靜態文件,所以須要在uWSGI前再添加一臺Nginx,讓用戶訪問這臺Nginx,這臺Nginx處理兩件事,一是將正常的訪問請求轉交給uWSGI,二是處理請求中靜態文件瀏覽器

Nginx轉交請求給uWSGI

1. 配置uwsgi

將uwsgi.ini中的http改爲使用socket,因爲Nginx和uWSGI在同一臺機器上面,所以這裏ip能夠直接寫成localhost(迴環IP),若Nginx和uWSGI不在同一臺機器上,那麼這裏的IP寫成uWSGI本機的IP,端口號能夠任意給成未使用的端口號服務器

#使用nginx鏈接時使用
socket=localhost:8080
#直接作web服務器使用 python manager.py runserver ip:port
#http=192.168.183.129:8080

2. 配置Nginx

若用戶在瀏覽器只輸入IP或者域名時,不繼續輸入端口,那麼默認訪問的就是80端口,所以咱們須要在80端口配置,如下配置都在80端口下配置負載均衡

# 瀏覽器輸入網址默認端口
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        location / {
            # 包含uwsgi的請求參數
            include uwsgi_params;
            # 轉交請求給uwsgi,必須和uwsgi的ini配置文件中IP和PORT一致
            # uwsgi_pass localhost:8080;
            uwsgi_pass dailyfresh;
            }
    ....
    }

Nginx處理靜態文件

1. django收集靜態文件

這裏的靜態文件除了/static目錄下自定義的靜態文件外,還有django自身的一些靜態文件框架

編輯setting.py文件,新增參數STATIC_ROOT,這個參數說明收集靜態文件後存放的路徑,如:

# 收集的靜態文件路徑
STATIC_ROOT = '/home/gong/study/projects/www/dailyfresh/static'

運行命令,把項目中所使用的靜態文件收集到STATIC_ROOT指定的目錄下。

python manager.py collectstatic

 2. 配置Nginx提供靜態文件

即瀏覽器訪問到/static時,會在下面的路徑去找url中訪問的資源

        # 指定靜態文件訪問的目錄
        location /static {
            alias /home/gong/study/projects/www/dailyfresh/static/;
        }

這臺Nginx除了作以上兩件事外,還能將請求轉交給其餘地址,實現訪問以前的靜態首頁,還能實現負載均衡

Nginx轉交請求給其餘地址

經過配置實現若是用戶直接訪問IP地址,則給用戶返回以前生成的靜態首頁,若是用戶訪問的是ip/index,則返回動態的首頁

配置靜態首頁

# 靜態首頁服務器
server {
listen       9999;
server_name  localhost;

        location /static {
                alias /home/gong/study/projects/dailyfresh/static;
        }

        location / {
                root /home/gong/study/projects/dailyfresh/static;
                index index.html index.htm;
        }
}

等號嚴格匹配,若直接訪問網址時,則經過proxy_pass訪問Nginx配置的靜態首頁

        # 等號嚴格匹配,直接訪問網址時,則訪問靜態首頁
        location = / {
                # 傳遞請求給靜態首頁的nginx
                proxy_pass http://localhost:9999;
        }

Nginx負載均衡

使用uWSGI服務器時,能夠實現同一個項目,運行多個服務器,即實現多開,可是它們處理的時候仍是同一時間只會處理一個。

1. 配置uwsgi2.ini

在項目根目錄再新建一個名爲uwsgi2.ini的文件,內容除了端口號不同外,其餘和uwsgi.ini文件同樣

[uwsgi]
#使用nginx鏈接時使用
socket=localhost:8081
#直接作web服務器使用 python manager.py runserver ip:port
#http=192.168.183.129:8081
#項目目錄
chdir=/home/gong/study/projects/dailyfresh
#項目中wsgi.py文件的目錄,相對於項目目錄
wsgi-file=dailyfresh/wsgi.py
#指定啓動的工做進程數
processes=4
#指定進程中的線程數
threads=2
master=True
#保存啓動以後主進程的pid
pidfile=uwsgi2.pid
#設置uwsgi後臺運行(守護進程)
daemonize=uwsgi2.log
#設置虛擬環境信息
virtualenv=/home/gong/.conda/envs/dailyfresh

而後運行啓動命令

uwsgi --ini uwsgi2.ini

這樣就能同時開啓兩臺uWSGI服務器

2. ngnix 配置負載均衡

編輯/conf/nginx.conf文件,在server配置的前面(http塊下,和server同級)增長upstream配置項。其中的server即對應uwsgi.ini和uwsgi2.ini中的socket值

upstream dailyfresh {
         server localhost:8080;
         server localhost:8081;
}

而後在80端口下配置的uwsgi_pass改爲 uwsgi_pass dailyfresh;

        location / {
            # 包含uwsgi的請求參數
            include uwsgi_params;
            # 轉交請求給uwsgi,必須和uwsgi的ini配置文件中IP和PORT一致
            # uwsgi_pass localhost:8080;
            uwsgi_pass dailyfresh;
        }

這樣用戶在瀏覽器訪問網站時,Nginx會將訪問的請求平均分配給這兩臺uWSGI執行,即便是同一個用戶的不一樣訪問請求,也能分配給兩臺服務器

最終項目部署圖

相關文章
相關標籤/搜索