步驟一:在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)