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執行,即便是同一個用戶的不一樣訪問請求,也能分配給兩臺服務器