Nginx+uWSGI爲Django提供高併發

Nginx+uwsgi部署Django

#0 GitHub

None

#1 環境

CentOS6.9 ( 騰訊雲服務器 )
Python 3.6.4
Django==2.0.7

#2 開始

#2.1 新建一個Django項目

項目根目錄(把django項目放在opt目錄下)

/opt/pro

#2.2 項目結構

工程名:pro

app名:app

.
├── app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── pro
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── templates

#2.3 修改settings.py

因爲不涉及到數據庫,所以把數據庫配置刪掉

#DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

允許所有url訪問

ALLOWED_HOSTS = ["*"]

#3 uwsgi

#3.1 安裝uwsgi

pip3 install uwsgi

#3.2 使用uwsgi啓動django項目

安裝django

pip3 install django==2.0.7

進入項目根目錄(/opt/pro)

cd /opt/pro/ 
uwsgi --http 0.0.0.0:8080 --file pro/wsgi.py --static-map=/static=static

解釋上述命令

--http 0.0.0.0:8080 # 指定ip,因爲我用的是雲服務器,所以是0.0.0.0,如果用的是虛擬機,把0.0.0.0改成虛擬機內網ip(猜測,沒有實踐過)
--file pro/wsgi.py # 指定django項目中wsgi.py文件
--static-map=/static=static # 靜態文件

#3.3 使用uwsgi配置文件啓動django項目(重點)

在項目根目錄下新建文件夾 script

cd /opt/pro/ 
mkdir script

在script目錄下新建 uwsgi.ini

cd script
vim uwsgi.ini

填入以下內容

# uwsig使用配置文件啓動                                                                                                    
[uwsgi]                                                                                                                    
# 項目目錄                                                                                                                 
chdir=/opt/pro/                                                                                                            
# 指定項目的application                                                                                                    
module=pro.wsgi:application                                                                                                
# 指定sock的文件路徑                                                                                                       
socket=/opt/pro/script/uwsgi.sock                                                                                          
# 進程個數                                                                                                                 
workers=5                                                                                                                  
pidfile=/opt/pro/script/uwsgi.pid                                                                                          
# 指定IP端口 雲服務器需要改成 0.0.0.0                                                                                      
http=0.0.0.0:8080                                                                                                          
# 指定靜態文件                                                                                                             
static-map=/static=/opt/pro/pro/static                                                                                     
# 啓動uwsgi的用戶名和用戶組                                                                                                
uid=root                                                                                                                   
gid=root                                                                                                                   
# 啓用主進程                                                                                                               
master=true                                                                                                                
# 自動移除unix Socket和pid文件當服務停止的時候                                                                             
vacuum=true                                                                                                                
# 序列化接受的內容,如果可能的話                                                                                           
thunder-lock=true                                                                                                          
# 啓用線程                                                                                                                 
enable-threads=true                                                                                                        
# 設置自中斷時間                                                                                                           
harakiri=30                                                                                                                
# 設置緩衝                                                                                                                 
post-buffering=4096                                                                                                        
# 設置日誌目錄                                                                                                             
daemonize=/opt/pro/script/uwsgi.log 

啓動uwsgi

cd /opt/pro/script/ 
uwsgi --ini uwsgi.ini # 啓動uwsgi

uwsgi相關操作

uwsgi --ini uwsgi.ini # 啓動
uwsgi --stop uwsgi.pid # 關閉

#4 Nginx

#4.1 安裝Nginx

配置yum源

vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
# 下面這行centos根據你自己的操作系統修改比如:OS/rehel
# 6是你Linux系統的版本,可以通過URL查看路徑是否正確
baseurl=http://nginx.org/packages/centos/6/\$basearch/
gpgcheck=0
enabled=1

安裝nginx

yum -y install nginx

測試是否安裝完成,命令啓動nginx

/etc/init.d/nginx start

#4.2 Django + Uwsgi + Nginx

創建配置文件

cd /etc/nginx/conf.d/
vim pro.conf
server {                                                                                                               
        listen 80;                                            
        server_name 192.144.190.22; # 如果服務器已經被域名解析,必須填域名                        
        access_log  /var/log/nginx/access.log  main;                                                           
        charset  utf-8;                                                 
        gzip on;                                              
        gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;                          
        error_page  404           /404.html;                                                                   
        error_page   500 502 503 504  /50x.html;          
        # 指定項目路徑uwsgi                                      
        location / {                                            
            include uwsgi_params;                  
            uwsgi_connect_timeout 30;                               
            uwsgi_pass unix:/opt/pro/script/uwsgi.sock;              
        }                                                        
        # 指定靜態文件路徑                                       
        location /static/ {                                    
            alias  /opt/pro/pro/static/;                                            
            index  index.html index.htm;                               
        }   
    }
         

完美 !!!

Nginx相關命令

/etc/init.d/nginx start # 開始
/etc/init.d/nginx stop # 關閉
/etc/init.d/nginx restart # 重啓

#5 注意

  • 用Nginx+uwsgi部署django,必須Nginx和uwsgi都啓動

#6 番外篇

#1 uWSGI

# 啓動django

# file : Django項目中wsgi.py文件路徑
uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py

# uWSGI參數

參數 說明
http 地址和端口號,例如:uwsgi --http 0.0.0.0:8000
socket 地址和端口號,例如:uwsgi --socket :8001
listen 設置socket的監聽隊列大小(默認:100)
processes 開啓的進程數量
workers 開啓的進程數量,等同於processes
threads 運行線程(processes的線程數)
master 允許主進程存在,啓動主進程,來管理其他進程,其它的uwsgi進程都是這個master進程的子進程,如果kill這個master進程,相當於重啓所有的uwsgi進程。
daemonize 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器(daemonize uWSGI)。實際上最常用的,還是把運行記錄輸出到一個本地文件上。
log-maxsize 以固定的文件大小(單位KB),切割日誌文件
pidfile 指定pid文件的位置,記錄主進程的pid號。
chdir 指定運行目錄
wsgi-file 載入wsgi-file
stats 在指定的地址上,開啓狀態服務
vacuum 當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件
disable-logging 不記錄請求信息的日誌。只記錄錯誤以及uWSGI內部消息到日誌中。如果不開啓這項,那麼你的日誌中會大量出現這種記錄
  • http 和 socket 的區別

http : nginx 和 uwsgi 中間走的是 http 協議,文本

socket : nginx 和 uwsgi 中間走的是 wsgi 協議,二進制

生產環境百分之九十九是 unix Socket 的方式,ngnix 是做反向代理用的,因爲 uwsgi 不具備路由、過濾等方向代理功能,但論執行效率,可以做性能測試,如果是 http 協議的話,性能是沒有 unix Socket 方式好的

# uWSGI 加進程啓動Django

# 添加4個進程,每個進程2個線程

uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2

#2 Nginx

未完待續…



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章