<br />
個(gè)人技術(shù)博客地址:http://songmingyao.com/
<br />
環(huán)境:Ubuntu 16.04
1 準(zhǔn)備工作
Ubuntu 從零開(kāi)始搭建Python開(kāi)發(fā)環(huán)境
http://t.cn/RSuXlWlUbuntu 遠(yuǎn)程登陸服務(wù)器 ssh的安裝和配置
http://t.cn/RSuXT2e
2 安裝并配置虛擬環(huán)境(本機(jī))
2.1 更新軟件源
sudo apt-get update
sudo apt-get upgrade
-
update
是更新軟件列表 -
upgrade
是對(duì)比本地軟件版本和線(xiàn)上最新軟件版本,然后升級(jí)
2.2 安裝虛擬環(huán)境
sudo pip2 install virtualenv
-
virtualenv
是虛擬環(huán)境安裝包陕靠,創(chuàng)建虛擬環(huán)境可以更好地控制包的版本筐钟,包的版本不會(huì)因?yàn)?.1中的升級(jí)操作而升級(jí),保證了項(xiàng)目的穩(wěn)定性 - 不同虛擬環(huán)境之間的運(yùn)行環(huán)境相互獨(dú)立,互不干擾
sudo pip2 install virtualenvwrapper
-
virtualenvwrapper
是virtualenv
的擴(kuò)展管理包涣易,可以將所有的虛擬環(huán)境整合在一個(gè)目錄下 - 使用前需要先進(jìn)行以下配置
- 創(chuàng)建虛擬環(huán)境管理目錄
mkdir ~/.virtualenvs
- 打開(kāi)
.bashrc
sudo vi ~/.bashrc
- 在
.bashrc
的末尾增加以下內(nèi)容
export WORKON_HOME=$HOME/.virtualenvs # 所有虛擬環(huán)境存儲(chǔ)的目錄
source /usr/local/bin/virtualenvwrapper.sh
- 啟用配置文件
source ~/.bashrc
2.3 創(chuàng)建虛擬環(huán)境
mkvirtualenv django_blog
- 創(chuàng)建虛擬環(huán)境需要聯(lián)網(wǎng)
-
創(chuàng)建完虛擬環(huán)境之后會(huì)自動(dòng)進(jìn)入虛擬環(huán)境良哲,可以通過(guò)命令行前綴(下圖紅框)判斷是否在虛擬環(huán)境內(nèi)
- 虛擬環(huán)境常用命令
# 創(chuàng)建虛擬環(huán)境
mkvirtualenv <name>
# 列出所有虛擬環(huán)境
workon TAB*2
# 進(jìn)入虛擬環(huán)境
workon <name>
# 退出虛擬環(huán)境
deactivate
# 刪除虛擬環(huán)境
rmvirtualenv <name>
2.4 安裝django包
pip install django==1.8.2
- 包后面加
==
用來(lái)選擇包的版本
3 創(chuàng)建一個(gè)django演示項(xiàng)目(本機(jī))
3.1 創(chuàng)建項(xiàng)目
django-admin startproject project_test
- 項(xiàng)目建立在home目錄或其子目錄,以免權(quán)限問(wèn)題帶來(lái)的不便
3.2 創(chuàng)建應(yīng)用
- 進(jìn)入項(xiàng)目目錄并查看項(xiàng)目結(jié)構(gòu)
cd project_test/
tree
-
項(xiàng)目目前結(jié)構(gòu)如下
- 創(chuàng)建應(yīng)用
python manage.py startapp app_test
-
創(chuàng)建應(yīng)用后項(xiàng)目結(jié)構(gòu)如下
3.3 修改項(xiàng)目配置
3.3.1 修改環(huán)境變量
- 打開(kāi)IDE(此處使用的是Pycharm)
- 選擇
File/Settings
矗钟,進(jìn)入Project Interpreter
唆香,選擇虛擬環(huán)境內(nèi)的python版本
- 如果選項(xiàng)內(nèi)沒(méi)有,就點(diǎn)擊右側(cè)的齒輪吨艇,選擇Add Local,
選擇所在虛擬環(huán)境下的python版本躬它,如/home/python/.virtualenvs/django_blog/bin/python2.7
3.3.2 創(chuàng)建模板文件夾、靜態(tài)文件文件夾和應(yīng)用urls
- 在項(xiàng)目根目錄分別創(chuàng)建
static
和templates
文件夾 - 在
static
文件夾下創(chuàng)建js
东涡、css
冯吓、img
三個(gè)文件夾倘待,以后用來(lái)存放靜態(tài)文件 - 在
templates
文件夾下創(chuàng)建app_test
(應(yīng)用名)文件夾,以后用來(lái)存放模板文件 - 在應(yīng)用文件夾下創(chuàng)建
urls.py
文件组贺,以后用來(lái)存放應(yīng)用的urls映射表 -
創(chuàng)建完成之后的目錄結(jié)構(gòu)如下:
3.3.3 修改settings
- 打開(kāi)
/project_test
下的settings.py - 添加應(yīng)用__在
INSTALLED_APPS
中將我們剛創(chuàng)建的應(yīng)用加到最后面
- 修改模板路徑__在
TEMPLATES
里的DIRS
修改為'DIRS': [BASE_DIR, 'templates'],
- 修改靜態(tài)文件路徑__在最后添加
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
3.4 創(chuàng)建頁(yè)面
3.4.1 修改項(xiàng)目urls
- 打開(kāi)
/project_test
下的urls.py
凸舵,在urlpatterns內(nèi)添加一行,意思是只要不是匹配到admin失尖,都轉(zhuǎn)到app_test
應(yīng)用
url(r'^', include('app_test.urls')),
- 打開(kāi)
/app_test
下的urls.py
啊奄,添加以下內(nèi)容:
#coding=utf-8
from django.conf.urls import url
from . import views # 從當(dāng)前文件夾內(nèi)引入views
urlpatterns = [
url(r'^$', views.index), # 匹配到根目錄,就執(zhí)行views文件內(nèi)的index函數(shù)
]
- 打開(kāi)
/project_test
下的views.py
,添加剛才urls.py
內(nèi)提到的index函數(shù)
#coding=utf-8
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'app_test/index.html')
# 對(duì)請(qǐng)求值不做任何處理,直接跳轉(zhuǎn)到模板目錄下app_test文件夾下的index.html頁(yè)面
- 將一張圖片放在
/static/img
文件夾內(nèi) - 在
templates/app_test
文件夾下雹仿,創(chuàng)建模板文件index.html
增热,內(nèi)容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<h1>下面有一張圖片</h1>
 // 尋找static(settings里面的STATIC_URL)文件夾下img文件夾里的test.jpg圖片
</body>
</html>
3.5 打開(kāi)頁(yè)面
- 在項(xiàng)目根目錄文件夾下,在終端內(nèi)(確保已進(jìn)入虛擬環(huán)境)
python manage.py runserver
-
終端顯示如下(紅色字體暫不用管胧辽,因?yàn)槲覀儾](méi)有創(chuàng)建models):
- 打開(kāi)紅框內(nèi)顯示的IP地址(127.0.0.1:8000)
-
瀏覽器成功顯示創(chuàng)建的頁(yè)面
4 將項(xiàng)目上傳至服務(wù)器(本機(jī) & 服務(wù)器)
4.1 導(dǎo)出虛擬環(huán)境內(nèi)的包(本機(jī))
pip freeze > plist.txt
- 此操作將虛擬環(huán)境內(nèi)所有的包都保存在了list.txt里面
4.2 將項(xiàng)目文件夾整體上傳至服務(wù)器
- 傳輸文件可以用samba峻仇,ftp,scp等等邑商,此處使用的是scp
scp -r <YOUR_LOCAL_PROJECT_DIR> <SERVER_USERNAME>@<SERVER_IP>:<YOUR_SERVER_PROJECT_DIR>
4.3 在服務(wù)器上安裝虛擬環(huán)境(服務(wù)器)
- 在服務(wù)器上重復(fù)2.1~2.3的步驟摄咆,安裝虛擬環(huán)境
- 進(jìn)入虛擬環(huán)境,進(jìn)入項(xiàng)目目錄人断,根據(jù)本地計(jì)算機(jī)提供的包列表安裝所需要的包
pip install -r plist.txt
5 安裝uWSGI(服務(wù)器)
- 安裝Python開(kāi)發(fā)版本(因?yàn)榘惭buWSGI過(guò)程中需要編譯)
sudo apt-get install python-dev
- 安裝gcc(因?yàn)榘惭buWSGI過(guò)程中需要C編譯器)
sudo apt-get install gcc
- 安裝uWSGI
pip install uwsgi
- 使用
uwsgi --version
命令查看版本號(hào)吭从,確認(rèn)已正確安裝
6 配置Django(服務(wù)器)
- 配置項(xiàng)目settings,修改以下一項(xiàng)
ALLOWED_HOSTS = ['*', ]
- 在項(xiàng)目根目錄文件夾下恶迈,在終端內(nèi)(確保已進(jìn)入虛擬環(huán)境)
python manage.py runserver 0:8000
- 在本地計(jì)算機(jī)瀏覽器中輸入以下地址以測(cè)試Django在服務(wù)器上是否正常運(yùn)行
<YOUR SERVER IP>:8000
2017.06.08更新
- 如果不能正常顯示頁(yè)面涩金,一般為以下兩個(gè)原因:
1.請(qǐng)檢查防火墻狀態(tài),保證8000端口是能夠被訪問(wèn)的暇仲,代碼如下( 更多防火墻設(shè)置可以參考我這篇文章http://t.cn/RSuX8Qj )
# 檢查防火墻狀態(tài)
sudo ufw status
# 可以臨時(shí)關(guān)閉防火墻
sudo ufw disable
# 或者保持防火墻開(kāi)啟步做,允許8000端口連接
sudo ufw allow 8000
2.請(qǐng)檢查服務(wù)器安全組規(guī)則,如阿里云服務(wù)器奈附,可以在進(jìn)入管理控制臺(tái)后全度,按以下步驟設(shè)置( 如要了解更多服務(wù)器安全組規(guī)則設(shè)置,請(qǐng)參見(jiàn)阿里云官方文檔http://t.cn/RST7Sgz )
3.重啟服務(wù)斥滤,再次在本地計(jì)算機(jī)瀏覽器中查看
- 確定服務(wù)器正常后将鸵,打開(kāi)settings,修改以下一項(xiàng)
DEBUG = False
7 配置uWSGI(服務(wù)器)
7.1 打通uWSGI和Python
- 在項(xiàng)目根目錄創(chuàng)建test.py文件佑颇,內(nèi)容如下
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return ["Hello World"] # python2
# return [b"Hello World"] # python3
- 運(yùn)行uWSGI(表示使用http協(xié)議顶掉,并使用8000端口,加載指定文件test.py)
uwsgi --http :8000 --wsgi-file test.py
- 打開(kāi)瀏覽器挑胸,輸入
127.0.0.1:8000
- 若顯示'Hello World'則表示運(yùn)行正常一喘,說(shuō)明以下三個(gè)環(huán)節(jié)是相通的
web client <-> uWSGI <-> Python
7.2 打通uWSGI和Django
- 在項(xiàng)目根目錄創(chuàng)建文件
my_uwsgi.ini
,并寫(xiě)入以下內(nèi)容
[uwsgi]
# 使用nginx連接時(shí)使用
# socket = 0:8001
# 直接做web服務(wù)器使用
http = 0:8080
# 項(xiàng)目目錄
chdir = /home/python/Desktop/project_test
# 項(xiàng)目中wsgi.py文件的目錄
wsgi-file = /home/python/Desktop/project_test/project_test/wsgi.py
# 主進(jìn)程
master = true
# 多進(jìn)程&多線(xiàn)程
processes = 6
threads = 2
# .sock文件目錄需與Nginx文件內(nèi)的配置相同
# socket = /home/python/Desktop/project_test/my_sock.sock
# chmod-socket = 666
# 以守護(hù)進(jìn)程的方式啟動(dòng)
vacuum = true
# 存儲(chǔ)pid進(jìn)程
pidfile=uwsgi.pid
# 存儲(chǔ)log日志
daemonize=uwsgi.log
- 啟動(dòng)uWSGI服務(wù)
uwsgi --ini my_uwsgi.ini
- 終端顯示以下內(nèi)容即代表開(kāi)啟成功
[uWSGI] getting INI configuration from my_uwsgi.ini
- 打開(kāi)瀏覽器,地址欄輸入以下地址
<YOUR_SERVER_IP>:8080
-
可以看到凸克,文字正常顯示议蟆,圖片無(wú)法顯示,這是正澄剑現(xiàn)象
以上步驟說(shuō)明以下三個(gè)環(huán)節(jié)是相通的
web client <-> uWSGI <-> Django
- 停止uWSGI服務(wù)
uwsgi --stop uwsgi.pid
8 配置Nginx(服務(wù)器)
8.1 安裝Nginx
- 安裝Nginx
sudo apt-get install nginx
- Nginx安裝成功后咐容,系統(tǒng)會(huì)自動(dòng)開(kāi)啟 Nginx 服務(wù),默認(rèn)使用80端口蚂维,打開(kāi)瀏覽器并輸入你服務(wù)器的IP地址戳粒,就可以看到 nginx 的測(cè)試頁(yè)面
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
- 說(shuō)明以下兩個(gè)環(huán)節(jié)是相通的
web client <-> the web server(Nginx)
8.2 配置Nginx
- 將
/etc/nginx/
目錄下的uwsgi_params
復(fù)制到項(xiàng)目文件夾,對(duì)此文件不做任何改動(dòng)
cp /etc/nginx/uwsgi_params .
- 在項(xiàng)目根目錄創(chuàng)建文件
my_nginx.conf
虫啥,并寫(xiě)入以下內(nèi)容
upstream django {
server 127.0.0.1:8001;
# server unix://home/python/Desktop/project_test/my_sock.sock;
}
server {
listen 8000; # 端口號(hào)
server_name 127.0.0.1; # 服務(wù)器 ip 或是域名
charset utf-8; # 字符集
# 最大上傳限制
# client_max_body_size 75M;
location /media {
alias /home/python/Desktop/project_test/media_common; # 媒體文件所在文件夾
}
location /static {
alias /home/python/Desktop/project_test/static_common; # 靜態(tài)文件所在文件夾
}
# 將所有非媒體請(qǐng)求轉(zhuǎn)到Django服務(wù)器上
location / {
uwsgi_pass django; # 最上方已定義
# 將所有參數(shù)都轉(zhuǎn)到uwsgi下
include /home/python/Desktop/project_test/uwsgi_params; # uwsgi_params的路徑
}
}
這個(gè)配置文件表示將靜態(tài)文件和媒體文件由Nginx處理蔚约,而其它的請(qǐng)求轉(zhuǎn)入uWSGI處理
與Nginx配置目錄建立軟鏈接
sudo ln -s /home/python/Desktop/project_test/my_nginx.conf /etc/nginx/sites-enabled/
- 創(chuàng)建靜態(tài)文件與媒體文件存放目錄
sudo mkdir static_common
sudo mkdir media_common
- 修改項(xiàng)目settings,在最后面添加
STATIC_ROOT = os.path.join(BASE_DIR, 'static_common')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media_common')
- 進(jìn)入項(xiàng)目根目錄涂籽,執(zhí)行靜態(tài)文件遷移命令
python manage.py collectstatic
提示輸入選項(xiàng)時(shí)選yes即可
重啟Nginx服務(wù)
sudo /etc/init.d/nginx restart
9 Nginx & uWSGI & Django(服務(wù)器)
9.1 測(cè)試Nginx
-
在瀏覽器內(nèi)輸入
<YOUR_SERVER_IP>:8000/static/admin/css/base.css
苹祟,檢查是否能正常顯示這個(gè)css文件
-
將一張測(cè)試圖片
test.jpg
放入media_common文件夾中,在瀏覽器中輸入<YOUR_SERVER_IP>:8000/media/test.jpg
评雌,如果出現(xiàn)403則將圖片的權(quán)限改為666树枫,成功顯示圖片
9.2 測(cè)試uWSGI
- 回到項(xiàng)目根目錄,輸入以下命令
uwsgi --socket :8001 --wsgi-file test.py
- 打開(kāi)瀏覽器景东,地址欄輸入
<YOUR_SERVBER_IP>
砂轻,看是否能正常顯示'Hello World'
9.3 用UNIX socket取代TCP port
- 修改
my_nginx.conf
,最終版如下:
upstream django {
# server 127.0.0.1:8001;
server unix:///home/python/Desktop/project_test/my_sock.sock;
}
server {
listen 8000; # 端口號(hào)
server_name songmingyao.com; # 服務(wù)器 ip 或是域名
charset utf-8; # 字符集
# 最大上傳限制
# client_max_body_size 75M;
location /media {
alias /home/python/Desktop/project_test/media_common; # 媒體文件所在文件夾
}
location /static {
alias /home/python/Desktop/project_test/static_common; # 靜態(tài)文件所在文件夾
}
# 將所有非媒體請(qǐng)求轉(zhuǎn)到Django服務(wù)器上
location / {
uwsgi_pass django; # 最上方已定義
# 將所有參數(shù)都轉(zhuǎn)到uwsgi下
include /home/python/Desktop/project_test/uwsgi_params; # uwsgi_params的路徑
}
}
- 修改
my_uwsgi.ini
斤吐,最終版如下
[uwsgi]
# 使用nginx連接時(shí)使用
# socket = 0:8001
# 直接做web服務(wù)器使用
# http = 0:8080
# 項(xiàng)目目錄
chdir = /home/python/Desktop/project_test
# 項(xiàng)目中wsgi.py文件的目錄
wsgi-file = /home/python/Desktop/project_test/project_test/wsgi.py
# 主進(jìn)程
master = true
# 多進(jìn)程&多線(xiàn)程
processes = 6
threads = 2
# .sock文件目錄需與Nginx文件內(nèi)的配置相同
socket = /home/python/Desktop/project_test/my_sock.sock
chmod-socket = 666
# 以守護(hù)進(jìn)程的方式啟動(dòng)
vacuum = true
# 存儲(chǔ)pid進(jìn)程
pidfile=uwsgi.pid
# 存儲(chǔ)log日志
daemonize=uwsgi.log
- 重啟Nginx和uWSGI
sudo /etc/init.d/nginx restart
uwsgi --stop uwsgi.pid
uwsgi --ini my_uwsgi.ini
-
打開(kāi)瀏覽器搔涝,地址欄輸入網(wǎng)址
<YOUR_SERVER_IP>:8000
,查看圖片和文字是否顯示正常
此時(shí)以下環(huán)節(jié)已全部打通
web client <-> web server(nginx) <-> the socket <-> uwsgi <-> Django
9.4 服務(wù)器開(kāi)機(jī)自啟
- 修改
/etc/rc.local
和措,添加以下內(nèi)容到exit 0
之前
/usr/local/bin/uwsgi --ini /home/python/Desktop/project_test/my_uwsgi.ini
<br />
個(gè)人技術(shù)博客地址:http://songmingyao.com/
<br />