1. 程式人生 > >Linux nginx+uWSGI+django+virtualenv+supervisor發布web服務器

Linux nginx+uWSGI+django+virtualenv+supervisor發布web服務器

負載均衡。 world worker clear 浪費 color etc quest web服務

用Nginx+uwsgi原因

技術分享圖片
首先nginx 是對外的服務接口,外部瀏覽器通過url訪問nginx,

2nginx 接收到瀏覽器發送過來的http請求,將包進行解析,分析url,如果是靜態文件請求就直接訪問用戶給nginx配置的靜態文件目錄,直接返回用戶請求的靜態文件,

如果不是靜態文件,而是一個動態的請求,那麽nginx就將請求轉發給uwsgi,uwsgi 接收到請求之後將包進行處理,處理成wsgi可以接受的格式,並發給wsgi,wsgi 根據請求調用應用程序的某個文件,某個文件的某個函數,最後處理完將返回值再次交給wsgi,wsgi將返回值進行打包,打包成uwsgi能夠接收的格式,uwsgi接收wsgi 發送的請求,並轉發給nginx,nginx最終將返回值返回給瀏覽器。

3要知道第一級的nginx並不是必須的,uwsgi完全可以完成整個的和瀏覽器交互的流程,但是要考慮到某些情況
安全問題,程序不能直接被瀏覽器訪問到,而是通過nginx,nginx只開放某個接口,uwsgi本身是內網接口,這樣運維人員在nginx上加上安全性的限制,可以達到保護程序的作用。

2負載均衡問題,一個uwsgi很可能不夠用,即使開了多個work也是不行,畢竟一臺機器的cpu和內存都是有限的,有了nginx做代理,一個nginx可以代理多臺uwsgi完成uwsgi的負載均衡。

3靜態文件問題,用django或是uwsgi這種東西來負責靜態文件的處理是很浪費的行為,而且他們本身對文件的處理也不如nginx好,所以整個靜態文件的處理都直接由nginx完成,靜態文件的訪問完全不去經過uwsgi以及其後面的東西。

為什麽要用nginx,uwsgi
View Code

基礎開發環境配置

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

python3 + virtualenv安裝

安裝django1.11

pip3 install django==1.11
#創建django項目mysite
django-admin startproject mysite
#創建app01
python3 manage.py startapp app01

mysite/settings.py

#settings.py設置
ALLOWED_HOSTS = [*]
install app01

mysite/urls.py

from app01 import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^hello_django/, views.hello),
]

app01/views.py

from django.shortcuts import render,HttpResponse

# Create your views here.
def hello(request):
    print(
request is :,request) return HttpResponse(django is ok )

安裝uWSGI

進入虛擬環境venv,安裝uwsgi
(venv) [root@slave 192.168.11.64 /opt]$pip3 install uwsgi
檢查uwsgi版本
(venv) [root@slave 192.168.11.64 /opt]$uwsgi --version
2.0.17.1
#檢查uwsgi python版本
uwsgi --python-version

運行簡單的uWSGI

#啟動一個python
uwsgi --http :8000 --wsgi-file test.py
http :8000: 使用http協議,端口8000
wsgi-file test.py: 加載指定的文件,test.py
#test.py
def application(env, start_response):
    start_response(200 OK, [(Content-Type,text/html)])
    return [b"Hello World"] # python3

uWsgi熱加載python程序

在啟動命令後面加上參數
uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1 
#發布命令
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
#此時修改django代碼,uWSGI會自動加載django程序,頁面生效

運行django程序

#mysite/wsgi.py  確保找到這個文件
uwsgi --http :8000 --module mysite.wsgi
module mysite.wsgi: 加載指定的wsgi模塊

uwsgi配置文件

uwsgi支持ini、xml等多種配置方式,本文以 ini 為例, 在/etc/目錄下新建uwsgi_nginx.ini,添加如下配置:

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /opt/mysite
# Djangos wsgi file
module          = mysite.wsgi
# the virtualenv (full path)
home            = /opt/venv
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# the socket (use the full path to be safe
socket          = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

uwsgi.ini

Linux nginx+uWSGI+django+virtualenv+supervisor發布web服務器