文章目錄
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
未完待續…