如何將本地的Django項(xiàng)目部署到云服務(wù)器
開發(fā)環(huán)境
- 開發(fā)語言: Python
- 后臺(tái)框架:Django
- 前端框架:bootstrap
- web服務(wù)器:nginx
- wsgi服務(wù)器:uwsgi
查看本地項(xiàng)目Django和Python版本:
(可以直接安裝Django最新版本就可以了绽左,Python版本不能低于3.4)
Django2.0.4
Python3.6.5
首先python3的安裝
首先在官網(wǎng)下載安裝包 python-3.6.5
(直接使用wget命令下載,速度也賊快推汽,下載完成后發(fā)現(xiàn)在根目錄下多了一個(gè)Python-3.6.5.tgz的壓縮包)安裝相關(guān)包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
服務(wù)器自帶的python2安裝在usr/bin/目錄中,可以通過
which python
命令來查看python的安裝目錄酪耳。
然后進(jìn)入該目錄,用我們熟悉的python -v來查看python版本并闲。(其實(shí)直接在根目錄下用python -v也是可以的萤捆,但which這個(gè)命令是真的可不錯(cuò))利用
tar xf Python-3.6.5.tgz
命令解壓解壓完成后枪向,(進(jìn)入解壓后的目錄)绢涡,編輯安裝命令。
./configure --prefix=/usr/local/python3/ # 安裝目錄為/usr/local/python3(可以自定義安裝目錄)
make && make install # 編譯并安裝
- 提示bug: ./configure: No such file or directory
- 是因?yàn)闆]有進(jìn)入解壓后的目錄遣疯,configure是安裝文件里面的配置工具。
- 設(shè)置軟連接
一條命令解決凿傅,再也不用配環(huán)境變量了。linux的軟鏈接相當(dāng)于windows里的快捷方式,快捷方式刪了就刪了滔迈,原來文件還是存在的敬惦。軟連接后面也有大用俄删。
ln -s /usr/local/python3/bin/python3 /usr/bin/python3.6
即在/usr/bin里面創(chuàng)建一個(gè)快捷方式python3.6奏路,該快捷方式指向python3的安裝路徑鸽粉。
輸入python3.6 -v
測(cè)試帚戳,成功
- 可以通過以下命令查看所有的軟連接:
cd usr/bin/
ls -l
可以看到python,python2,連接的都是python2.7笔宿,而python3.6連接的就是剛安裝的版本
- 也可以將python3.6直接改為python犁钟。
- 備份原連接為:python -> python2
- 使用ln -s /usr/local/python3/bin/python3 /usr/bin/python醋粟,建立失敗鼻吮,發(fā)現(xiàn)python已經(jīng)存在违柏。
- 刪除原連接 rm /python2
- 再次建立成功闲孤。
安裝各種軟件
- 安裝數(shù)據(jù)庫
安裝sqlite讼积,mysql
yum install mysql mysql-devel
yum install sqlite-devel
- 安裝pip
yum -y install python-pip
報(bào)錯(cuò)
[root@VM_0_12_centos bin]# yum -y install python-pip
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax
先安裝get-pip
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py
安裝成功吕朵。再用python命令安裝pip
python get-pip.py
安裝成功,pip版本為:
Successfully installed pip-10.0.1 wheel-0.31.0
但此時(shí)未配置軟連接的情況下第队,需要使用python -m pip來使用python3的pip。
- 安裝Django
pip install django
安裝失斉俑选:
This version of Django requires Python 3.4, but you're trying to
install it on Python 2.7.
This may be because you are using a version of pip that doesn't
understand the python_requires classifier. Make sure you
have pip >= 9.0 and setuptools >= 24.2, then try again:
$ python -m pip install --upgrade pip setuptools
$ python -m pip install django
This will install the latest version of Django which works on your
version of Python. If you can't upgrade your pip (or Python), request
an older version of Django:
$ python -m pip install "django<2"
2.0.5版本需要python3.4以上版本
這里因?yàn)槭褂玫氖莗ython2的pip凳谦,為了解決這個(gè)問題可以修改軟連接,也可以直接使用python -m pip install django
來指定pip為python3的衡未。
我這里使用了第二種方法尸执。
- 安裝mysqlclient(連接器)
python -m pip install mysqlclient
報(bào)錯(cuò):
OSError: mysql_config not found
加入環(huán)境變量:
PATH="$PATH":/usr/local/mysql/bin
重新安裝,成功缓醋。
版本:mysqlclient-1.3.12
- 安裝uwsgi
python -m pip install uwsgi
Successfully installed uwsgi-2.0.17
- 安裝nginx
在線項(xiàng)目部署
在服務(wù)器上創(chuàng)建簡(jiǎn)單Django項(xiàng)目hello剔交,結(jié)合uwsgi+Django+nginx。
測(cè)試uwsgi
測(cè)試uwsgi -version
顯示環(huán)境變量未配置好 -bash: uwsgi: command not found
建立軟連接:(好用的一匹改衩,順便把其他的都配了)
ln -s /usr/local/python3/bin/django-admin.py /usr/bin/django-admin.py
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn
查看軟連接:
cd /usr/bin
ls -l
建立好軟連接后,查看uwsgi是否安裝成功:
uwsgi --version
成功,顯示:
[root@VM_0_12_centos projects]# uwsgi --version
2.0.17
繼續(xù)測(cè)試驯镊,創(chuàng)建test.py:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
使用uwsgi運(yùn)行test.py:
uwsgi --http :8000 --wsgi-file test.py
訪問http://127.0.0.1:8000/
訪問失敽健:
localhost拒絕了我們的請(qǐng)求竭鞍。
有毒,這些教程是真的有毒橄镜。在本地瀏覽器訪問云服務(wù)器的時(shí)候一定要用IP地址或者域名偎快。
訪問http://www.zosurn.xyz:8000
訪問成功,但出現(xiàn)的是seafile登錄頁面洽胶,說明該端口被占用了晒夹,可以釋放8000端口,也可以換其他的端口姊氓。
修改端口為8002:
uwsgi --http :8002 --wsgi-file test.py
成功訪問到hello world丐怯。
創(chuàng)建Django項(xiàng)目hello
在/home/projects/目錄下,使用Django創(chuàng)建一個(gè)簡(jiǎn)單hello項(xiàng)目后翔横,配置setting.py中的allowed_host設(shè)置為:
ALLOWED_HOSTS = ['.zosurn.xyz', 'localhost', '127.0.0.1']
將uwsgi與Django連接:
uwsgi --http :8008 --chdir /home/projects/hello --wsgi-file hello/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192
訪問http://www.zosurn.xyz:8008
成功读跷,出現(xiàn)Django歡迎頁面。
參數(shù)太多禾唁,可以將其寫入ini文件中
在hello項(xiàng)目的目錄下創(chuàng)建uwsgi.ini文件效览,寫入如下內(nèi)容(采用字典格式):
# hello_uwsgi.ini file
[uwsgi]
# Django-related settings
http = :8008
# the base directory (full path)
chdir = /home/projects/hello
# Django s wsgi file
module = hello.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
然后使用如下命令啟動(dòng)uwsgi:
uwsgi --ini uwsgi.ini
再次測(cè)試,訪問http://www.zosurn.xyz:8008成功荡短。
測(cè)試nginx:
查看nginx是否安裝成功丐枉,查看nginx的版本:
[root@VM_0_12_centos hello]# nginx -v
nginx version: nginx/1.12.2
在/home/projects目錄下新建一個(gè)test目錄,在里面添加一個(gè)簡(jiǎn)單的html文件掘托。然后在nginx.conf中簡(jiǎn)單配置:
events{}
http{
server{
server_name www.zosurn.xyz;
root /home/projects/test;
index index.html;
}
}
啟動(dòng)該nginx:(啟動(dòng)之前瘦锹,要將/usr/local/nginx/mime.types文件復(fù)制到該nginx.conf所在目錄,并且必須使用絕對(duì)路徑)
nginx -c /home/projects/test/nginx.conf
如果端口被占用烫映,則先釋放該端口,則使用lsof -i :8082
查看占用端口進(jìn)程的pid沼本,并使用kill -9 [pid]關(guān)閉相應(yīng)的進(jìn)程。
在瀏覽器中訪問自己的域名http://www.zosurn.xyz锭沟,訪問成功抽兆。
將nginx和uwsgi以及Django結(jié)合
在hello項(xiàng)目的目錄下創(chuàng)建nginx.conf
vim nginx.conf
添加如下內(nèi)容:
events{}
http{
server{
listen 8082; # 如果不加的話,會(huì)默認(rèn)為80族淮,這里也可以不改
server_name www.zosurn.xyz;
root /home/projects/hello;
index index.html;
location /{
include uwsgi_params;
uwsgi_pass 127.0.0.1:8008; # 需要和ini文件中的端口保持一致辫红,這樣才能實(shí)現(xiàn)兩者的通信。
uwsgi_read_timeout 2;
}
}
}
啟動(dòng)nginx:
nginx -c /home/projects/hello/nginx.conf
啟動(dòng)uwsgi:
uwsgi --ini /home/projects/hello/uwsgi.ini
使用域名訪問祝辣,成功訪問到該hello項(xiàng)目的Django歡迎頁面贴妻。
部署本地項(xiàng)目到服務(wù)器
clone本地項(xiàng)目代碼到服務(wù)器/通過ftp復(fù)制項(xiàng)目到服務(wù)器
在我的項(xiàng)目目錄/home/projects里創(chuàng)建一個(gè)blog目錄,并在里面創(chuàng)建一個(gè)conf目錄蝙斜,用來存放配置文件,這樣分離開來名惩,方便更新維護(hù)項(xiàng)目代碼。
- home/
- projects/
- blog/
- conf/
- nginx.conf
- uwsgi.ini
- uwsgi.log
- mysite/ # 你的Django項(xiàng)目目錄孕荠,假設(shè)為mysite
- blog/
- mysite/
- urls.py
- settings.py
- static/
- template/
- manage.py
- ...
- conf/
- blog/
- projects/
修改項(xiàng)目代碼
修改settings.py:
DEBUG = False # Django是否加載靜態(tài)資源
ALLOWED_HOSTS = ['localhost','127.0.0.1','.zosurn.xyz'] # 允許訪問的主機(jī)地址
STATIC_ROOT = os.path.join(BASE_DIR, "static/") # 收集Django的靜態(tài)文件到同一個(gè)static中
創(chuàng)建uwsgi.ini和uwsgi.log
uwsgi.ini
不變娩鹉,依舊為:
# myblog uwsgi.ini file
[uwsgi]
socket = 127.0.0.1:8002
# http = :8002 如果不通過nginx可以直接用http攻谁,但要通過web服務(wù)器就必須要用socket
# the base directory (full path)
chdir = /home/projects/blog/mysite
# Django s wsgi file
module = mysite.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# clear environment on exit
vacuum = true
創(chuàng)建nginx.conf
# worker_rlmit_nofile 65500; # 提升nginx的進(jìn)程文件打開數(shù)
events{}
http{
include mime.types;
server{
listen 80;
server_name www.zosurn.xyz;
index index.html ;
root /home/projects/blog/mysite;
location /static {
alias /home/projects/blog/mysite/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
uwsgi_pass 127.0.0.1:8002;
}
}
}
創(chuàng)建數(shù)據(jù)庫、收集靜態(tài)文件
python manage.py migrate
python manage.py collectstatic
啟動(dòng)服務(wù)
- 啟動(dòng)nginx
nginx -c /home/projects/blog/conf/nginx.conf
- 后臺(tái)啟動(dòng)uwsgi
uwsgi /home/projects/blog/conf/uwsgi.ini -d /home/projects/blog/conf/uwsgi.log
如此就可以通過域名訪問自己的Django項(xiàng)目了弯予。