有句話叫所有的樂趣都在部署之前缕探,也許這個(gè)小應(yīng)用還有很多缺陷,也許它還不夠完美唆铐,但是哲戚,仔細(xì)想想,其實(shí)沒有什么能比自己的網(wǎng)站在互聯(lián)網(wǎng)中上線更令人滿足的了艾岂,但是滿足的背后顺少,總是存在著很多的風(fēng)險(xiǎn),以至于幾乎所有的開發(fā)人員都說過這樣的話:“在我這里運(yùn)行是正常的呀王浴!”脆炎,所以這章,會(huì)讓這個(gè)應(yīng)用在實(shí)際的互聯(lián)網(wǎng)中跑起來氓辣。
部署一個(gè)網(wǎng)站的大概步驟如下:
- 注冊(cè)一個(gè)域名(備案)
- 購買一個(gè)服務(wù)器
- 安裝萬維網(wǎng)服務(wù)
- 使用git將代碼上傳到服務(wù)器
- 使用virtualenv管理項(xiàng)目的python依賴
- 使用Gunicorn配置網(wǎng)站
安裝及配置服務(wù)器
首先秒裕,我們要注冊(cè)一個(gè)域名,這方面我想做開發(fā)的都應(yīng)該很熟悉钞啸,在萬網(wǎng)或新網(wǎng)以及各種小的代理商都可以几蜻,就不展開了。
然后体斩,還需要一個(gè)服務(wù)器梭稚,這個(gè)選擇也有很多,并且由于跑一個(gè)Python的站點(diǎn)需要的資源不是太多硕勿,所以哨毁,無論是阿里云,騰訊云源武,Amazon的AWS扼褪,微軟的azure想幻,甚至你箱子底下的一臺(tái)多年不用的BT服務(wù)器都行,只要能滿足以下條件:
- 可以安裝Ubuntu(控制臺(tái)版本即可话浇,需要資源極少)
- 自己有Ubuntu的root權(quán)限
- 外網(wǎng)可訪問
- 可以使用ssh控制
好吧脏毯,我推薦使用Ubuntu的原因是我只會(huì)用這個(gè),現(xiàn)在這些都很簡單幔崖,舉個(gè)例子食店,但并不是廣告,去阿里云官網(wǎng)赏寇,購買一個(gè)ecs實(shí)例吉嫩,之后選擇安裝操作系統(tǒng),可以選擇Ubuntu1604版本嗅定,輸入用戶名密碼自娩,他就會(huì)自動(dòng)安裝操作系統(tǒng),稍等一會(huì)渠退,在阿里云的控制臺(tái)顯示"運(yùn)行中"忙迁,即可使用:
這時(shí)候可以使用遠(yuǎn)程的ssh工具,輸入他的公網(wǎng)ip碎乃,以及之前輸入的用戶名密碼姊扔, 即可連接:
當(dāng)出現(xiàn)這些內(nèi)容,即表示已經(jīng)使用root賬戶聯(lián)通遠(yuǎn)程服務(wù)器梅誓,為了安全起見恰梢,可以自己配置一個(gè)非root賬戶,當(dāng)必須使用root權(quán)限的時(shí)候梗掰,使用sudo前綴即可:
useradd -m -s /bin/bash niufennan #添加niufennan賬戶
# m 表示創(chuàng)建home目錄删豺,s表示默認(rèn)可以使用bash(shell)
usermod -a -G sudo niufennan #將niufennan添加至sudo用戶組
passwd niufennan #設(shè)置密碼
su - niufennan #切換到niufennan用戶
當(dāng)然,其實(shí)最好的方式其實(shí)是使用私鑰認(rèn)證愧怜,關(guān)于這方面的內(nèi)容網(wǎng)上也有很多呀页,就不在展開。
安裝Nginx
在安裝軟件之前拥坛,最好先升級(jí)一下apt-get
sudo apt-get update
然后安裝并啟動(dòng)Nginx
sudo apt-get install nginx
sudo service nginx start
經(jīng)過一個(gè)安裝列表 并且啟動(dòng)服務(wù)后蓬蝶,即可在瀏覽器中通過ip地址訪問到nginx的歡迎頁:
Nginx可用了
接下來按照同樣的步驟安裝剩余所需的軟件(Python git pip)
sudo apt-get install git python3 python-pip
解析域名
總是使用ip訪問當(dāng)然是不行的,所以需要對(duì)域名進(jìn)行dns解析猜惋,這點(diǎn)不同的注冊(cè)商網(wǎng)站的解析界面都有所不同丸氛,但是我相信四處點(diǎn)擊幾次總會(huì)找到正確的方法。
安裝Gunicorn
Gunicorn是一個(gè)Python的http服務(wù)器著摔,使用起來非常簡單缓窜,安裝也很方便,,直接使用pip即可
sudo pip install gunicorn
準(zhǔn)備工作終于已經(jīng)完成禾锤,開始上傳代碼
安裝MySql
在Ubuntu上安裝mysql同樣非常簡單私股,只需要幾個(gè)命令就可以完成:
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
其中安裝mysql-server的時(shí)候會(huì)出現(xiàn)讓輸入root密碼的界面,將焦點(diǎn)放置到ok按鈕上邊恩掷,回車后輸入密碼即可倡鲸。
然后在mysql中創(chuàng)建數(shù)據(jù)庫:
create database cblog default character set utf8 collate utf8_general_ci;
創(chuàng)建此數(shù)據(jù)庫的管理用戶
http://www.cnblogs.com/janken/p/5500320.html
此用戶可公網(wǎng)訪問,root數(shù)據(jù)庫則只能localhost訪問
上傳代碼
這里假設(shè)你已經(jīng)擁有g(shù)ithub賬戶并且熟悉簡單的git操作黄娘,并且已經(jīng)通過ssh公鑰方式與github庫關(guān)聯(lián)
首先峭状,到github中 創(chuàng)建一個(gè)庫,我的庫名字叫nblog
然后將文件push至遠(yuǎn)程庫(假設(shè)本地以及提交完成):
git remote add nblog 遠(yuǎn)程庫git地址
git push -u nblog master
虛擬環(huán)境使用
到了這里逼争,突然發(fā)現(xiàn)之前的blog中优床,或者說開發(fā)中犯了一個(gè)嚴(yán)重的錯(cuò)誤,即沒有使用virtualenv誓焦,這個(gè)將導(dǎo)致在服務(wù)器上配置運(yùn)行環(huán)境將變成了一件非常繁瑣羔巢,困難,甚至變成挑戰(zhàn)自己極限的事情罩阵,不過好在還可以不就,那么启摄,首先在服務(wù)端安裝virtualenv吧:
sudo pip install virtualenv
然后自己的環(huán)境稿壁,只能不考慮其他,先打一個(gè)比較臃腫的包(全環(huán)境)
pip freeze > requirements.txt
這里會(huì)將本機(jī)所有的庫記錄歉备,到服務(wù)器端可以直接復(fù)原傅是,若有virtualenv,則會(huì)只記錄虛擬環(huán)境下的庫蕾羊,將非常的方便喧笔,下面看一下記錄中的內(nèi)容:
可以看到,雖然沒有細(xì)看龟再,但至少畫紅線的部分是本項(xiàng)目肯定沒有用到的书闸,可以手動(dòng)刪除。
將此文件添加至git庫中并推送到遠(yuǎn)程庫
git add requirements.txt
git commit -m "增加遷移文件"
git push -u nblog master
然后通過ssh鏈接到服務(wù)器利凑,到用戶的home文件夾浆劲,創(chuàng)建nblog文件夾
mkdir nblog
然后將git遠(yuǎn)程庫中的代碼復(fù)制到nblog文件夾中
git clone https://github.com/niufennan/nblog.git nblog/nblog.niufennan.com/source
注意,Linux下哀澈,目錄層級(jí)關(guān)系必須使用/
創(chuàng)建虛擬環(huán)境(此時(shí)在nblog.niufennan.com文件夾下)
sudo virtualenv --python=python3 ../virtualenv
前一個(gè)為命令牌借,后一個(gè)為目錄名
virtualenv的使用方式有兩種,一種是執(zhí)行activete進(jìn)行環(huán)境切換割按,一種是直接指定virtualenv文件夾下的python和/或pip膨报,一般來講開發(fā)時(shí)可以切換,服務(wù)器直接指定路徑即可
在虛擬環(huán)境中安裝項(xiàng)目所用的庫:
sudo ../virtualenv/bin/pip3.5 install -r source/requirements.txt
這樣,就會(huì)將原本在開發(fā)機(jī)上記錄在requirements.txt上所有的庫都安裝在virtualenv的site-packages文件夾中
配置環(huán)境變量
這時(shí)候先別著急運(yùn)行现柠,別忘了有些值是配置在環(huán)境變量中的院领,主要有三個(gè):
access_key=os.environ.get("qn_access_key")
secret_key=os.environ.get("qn_secret_key")
SQLALCHEMY_DATABASE_URI=os.environ.get("nblog_mysql_str")
其中七牛的都是公共的,以后即使有其他的應(yīng)用晒旅,這兩個(gè)依然不會(huì)變栅盲,sql鏈接字符串則是項(xiàng)目私有的,所有使用nblog前綴废恋。
vi /etc/profile
然后下拉到文檔最低端
好谈秫,現(xiàn)在在服務(wù)器上就可以跑起來了。
../virtualenv/python manage.py runserver
看看服務(wù)器:
這個(gè)時(shí)候鱼鼓,你肯定迫不及待的想要從自己的PC機(jī)上看到成果了拟烫,那么,該如何做呢迄本,在這里硕淑,我是把nblog這個(gè)二級(jí)域名分配給了這個(gè)輕博客,這樣嘉赎,需要對(duì)Nginx進(jìn)行一些配置置媳,首先進(jìn)入Nginx的目錄:
cd /etc/nginx
這里注意兩個(gè)目錄: sites-available和sites-enable,很好理解公条,看名字就能看出來拇囊,一個(gè)是備用一個(gè)是使用,下面在sites-available中新建我們所需要的nginx配置文件:
sudo vi nblog.niufennan.com
用vi創(chuàng)建后靶橱,輸入如下內(nèi)容:
server{
listen 80;
server_name nblog.niufennan.com;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
很簡單寥袭,頁很好理解,即當(dāng)域名為nblog.niufennan.com的時(shí)候关霸,反向轉(zhuǎn)發(fā)到127.0.0.1:5000
保存后传黄,通過軟連接的方式,鏈接到sites-enable中
sudo ln -s /etc/nginx/sites-available/nblog.niufennan.com /etc/nginx/sites-enable/nblog.niufennan.com
然后重啟nginx
sudo service nginx reload
啟動(dòng)服務(wù)
../virtualenv/python manage.py runserver
ok队寇,現(xiàn)在迫不及待的想要在本地訪問了膘掰,地址欄中輸入域名
nblog.niufennan.com
完美,但是此時(shí)做任何操作佳遣,都會(huì)報(bào)錯(cuò)炭序,因?yàn)閿?shù)據(jù)庫還沒有遷移,進(jìn)入項(xiàng)目目錄苍日,進(jìn)行數(shù)據(jù)庫遷移操作:
../virtualenv/python manage.py db init
../virtualenv/python manage.py db migrate -m "服務(wù)器"
../virtualenv/python manage.py db upgrade
注意惭聂,這里我遇到了一個(gè)問題,即數(shù)據(jù)庫遷移后的編碼為utf8相恃,中文會(huì)有亂碼問題辜纲,需手動(dòng)通過客戶端修改編碼為utf8mb4,不知是否有自動(dòng)化的方式,望高手解惑耕腾。
在運(yùn)行见剩,刷新數(shù)據(jù)庫,經(jīng)過簡單的測試扫俺,ok苍苞,完美:
但是,人生貌似就怕說但是狼纬,這個(gè)時(shí)候羹呵,生命周期僅僅是這個(gè)控制臺(tái),也就是說疗琉,一旦控制臺(tái)關(guān)閉了冈欢,對(duì)于現(xiàn)在來說,也就是xshell斷開連接盈简,則服務(wù)也就關(guān)閉了凑耻,即無法訪問了,那么柠贤,這時(shí)候香浩,應(yīng)該怎么辦呢?還記得剛剛安裝的獨(dú)角獸(Gunicorn)么臼勉?終于輪到它出馬了
../../virtualenv/bin/gunicorn -b 127.0.0.1:5000 -D manage:app
-b 表示使用ip及斷開
-D 表示后臺(tái)運(yùn)行
關(guān)于linux確實(shí)是小白邻吭,比如現(xiàn)在,其實(shí)應(yīng)該配置一個(gè)upstart坚俗,但配置多次始終不成功,如果有大牛希望能幫忙教教岸裙。
好猖败,就目前來說,至少一個(gè)簡單的降允,不考慮性能的輕博客已經(jīng)部署成功恩闻,下面想想還缺少的必須的功能:
- 郵件驗(yàn)證
- 用戶密碼加密及加鹽
- 對(duì)于發(fā)言的評(píng)論及反饋
- 有些發(fā)言的敏感詞過濾
等等,貌似功能還缺失很多剧董,但不管怎么說幢尚,現(xiàn)在也能算是一個(gè)小的里程碑了。想想翅楼,還是很了不起的:)