Mac本地Django+Nginx+Gunicorn 部署總結(jié)

前言:

本文主要記錄筆者第一次嘗試在 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)如下:

工程結(jié)構(gòu).png

然后就是對 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)上運行,來源于Rubyunicorn項目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被稱為arbiter),能夠與各種wsgi web框架協(xié)作
(1)執(zhí)行pip install gunicorn安裝
(2)在Django工程settings.py文件的INSTALLED_APPS配置中加入gunicornapp
(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、訪問項目

nginxgunicorn服務(wù)器都啟動成功之后,可以在瀏覽器中訪問定義的API,例如nginxserver中配置的反向代理是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 = ['*']

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內(nèi)容