整體安裝流程 安裝 ubuntu ,安裝 pip, 安裝 uwsgi, 安裝 django安裝 nginx
整個(gè)請(qǐng)求邏輯
用戶訪問(wèn) -> nginx -> uwsgi -> django
其中靜態(tài)文件 直接由 nginx 處理
- 安裝 Ubuntu
下載的時(shí)候, 看到 mini 版本只有幾十兆, 就選了 mini 版本 鏈接在此
安裝的時(shí)候才發(fā)現(xiàn), 好多都是要后面下載的, 不過(guò)無(wú)所謂了, 安裝上就行了 - 安裝 ssh server
ssh server 可以讓你在其他電腦上通過(guò)支持的命令行工具(如 mac 下的 終端, windows 下的 putty) 遠(yuǎn)程連接, 這樣就不用一直守在機(jī)器旁邊了.
我自己安裝的時(shí)候, 漏選了這一項(xiàng), 導(dǎo)致安裝好的 Ubuntu 沒(méi)有ssh 服務(wù)器, 需要自己安裝, 安裝方法如下, 如果你已經(jīng)有了就跳過(guò) (可以在其他電腦上運(yùn)行 ssh root@<服務(wù)器 ip> 來(lái)看, 如果提示連接拒絕, 就表示沒(méi)有安裝)
sudo apt-get update
sudo apt-get install openssh-server
service ssh start
- 安裝 pip
pip 是一個(gè) python 下的包管理工具, 可以很方便的安裝各類 python 的第三方工具, 類似 iOS 開(kāi)發(fā)的 Cocoapod
curl -O https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
- 設(shè)置 pip 鏡像
由于默認(rèn)服務(wù)器是在國(guó)外, 訪問(wèn)速度實(shí)在感人, 還好有各類國(guó)內(nèi)的鏡像可以加速訪問(wèn). 這里使用清華大學(xué)的鏡像服務(wù)
cd ~
mkdir .pip
cd .pip
cat -e "[global]\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple" > pip.config
- 安裝 uwsgi
- 安裝 python-dev
安裝 uwsgi 過(guò)程中, 需要編譯, 要先安裝 python 開(kāi)發(fā)板
sudo apt-get install python3-dev
- 安裝 gcc
安裝 uwsgi 需要一個(gè) C 編譯器, 所以還需要安裝一個(gè) gcc
sudo apt-get install gcc
- 安裝 uwsgi
一切準(zhǔn)備妥當(dāng)就可以安裝 uwsgi 了
sudo pip3 install uwsgi
可以使用 uwsgi --version
來(lái)檢查是否正確安裝了
- 測(cè)試 uwsgi
創(chuàng)建一個(gè) test.py 文件測(cè)試
內(nèi)容如下
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
在這個(gè)文件的目錄內(nèi)運(yùn)行命令
uwsgi --http :8000 --wsgi-file test.py
打開(kāi)瀏覽器輸入服務(wù)器的 ip, 端口 8000 如果能看到 hello, world 就表安裝 uwsgi 成功了
- 安裝 django
sudo pip install django
- 創(chuàng)建一個(gè) django 項(xiàng)目用來(lái)測(cè)試
django-admin startproject Hello
現(xiàn)在的目錄結(jié)構(gòu)應(yīng)該是這樣的
Hello/
manage.py
Hello/
__init__.py
settings.py
urls.py
wsgi.py
- 編輯 setting.py
如果你安裝的是1.10 以上的 django(可以運(yùn)行命令django-admin --version
來(lái)查看版本), 并且你需要在另外一臺(tái)電腦上查看頁(yè)面, 你就一定要設(shè)置ALLOWED_HOSTS
找到 settting.py 中的
...
DEBUG = True
ALLOWED_HOSTS = []
...
在 ALLOWED_HOSTS 中填入服務(wù)器的 ip 地址.
如
...
DEBUG = True
ALLOWED_HOSTS = ["192.168.1.5"]
...
- 使用 django 內(nèi)置的服務(wù)器測(cè)試一下
到項(xiàng)目的根目錄中運(yùn)行命令
python3 manage.py runserver
這個(gè)命令默認(rèn)運(yùn)行服務(wù)器在 8000 端口, 而且只會(huì)監(jiān)聽(tīng)來(lái)自本機(jī)(服務(wù)器)的請(qǐng)求
如果需要在服務(wù)器之外的電腦中瀏覽, 需改成這個(gè)命令
python3 manage.py runserver 0.0.0.0:8000
在瀏覽器中輸入服務(wù)器的地址加上端口, 就可以看到測(cè)試頁(yè)面了, 不過(guò)這個(gè)是用來(lái)開(kāi)發(fā)的測(cè)試服務(wù)器, 如果需要實(shí)際部署項(xiàng)目, 就不要用這個(gè)服務(wù)器了.
- 使用 uwsgi 測(cè)試 Django 項(xiàng)目
在項(xiàng)目根目錄(有 manage.py 的目錄) 運(yùn)行
uwsgi --http :8000 --module Hello.wsgi
打開(kāi)瀏覽器輸入服務(wù)器的 ip, 端口 8000 如果能看到django 的測(cè)試頁(yè)面就表示 django 和 uwsgi 工作正常
- 安裝 nginx
sudo apt-get install nginx
安裝完畢,會(huì)自動(dòng)開(kāi)啟 nginx 服務(wù), 默認(rèn)端口80, 打開(kāi)瀏覽器, 輸入服務(wù)地址, 可以看到 nginx 的測(cè)試頁(yè)面
- 配置 nginx
首先要將 uwsgi_params 文件拷貝到項(xiàng)目文件夾下. 拷貝過(guò)來(lái)后這個(gè)文件不用修改.
原始的 uwsgi_params 文件在/etc/nginx/目錄下
新創(chuàng)建一個(gè) nginx 配置文件, Hello_nginx.conf
內(nèi)容如下
upstream django {
server 127.0.0.1:8001;
}
server {
# the port your site will be served on
listen 8000; # 端口號(hào)
# the domain name it will serve for
server_name 10.0.9.176; # 服務(wù)器 ip 或是域名
charset utf-8;
# Django media
location /media {
alias /home/yww/djangotest/Hello/media; # 媒體文件所在文件夾
}
location /static {
alias /home/yww/djangotest/Hello/static; # 靜態(tài)文件所在文件夾
}
# max upload size
client_max_body_size 75M; # adjust to taste
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /home/yww/djangotest/Hello/uwsgi_params; #uwsgi_params 路徑
}
}
這個(gè)配置文件告訴 nginx 從文件系統(tǒng)中拉起 media 和 static 文件作為服務(wù)掖鱼,同時(shí)響應(yīng) django 的 request
在 /etc/nginx/sites-enabled 目錄下創(chuàng)建本文件的連接, 使 nginx能夠使用它:
sudo ln -s /home/yww/djangotest/Hello/Hello_nginx.conf /etc/nginx/sites-enabled/
- 部署靜態(tài)文件
在 django 的 setting 文件中,添加下面一行內(nèi)容:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
然后運(yùn)行
python3 manage.py collectstatic
- 測(cè)試 nginx 靜態(tài)文件和媒體文件服務(wù)
首先重啟nginx服務(wù):
service nginx restart
測(cè)試一下靜態(tài)文件是否可以讀取
訪問(wèn) http://<服務(wù)器 ip>:8000/static/admin/css/base.css 看看是否正常顯示這個(gè)文件
然后檢查media文件是否已經(jīng)正常
在項(xiàng)目根目錄下新建一個(gè) media 文件夾, 放入任意一張圖片, 名字改為test.jpg
訪問(wèn) http://<服務(wù)器 ip>:8000/media/test.jpg 看看是否正常顯示圖片
- 測(cè)試 nginx + uwsgi
找到 第 6 步 創(chuàng)建的test.py, 放到 Django 項(xiàng)目根目錄下測(cè)試
運(yùn)行命令
uwsgi --socket :8001 --wsgi-file test.py
訪問(wèn) http://<服務(wù)器 ip>:8000/
如果能夠顯示 hello, world 就行了
- 用 UNIX socket 取代 TCP port
對(duì) Hello_nginx.conf 做如下修改
upstream django {
#server 127.0.0.1:8001; # 去掉這行
server unix:///home/yww/djangotest/Hello/Hello.sock; # 新建這行
}
...
然后重啟服務(wù)器, 并運(yùn)行 uWSGI, 代碼如下
service nginx restart
uwsgi --socket Hello.sock --wsgi-file test.py --chmod-socket=662
- 測(cè)試 nginx + uwsgi + django
只需要啟動(dòng) uwsgi 就可以了, nginx 不需要重啟
uwsgi --socket Hello.sock --module Hello.wsgi --chmod-socket=662
訪問(wèn) http://<服務(wù)器 ip>:8000/
如果能夠顯示 django 的測(cè)試頁(yè)面就大功告成了
- 使用 ini 文件運(yùn)行 uwsgi
上面的這個(gè)命令太長(zhǎng)了, 也很容易寫錯(cuò), 我們可以寫一個(gè)文件來(lái)方便運(yùn)行 uwsgi
在項(xiàng)目根目錄下創(chuàng)建一個(gè) Hello_uwsgi.ini
# Hello_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /home/yww/djangotest/Hello
# Django's wsgi file
module = Hello.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe)
socket = /home/yww/djangotest/Hello/Hello.sock
chmod-socket = 662
# clear environment on exit
vacuum = true
運(yùn)行 uwsgi 的時(shí)候就只需要運(yùn)行這個(gè)命令就行了
uwsgi --ini Hello_uwsgi.ini