ubuntu Django + Uwsgi + Nginx 的生產環境部署

1、概述

使用runserver可使咱們的django項目很便捷的在本地運行起來,但這隻能在局域網內訪問,若是在生產環境部署django,就要多考慮一些問題了。好比靜態文件處理,安全,效率等等,本篇文章總結概括了一下基於uwsgi+Nginx下django項目生產環境的部署html

 

uWSGI是一個 Web服務器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的做用是與uWSGI服務器進行交換。
要注意 WSGI / uwsgi / uWSGI 這三個概念的區分。
  • WSGI是一種通訊協議。
  • uwsgi是一種線路協議而不是通訊協議,在此經常使用於在uWSGI服務器與其餘網絡服務器的數據通訊。
  • 而uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器。
uwsgi協議是一個uWSGI服務器自有的協議,它用於定義傳輸信息的類型(type of information),每個uwsgi packet前4byte爲傳輸信息類型描述,它與WSGI相比是兩樣東西。

 

準備條件

默認ubuntu已經有了python3,可是pip沒有安裝。python

apt-get install -y python3-pip

 

安裝虛擬環境

pip3 install virtualenv

 

建立虛擬環境nginx

sudo mkdir /virtualenvs
cd /virtualenvs
sudo /usr/local/bin/virtualenv -p /usr/bin/python3 --no-site-packages venv

 

安裝django

/virtualenvs/venv/bin/pip3 install django

 

2、運行django項目

建立django項目

root@ubuntu:~# mkdir /www
root@ubuntu:~# cd /www/
root@ubuntu:/www# /virtualenvs/venv/bin/django-admin startproject mysite1
root@ubuntu:/www# cd mysite1/
root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/python manage.py startapp blog
root@ubuntu:/www/mysite1# mkdir static

 

編輯配置文件sql

root@ubuntu:/www/mysite1# vim mysite1/settings.py

容許監聽全部IP,注意:'*'必須用引號包起來django

ALLOWED_HOSTS = ['*']

 

原生啓動方式ubuntu

/virtualenvs/venv/bin/python manage.py runserver 0.0.0.0:8000

 

訪問頁面vim

http://192.168.10.104:8000/安全

 

效果以下:服務器

 

3、基於uwsgi+django的實現

安裝uwsgi

/virtualenvs/venv/bin/pip3 install uwsgi

 

使用命令啓動uwsgi

先關閉上面啓動的Django項目,使用Ctrl+c,就能夠取消。網絡

第一步:進入django項目

cd /www/mysite1/

 

第二步:命令測試啓動

/virtualenvs/venv/bin/uwsgi --http 0.0.0.0:8000 --file mysite1/wsgi.py --static-map=/static=static

 

參數說明:

--http 這個就和runserver同樣指定IP 端口

--file 這個文件就裏有一個反射,若是你在調用他的時候沒有指定Web Server就使用默認的

    注意:mysite1是一個相對路徑。--file它的絕對路徑是/www/mysite1/mysite1/wsgi.py

--static 作一個映射,指定靜態文件。

 

此時,訪問http://192.168.10.104:8000/

若是訪問正常,表示項目啓動成功

 

uwsgi配置文件

使用Ctrl+c,取消uwsgi啓動。

第一步:在django項目同級目錄建立uwsgi目錄,用於存放相關文件

cd /www/mysite1
mkdir uwsgi

 

項目結構以下:

mysite1/
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── mysite1
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── uwsgi
└── static

 

第二步:進入script目錄,建立一個uwsgi.ini文件

cd /www/mysite1/uwsgi
vim uwsgi.ini

 

編輯uwsgi.ini文件內容以下:

[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /www/mysite1
# Django's wsgi file
module          = mysite1.wsgi
# the virtualenv (full path)
home            = /virtualenvs/venv
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# pid file
pidfile         = /www/mysite1/uwsgi/uwsgi.pid
# The address and port of the monitor
http            = :8000
# clear environment on exit
vacuum          = true
#The process runs in the background and types the log to the specified log file
daemonize       = /www/mysite1/uwsgi/uwsgi.log

 

注意幾個很重要的參數

chdir 項目目錄,寫絕對路徑

module Django的 wsgi 文件,表示mysite1/wsgi.py

home 虛擬環境目錄,寫絕對路徑

daemonize 進程在後臺運行,並將日誌打到指定的日誌文件

 

啓動django項目

root@ubuntu:~# cd /www/mysite1/
root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/uwsgi --ini uwsgi/uwsgi.ini 
[uWSGI] getting INI configuration from uwsgi/uwsgi.ini

 

查看文件

root@ubuntu:/www/mysite1# ll uwsgi/
總用量 20
drwxr-xr-x 2 root root 4096 8月  10 11:47 ./
drwxr-xr-x 6 root root 4096 8月  10 11:27 ../
-rw-r--r-- 1 root root  717 8月  10 11:41 uwsgi.ini
-rw-r----- 1 root root 2021 8月  10 11:47 uwsgi.log
-rw-rw-rw- 1 root root    6 8月  10 11:47 uwsgi.pid

 

刷新頁面,查看訪問是否正常。

 

uwsgi 經常使用的啓動命令

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

 

4、Nginx代理uwsgi

安裝nginx

apt-get install -y nginx

 

編輯配置文件

cd /etc/nginx/sites-enabled
vim mysite1.conf

 

內容以下:

server {
    listen 8000;
    server_name localhost;

    # 指定項目路徑uwsgi
    location / {
        include uwsgi_params; # 導入一個Nginx模塊他是用來和uWSGI進行通信的
        uwsgi_connect_timeout 30; # 設置鏈接uWSGI超時時間
        uwsgi_pass unix:/www/mysite1/uwsgi/mysite1.sock; # 指定uwsgi的sock文件全部動態請求就會直接丟給他
    }

    # 指定靜態文件路徑
    location /static/ {
        alias /www/mysite1/static/;
    }

}

 

更改uwsgi配置

改成socket方式

cd /www/mysite1/uwsgi
vim uwsgi.ini

內容以下:

[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /www/mysite1
# Django's wsgi file
module          = mysite1.wsgi
# the virtualenv (full path)
home            = /virtualenvs/venv
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# pid file
pidfile         = /www/mysite1/uwsgi/uwsgi.pid
# socket file path (full path)
socket          = /www/mysite1/uwsgi/mysite1.sock
# clear environment on exit
vacuum          = true
#The process runs in the background and types the log to the specified log file
daemonize       = /www/mysite1/uwsgi/uwsgi.log

 

從新加載uwsgi

/virtualenvs/venv/bin/uwsgi --reload uwsgi.pid

 

加載nginx配置文件

nginx -s reload

 

查看端口,8000已經爲nginx接管了

root@ubuntu:/etc/nginx/sites-enabled# netstat -anpt|grep 8000
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      18895/nginx -g daem
tcp        0      0 192.168.10.102:8000     192.168.10.105:52556    ESTABLISHED 19135/nginx: worker
tcp        0      0 192.168.10.102:8000     192.168.10.105:52557    ESTABLISHED 19135/nginx: worker

 

刷新頁面,效果同上!

 

進入目錄 /www/mysite1/static ,放一張圖片 girl.jpg

訪問圖片

http://192.168.10.102:8000/static/girl.jpg

 

效果以下:

 

 

本文參考連接:

http://www.py3study.com/Article/details/id/323.html

https://www.jianshu.com/p/07458e99198a

相關文章
相關標籤/搜索