之前寫了一篇Pycharm遠程調試django項目的漓雅,只是完成了Django項目在服務器上的運行毁嗦。而且當時是用的虛擬機鼠锈,有些坑并沒有遇到麸拄。前幾天買了阿里云的Linux服務器ubuntu16.04,一路搭建環(huán)境和部署過程搞了2天多特笋,可以說是神坑無數剃浇,最有意思的網上的很多博客是叫踩坑記錄,結果照著這些方式去搞出現(xiàn)了很多奇怪的問題,估計也和版本不同有關虎囚。這里為了避免少走一些彎路角塑,我就來記錄一下整個過程(這里都是默認root用戶遠程登錄下進行操作,項目名為DjangoTest)。
Python環(huán)境的配置
因為Python環(huán)境都是Linux系統(tǒng)上面自帶的淘讥,我這里項目用的設Python3.6圃伶,安裝的過程就不多說了,這里基本沒什么問題适揉,安裝好后只需把安裝目錄鏈接到系統(tǒng)自帶的python3(系統(tǒng)自帶的是Python3.5)即可留攒。本來這里應該沒什么問題的,但剛這個項目需要請求https的鏈接嫉嘀,因為在本地的時候會這里是不會出問題的炼邀,但是一旦放到服務器端,坑也就來了剪侮。請求時直接返回這么一句異常
SSLError("Can`t connect to HTTTPS URL because the SSL module is not available"))
可以看到用到是python中的ssl模塊不存在拭宁,直接去安裝好相應的openssl模塊后,還是拋出這個異常瓣俯。于是不停的去Google和百度杰标,過程中也是按照類似的答案,結果還是沒能解決這個問題彩匕。最后我就卸載了Python3.6, 直接用3.5的環(huán)境去運行腔剂,這個問題才得以解決。
具體應該是因為系統(tǒng)默認的是加載已存在的ssl模塊驼仪,用3.6版本的雖然也依賴了掸犬,但是并不會識別,發(fā)現(xiàn)不是來自默認Python環(huán)境中自帶的绪爸,就無法加載湾碎。這里感覺也是能配置的,但事實就是我不知道多少次的卸載重裝奠货,按照各種方式去安裝和依賴介褥,還是出現(xiàn)同樣的問題,好在3.6版本的項目在3.5上還是基本兼容的递惋,雖然暴力柔滔,但不失為一種辦法。(如果哪位有更好的解決辦法萍虽,歡迎給我留言)
這里完成后就是Python虛擬環(huán)境容器的安裝和環(huán)境變量的配置
pip install virtualenvwrapper
這里的話廊遍,因為之前寫過,就不多說了贩挣,可以參考我的之前的一篇博客Pycharm遠程調試Django項目。
Mariadb的配置
本來不想寫數據庫的,但這里我也是第一次用Mariadb王财,并且在配置文件方面發(fā)生了一些變化卵迂,也踩了一些坑。
Mariadb是MySQL的一個分支绒净,開發(fā)者也是MySQL的作者见咒,所以Mariadb是完全兼容MySQL的基本命令的。
安裝
apt-get install mariadb-server
如果報本地不存在挂疆,就先更新下源
apt-get update
安裝完成后直接啟動服務
/etc/init.d/mysql start
/etc/init.d/mysql stop
/etc/init.d/mysql restart
然后直接輸入mysql進入數據庫后
use mysql
更改mysql密碼
update user set Password = PASSWORD('你的密碼') where User ='root';
然后設置外部ip訪問權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密碼' WITH GRANT OPTION;
FLUSH PRIVILEGES;
這里完成后 重啟一下 改览,然后還需要修改一下配置文件中綁定的地址
vim /etc/mysql/mariadb.conf.d/50-server.cnf
找到這一行
直接注釋掉就可以了。最后需要注意一下缤言,如果是用的阿里云的服務器就需要配置一下安全組規(guī)則宝当,開放3306端口。
這樣就能完成數據庫的遠程連接了胆萧。
注意:
如果Django項目中用到Mysql的話庆揩,需要在服務器端的Python虛擬環(huán)境下安裝一下
pip install mysqlclient
可能會安裝出錯,因為缺少一些依賴包跌穗,安裝一下
apt-get install libmysqlclient-dev
然后重新安裝mysqlclient订晌,這樣配置就完成了。
uwsgi的安裝和配置
uwsgi也是一種web服務器蚌吸,這里就不多介紹了锈拨,直接開始安裝
pip install uwsgi
可以先來測試一下
uwsgi --http 0:80 --module DjangoTest.wsgi
然后使用配置文件的方式來啟動django項目,可以直接在項目的目錄下新建一個uwsgi.ini文件
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# 項目根目錄的路徑
chdir = /你的路徑/DjangoTest
# Django's wsgi file
module = DjangoTest.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = :8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# 虛擬環(huán)境的目錄
pythonpath = /你的虛擬環(huán)境的路徑/lib/python3.6/site-packages/
配置文件寫好后,其實我們是可以直接用uwsgi就能完成部署的羹唠,使用命令
uwsgi -i uwsgi.ini
如果端口號被占用奕枢,就直接使用命令查看占用情況
lsof -i :8000
然后使用命令,銷毀這些進程
killall -9 uwsgi
但是為了提高擴展性肉迫,我們繼續(xù)下面的步驟
Nginx的安裝與配置
nginx是一個強大的中間件验辞,我們直接把它作為對外的服務接口。
開始安裝
apt-get install nginx
然后看看啟動喊衫、停止和重啟命令
/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx reload
這里注意跌造,其它配置文件不要亂改!如果安裝完成不能正常啟動的話可以重啟服務器看看族购。沒問題的話壳贪,我們可以在項目目錄下新建一個nginx.conf文件,然后按照下面的方式配置
# the upstream component nginx needs to connect to
upstream django {
#django項目的端口號 和uwsgi里面的端口號保存一致
server 0.0.0.0:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# nginx服務的端口號 不用修改
listen 80;
# the domain name it will serve for
# 這里可以填寫你的ip地址或者域名
server_name www.test.com;
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /你的路徑/DjangoTest/media; # 指向django的media目錄
}
location /static {
alias /你的路徑/DjangoTest/static; # 指向django的static目錄
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
配置寫好后寝杖,就需要把它鏈接到Nginx的啟動配置文件中违施,
ln -s /你的目錄/DjangoTest/nginx.conf /etc/nginx/conf.d/
配置完成后,再去加載一下uwsgi文件瑟幕。
總結
配置好后磕蒲,直接輸入IP地址或者解析到該IP的域名就能成功訪問到Django項目了留潦,這樣你也會發(fā)現(xiàn),通過nginx我們可以輕松地配置和部署多個環(huán)境不同的站點辣往,只需要把配置文件寫好后放入nginx的啟動文件中兔院。
最后來整理一下整個訪問的過程
1.使用nginx作為外部接口,直接處理發(fā)送過來的請求站削,如果是靜態(tài)請求坊萝,就直接根據配置的靜態(tài)文件目錄,返回相應的靜態(tài)資源许起。
2.如果是動態(tài)請求十偶,就通過配置文件將請求轉移到uwsgi,uwsgi又會將接受到的請求傳遞給wsgi(Django項目默認通過wsgi啟動服務的)园细,wsgi就會根據請求來調用Django項目中的邏輯來處理請求惦积。
3.處理完成后,又將結果返回給uwsgi珊肃,然后uwsgi又繼續(xù)將結果返回給nginx
4.最后Nginx將處理后的結果返回給用戶
雖然過程中遇到很多坑荣刑,但在多次的嘗試中更能加深自己的經驗和理解。
最后伦乔,祝大家在新的一年里厉亏,技術節(jié)節(jié)高升!A液汀爱只!