Centos上Python應(yīng)用部署詳情(Nginx 和 Gunicorn 部署 Django項(xiàng)目)

步驟一:在Centos上安裝Python3.6

可見文章:Linux-Centos7安裝python3并與python2共存

步驟二:用Python3.6自帶的venv械念,創(chuàng)建虛擬環(huán)境

創(chuàng)建一個(gè)虛擬環(huán)境的目錄衡创,然后進(jìn)入到該目錄(py3)

localhost:py3 zhaofan$ pwd
/Users/zhaofan/py3

創(chuàng)建虛擬環(huán)境

python3 -m vent .

激活虛擬環(huán)境

source bin/activate

如下圖:

這樣虛擬環(huán)境就創(chuàng)建完成

退出虛擬環(huán)境
(py3)$deactivate

  • 問題:如何復(fù)制虛擬環(huán)境A下的依賴到虛擬環(huán)境B?

    解決:先在A環(huán)境中把所有依賴都保存到XX.txt中,使用pip freeze:

    pip3 freeze > re.txt

    這時(shí)會(huì)在當(dāng)前目錄下生成re.txt文件峡蟋,打開后可以看到該環(huán)境下pip3所有第三方依賴包坟桅,可以按情況刪除不需要的包。
    然后把re.txt文件復(fù)制到環(huán)境B下蕊蝗,運(yùn)行pip3 install -r re.txt仅乓,就會(huì)自動(dòng)安裝好第三方依賴了。
    注意:有的擴(kuò)展庫通過pip install的方式安裝可能會(huì)出現(xiàn)問題(比如 lxml)蓬戚,那么通過上面那條命令安裝也會(huì)失敗夸楣,這種擴(kuò)展庫我們只有去這里下載編譯好的.whl文件進(jìn)行單獨(dú)安裝。先在虛擬環(huán)境中安裝wheel(pip install wheel)子漩,然后就可以直接用pip命令安裝.whl文件了豫喧。

步驟三:部署項(xiàng)目代碼

Django 項(xiàng)目中會(huì)有一些 CSS、JavaScript 等靜態(tài)文件幢泼,為了能夠方便地讓 Nginx 處理這些靜態(tài)文件的請(qǐng)求紧显,我們把項(xiàng)目中的全部靜態(tài)文件收集到一個(gè)統(tǒng)一的目錄下,這個(gè)目錄通常位于 Django 項(xiàng)目的根目錄旭绒,并且命名為 static鸟妙。為了完成這些任務(wù)焦人,需要在項(xiàng)目的配置文件里做一些必要的配置:

blogproject/settings.py

# 其他配置...

STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_ROOT 指明了靜態(tài)文件的收集目錄,即項(xiàng)目根目錄(BASE_DIR)下的 static 文件夾重父。
為了安全起見花椭,在生產(chǎn)環(huán)境下需要關(guān)閉 DEBUG 選項(xiàng)。打開 settings.py 文件房午,找到 DEBUG選項(xiàng)矿辽,將它們?cè)O(shè)置成如下的值:

blogproject/settings.py

DEBUG = False

如果將本地編寫的代碼放到GitHub上,那在虛擬環(huán)境下直接下載GitHub的代碼即可

git clone XXXgit倉(cāng)庫目錄

當(dāng)然也可以是SVN等郭厌,具體就不贅述了袋倔。

然后安裝項(xiàng)目依賴,直接pip3 install -r re.txt就可以了(具體見步驟二)

收集靜態(tài)文件
虛擬環(huán)境下繼續(xù)運(yùn)行 python manage.py collectstatic 命令收集靜態(tài)文件到 static 目錄

python3 manage.py collectstatic

生成數(shù)據(jù)庫

python3 manage.py migrate

步驟四:配置Nginx

安裝Nginx請(qǐng)看Linux(CentOS 6.5) 下Nginx 安裝折柠,重啟和停止
Nginx的配置文件配置(建議的方法):
在自己項(xiàng)目目錄下加個(gè)新建個(gè)nginx的配置文件nginx_blog.conf宾娜,將其建立軟連接,連接到自己系統(tǒng)的nginx安裝目錄下的conf/conf.d目錄下(conf.d目錄為我自己添加)

ln -s /opt/mysites/boke/blogproject/nginx_blog.conf
/usr/local/nginx/conf/conf.d

/opt/mysites/boke/blogproject/nginx_blog.conf

server {

        listen       9000;

        server_name  localhost;

        access_log /opt/mysites/boke/blogproject/access.log;#訪問日志

        error_log /opt/mysites/boke/blogproject/error.log;#錯(cuò)誤日志

        location / {

            proxy_pass [http://127.0.0.1:9090](http://127.0.0.1:9090); #動(dòng)態(tài)請(qǐng)求交給gunicorn扇售,9090端口就是gunicorn用的端口

            #proxy_set_header Host $host; 

            #proxy_set_header X-Real-IP $remote_addr;

            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            #proxy_set_header X-Forwarded-Proto $scheme;

        }

        # location 顧名思義前塔,定位,就是當(dāng)訪問 / 的時(shí)候承冰,nginx會(huì)將請(qǐng)求轉(zhuǎn)給本地的8080端口华弓,而后面的設(shè)置都是一些基本的配置,可以直接用

        location /static {

            alias /opt/mysites/boke/blogproject/static;

        }

        # 這個(gè)就是配置靜態(tài)文件的地方困乒,要用絕對(duì)地址寂屏,對(duì)應(yīng)最開始的目錄形式,假設(shè)project就在/home下面娜搂,那么這樣配置就可以的了迁霎,還有個(gè)前提是,你在開發(fā)的時(shí)候涌攻,采取了django的建議欧引,每個(gè)app的靜態(tài)文件都用多了一層app_name的文件夾來包住。

    }

問題1:
proxy_set_header Host $host; #這里我一開始沒有注釋的恳谎,網(wǎng)頁訪問的時(shí)候都是報(bào)bad request 400錯(cuò)誤芝此,后來注釋掉以后可以訪問,具體原因還不知道

nginx主配置文件/usr/local/nginx/conf/nginx.conf里include 配置文件

user  root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    include       conf.d/nginx_blog.conf; #blog站點(diǎn)

    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
}

django項(xiàng)目的站點(diǎn)名(域名或IP或者表示全部)加入到 settings.py的ALLOWED_HOSTS里:

ALLOWED_HOSTS = [‘*’]

如果要外部訪問因痛,則打開8000端口:

/sbin/iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

service iptatbles save

問題2:Django DEBUG=False時(shí)靜態(tài)文件404的問題
設(shè)置urls.py(在urls.py文件里增加下面代碼)

from django.views.static import serve 
from django.conf import settings 

if not settings.DEBUG: 
    urlpatterns += [url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT})]

配置完后婚苹,檢查下
/usr/local/nginx/sbin/nginx -t 檢查配置語法是否正確
/usr/local/nginx/sbin/nginx 啟動(dòng)nginx
/usr/local/nginx/sbin/nginx -s reload 重啟nginx

步驟五:安裝配置Gunicorn

安裝:
直接 pip install gunicorn 就可以了

配置:
用gunicorn代替runserver
在django的settings INSTALLED_APPS里面加上gunicorn

方法1:
在項(xiàng)目的manage.py文件夾中運(yùn)行
gunicorn ×××.wsgi:application -b 127.0.0.1:9090 —reload

方法2:
在項(xiàng)目根目錄下創(chuàng)建一個(gè)配置文件:gunicorn.conf.py ,配置如下:

import multiprocessing

bind = "127.0.0.1:9090"
workers = 2
errorlog = "/opt/mysites/boke/blogproject/gunicorn.error.log"
#loglevel = "debug"
proc_name = "gunicorn_blog_project"

在上述配置的情況下鸵膏,Gunicorn 會(huì)在 /tmp/ 目錄下創(chuàng)建一個(gè)名為 gunicorn1.sock 的 Unix 套接字膊升。 還會(huì)啟動(dòng)一些工作進(jìn)程,進(jìn)程數(shù)量相當(dāng)于 CPU 內(nèi)核數(shù)量的 2 倍谭企。 它還會(huì)自動(dòng)重新加載并作為守護(hù)進(jìn)程運(yùn)行廓译。

在該目錄下運(yùn)行命令:

gunicorn -c gunicorn.conf.py blogproject.wsgi:appliction

稍微復(fù)雜點(diǎn)的命令:

gunicorn -c gunicorn.conf.py -D --error-logfile gunicorn.error.log blogproject.wsgi:appliction

上面的命令應(yīng)該從項(xiàng)目的根目錄運(yùn)行评肆。 -c 選項(xiàng)告訴 Gunicorn 使用你創(chuàng)建的配置文件。 -D 再次指定 gunicorn 為守護(hù)進(jìn)程非区。 最后一部分指定 Gunicorn 的錯(cuò)誤日志文件在你創(chuàng)建 Gunicorn 文件夾中的位置瓜挽。 命令結(jié)束部分就是為 Gunicorn 指定 .wsgi 文件的位置。

最后打開網(wǎng)頁征绸,看下是否能成功訪問久橙。以上我搞了兩天,中間各種不服管怠。

附錄:

gunicorn 不要用 命令中傳參來做配置淆衷,用文件。

配置說明見官方文檔 http://docs.gunicorn.org/en/latest/settings.html#logging

優(yōu)化后的配置文件:

# coding=utf-8
import sys
import os
import multiprocessing

path_of_current_file = os.path.abspath(__file__)
path_of_current_dir = os.path.split(path_of_current_file)[0]

_file_name = os.path.basename(__file__)

sys.path.insert(0, path_of_current_dir)



worker_class = 'sync'
workers = multiprocessing.cpu_count() * 2 + 1

chdir = path_of_current_dir

worker_connections = 1000
timeout = 30
max_requests = 2000
graceful_timeout = 30

loglevel = 'info'

reload = True
debug = False



bind = "%s:%s" % ("0.0.0.0", 8811)
pidfile = '%s/run/%s.pid' % (path_of_current_dir, _file_name)
errorlog = '%s/logs/%s_error.log' % (path_of_current_dir, _file_name)
accesslog = '%s/logs/%s_access.log' % (path_of_current_dir, _file_name)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渤弛,一起剝皮案震驚了整個(gè)濱河市祝拯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌她肯,老刑警劉巖鹿驼,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辕宏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砾莱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門瑞筐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腊瑟,你說我怎么就攤上這事聚假。” “怎么了闰非?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵膘格,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我财松,道長(zhǎng)瘪贱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任辆毡,我火速辦了婚禮菜秦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舶掖。我一直安慰自己球昨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布眨攘。 她就那樣靜靜地躺著主慰,像睡著了一般嚣州。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上共螺,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天该肴,我揣著相機(jī)與錄音,去河邊找鬼璃谨。 笑死沙庐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佳吞。 我是一名探鬼主播拱雏,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼底扳!你這毒婦竟也來了铸抑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤衷模,失蹤者是張志新(化名)和其女友劉穎鹊汛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阱冶,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刁憋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了木蹬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片至耻。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镊叁,靈堂內(nèi)的尸體忽然破棺而出尘颓,到底是詐尸還是另有隱情,我是刑警寧澤晦譬,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布斩郎,位于F島的核電站监嗜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匣沼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一夭问、第九天 我趴在偏房一處隱蔽的房頂上張望甜癞。 院中可真熱鬧吴旋,春花似錦、人聲如沸凶硅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捷绑,卻和暖如春韩脑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粹污。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工段多, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壮吩。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓进苍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鸭叙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子觉啊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345