前言:
本文主要記錄筆者第一次嘗試在 MacOS 上對Django+Gunicorn+Nginx進(jìn)行部署的遇到的一些問題與感受
鏈接:
Django: https://docs.djangoproject.com/en/2.0/
Nginx:http://nginx.org/en/docs/
Gunicorn:http://gunicorn.readthedocs.io/en/latest/
摘要:
1、Django項目配置說明
前提是已經(jīng)擁有一個完整的 Django 工程項目,工程結(jié)構(gòu)如下:
然后就是對 Django 工程的
settings.py
文件一些內(nèi)容修改:
(1)DEBUG
修改為 False
在Django項目中,DEBUG是為了方便開發(fā)者進(jìn)行調(diào)試工程模式,當(dāng)值為 True 時,運行系統(tǒng)會默認(rèn)加載靜態(tài)資源文件,所以關(guān)閉 調(diào)試模式之后,才可以使用 nginx 服務(wù)器代理加載靜態(tài)文件
(2)ALLOW_HOSTS
中加入域名或者服務(wù)器 ip
例如 ALLOWED_HOSTS = ['127.0.0.1','example.com']
(3)設(shè)置STAIC_ROOT
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static') 或者指定的文件路徑
(4)執(zhí)行python3 manager.py collectstatic
作用是將工程中的所有靜態(tài)文件(image、js、css)都都收集到 STATIC_ROOT 指定的文件中,便于后續(xù) nginx 是配置
2、Gunicorn配置說明
Gunicorn詳細(xì)配置說明博客: https://www.cnblogs.com/nanrou/p/7026789.html
gunicorn
是一個python Wsgi http server
,只支持在Unix
系統(tǒng)上運行,來源于Ruby
的unicorn
項目。Gunicorn
使用prefork master-worker
模型(在gunicorn
中,master
被稱為arbiter
),能夠與各種wsgi web
框架協(xié)作
(1)執(zhí)行pip install gunicorn
安裝
(2)在Django
工程settings.py
文件的INSTALLED_APPS
配置中加入gunicorn
的app
(3)進(jìn)入工程文件,執(zhí)行gunicorn 工程名.wsgi
來快速啟動gunicorn 服務(wù)器
(4)另外也可以通過創(chuàng)建配置gunicorn.conf.py
來實現(xiàn),配置內(nèi)容如下:
import multiprocessing
bind = "127.0.0.1:8000" #綁定的ip與端口
workers = multiprocessing.cpu_count() * 2 + 1 #進(jìn)程數(shù)
errorlog = '/Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/gunicorn.error.log' #發(fā)生錯誤時log的路徑
# accesslog = '/home/xxx/xxx/gunicorn.access.log' #正常時的log路徑
proc_name = 'gunicorn_TTSXProject' #進(jìn)程名
timeout = 30 #超時
threads = 2 #指定每個進(jìn)程開啟的線程數(shù)
(5)啟動:gunicorn 工程名.wsgi:application -c 文件路徑/gunicorn.conf.py
或者在工程目錄下執(zhí)行gunicorn 工程名.wsgi:application -c gunicorn.conf.py
(6)關(guān)閉gunicorn
:
lsof -i:pid進(jìn)程ID
:查詢到使用中的端口
kill -9 pid進(jìn)程ID
:釋放端口
kill -HUP pid進(jìn)程ID
:重啟任務(wù)
3、Nginx配置說明
(1)安裝
brew update //結(jié)果:Already up-to-date.
brew install nginx
(2)路徑
mac 上的配置路徑為:/usr/local/etc/nginx/nginx.conf
mac 上的安裝路徑為:/usr/local/Cellar/nginx
(3)啟動
nginx
:啟動 nginx 服務(wù)器
nginx -s reload
:重啟 nginx 服務(wù)器
pkill -9 nginx
:徹底關(guān)閉 nginx 服務(wù)器
nginx -s stop
:關(guān)閉服務(wù)器
默認(rèn)啟動8080
端口,所以nginx
服務(wù)器啟動之后在瀏覽器上訪問127.0.0.1:8080
進(jìn)入nginx歡迎界面
(4)配置django 工程
與nginx
關(guān)聯(lián)文件
可以直接在django
項目中創(chuàng)建一個nginx.conf
文件,添加如下內(nèi)容:
server {
# nginx 監(jiān)聽的端口
listen 80;
#服務(wù)器 ip 域名
server_name 127.0.0.1 example.com;
#指定配置 log 文件路徑
access_log /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/nginx.access.log;
error_log /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/nginx.error.log;
location / {
# nginx 代理指向地址,即訪問 8000 端口時,直接交給 gunicorn 處理
# django 中的靜態(tài)文件也屬于 8000 端口訪問
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 訪問一些其他靜態(tài)文件,直接交給 nginx 處理,
# 可以指向 django 項目中配置的 STATIC_ROOT 路徑
# alias :直接查詢指定路徑
# root :會在指定路徑后面添加上 static/
location /static/ {
alias /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/collect_static/;
}
location /media/ {
alias /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/collect_static/upload/;
# 緩存時間
expires 30d;
}
}
(5)關(guān)聯(lián)配置文件
sudo ln -s 項目路徑/nginx.conf /usr/local/etc/nginx/servers/定義名字.conf
此時在/usr/local/etc/nginx/servers/
目錄下會發(fā)現(xiàn)關(guān)聯(lián)的 項目配置文件,同時可以再次啟動nginx
服務(wù)器
4、訪問項目
將nginx
、gunicorn
服務(wù)器都啟動成功之后,可以在瀏覽器中訪問定義的API,例如nginx
的server
中配置的反向代理是127.0.0.1
,監(jiān)聽端口是80
,則直接訪問127.0.0.1
即可
----------------------------------------------------------------------------------------------------
分割線------分割線------分割線------分割線
----------------------------------------------------------------------------------------------------
5、配置過程中遇到的問題
(1)PermissionError(13, 'Permission denied')
當(dāng)輸入終端命令時,提示這個錯誤,證明是命令權(quán)限錯誤,
解決方法:需要在執(zhí)行的命令前加上sudo
(2)通過 nginx 訪問出現(xiàn) 403 Forbidden errors
當(dāng)通過nginx訪問一些靜態(tài)文件資源時報錯 403,原因可能有兩個
a、配置權(quán)限不夠
解決方案:在 nginx.conf
中修改 nginx
啟動用戶,即user 用戶名 wheel
b、目錄索引設(shè)置錯誤
解決方案:查找檢測文件索引配置并更正索引
注意:
當(dāng)通過 nginx 訪問時,一直無法加載靜態(tài)文件,并返回403,證明是第一種情況
(3)ajax訪問請求出現(xiàn)[No 'Access-Control-Allow-Origin' header is present on the requested resource.'](http://blog.csdn.net/zhoucheng05_13/article/details/53580683)
這是當(dāng)前使用 Ajax
訪問出現(xiàn)了跨域請求錯誤,需要在服務(wù)的進(jìn)行添加響應(yīng)頭配置
解決方案:
# 在`view.py`中的響應(yīng)方法中添加
response = HttpResponse(json.dumps(context), content_type="application/json")
# 解決 ajax 跨域請求問題
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"
(4)當(dāng)Django
項目設(shè)置為DEBUG=False
時,訪問報錯:Bad Request (400)
此時可能是因為ALLOWED_HOSTS
的設(shè)置出現(xiàn)問題,導(dǎo)致訪問出錯
解決方案:將ALLOWED_HOSTS
進(jìn)行如下設(shè)置:
ALLOWED_HOSTS = ['*']