我的第一個python web開發(fā)框架(20)——產(chǎn)品發(fā)布(部署到服務(wù)器)
首先按上一章節(jié)所講述的,將服務(wù)器環(huán)境安裝好以后,接下來就是按步驟將網(wǎng)站部署到服務(wù)器上了。

我們的站點是前后端分離的,所以需要部署兩個站點。首先來發(fā)布前端站點。
部署前端站點
輸入命令進入svn管理文件夾:cd /data/svn/
創(chuàng)建svn:svnadmin create simple_html
進入svn帳號與密碼管理文件夾:cd /data/svn/simple_html/conf/
建立svn賬號:vi?authz???(在文件里面添加下面代碼)
[simple_html:/] py?=?rw
編輯svn賬號密碼:vi?passwd??(在文件里面添加下面代碼)
py?=?123456
修改svn配置信息:vi?svnserve.conf? (將配置文件里的內(nèi)容對著下面參數(shù)進行修改)
anon-access?=?none auth-access?=?write password-db?=?passwd authz-db?=?authz
進入勾子文件夾:cd /data/svn/simple_html/hooks/
添加勾子文件:vi post-commit? (添加下面代碼,用于svn提交代碼成功后,自動將代碼發(fā)布出去)
#!/bin/sh #?POST-COMMIT?HOOK export.UTF-8 /usr/bin/svn?up?--username=py?--password=123456?/data/www/simple_html
給勾子賦可執(zhí)行權(quán)限:chmod +x post-commit??(可有賦了可執(zhí)行權(quán)限后,勾子才會被執(zhí)行)
創(chuàng)建前端網(wǎng)站發(fā)布文件夾:mkdir /data/www/simple_html
檢出svn到新創(chuàng)建的網(wǎng)站發(fā)布文件夾:svn checkout svn://localhost/simple_html /data/www/simple_html/??(輸入前面創(chuàng)建的賬號:py和密碼123456,提示Store password unencrypted (yes/no)?時輸入y就可以了。如果運行后出現(xiàn)svn: E000013 xxx ?Permission denied錯誤,有可能是你剛剛修改的svn配置沒有生效,重啟一下svn就可以了)
在本地電腦安裝個svn客戶端(我用的是TortoiseSVN-1.9.4.27285-x64-svn-1.9.4.msi),將剛創(chuàng)建的svn檢出到本地
將前端html代碼復制到剛檢出的文件夾里,提交到服務(wù)器端
檢查服務(wù)器網(wǎng)站文件夾,看看提交的svn是否自動發(fā)布了
配置nginx,讓瀏覽器可以正常訪問
進入nginx配置文件夾:cd /usr/local/nginx/conf/vhost/?(如果你按前面章節(jié)操作,這里已創(chuàng)建了test.conf配置,不然使用80端口會發(fā)生沖突,可以將它刪除:rm -rf test.conf)
創(chuàng)建simple_html.conf配置文件:vi?simple_html.conf?(添加下面代碼)
server?{ ????listen??????80; ????charset?????utf-8; ????root????????/data/www/simple_html; ????server_name?am.zh192.168.0.128; ????????location?/favicon.ico?{?? ????????????????log_not_found?off; ????????access_log?off; ????????}? ????????location?/?{ ????????????????index??Index.html?index.html; ????????} ????access_log??/data/logs/nginx/simple_html.log??main; }
重啟nginx,讓配置生效:/usr/local/nginx/sbin/nginx -s reload
在瀏覽器中輸入:http://192.168.0.128/ 就可以訪問到前端html頁面了,由于接口還沒有部署,所以這里訪問后中間那一塊是空的,按F12也可以發(fā)現(xiàn)接口無法訪問,接下來我們來部署后端接口服務(wù)。
部署后端接口站點
創(chuàng)建svn的相關(guān)步驟與前面的一樣,我們創(chuàng)建一個名叫simple_interface的svn,具體大家自己參考前面內(nèi)容
在創(chuàng)建勾子時,由于接口我們要用到supervisord+uwsgi,所以在勾子里需要添加重啟supervisord服務(wù)的命令,讓發(fā)布的代碼重新生效
vi?post-commit
#!/bin/sh #?POST-COMMIT?HOOK export.UTF-8 /usr/bin/svn?up?--username=py?--password=123456?/data/www/simple_interface /usr/bin/supervisorctl?restart?simple_interface
記得給post-commit賦可執(zhí)行權(quán)限哦
當你在服務(wù)器端檢出simple_interface到/data/www/simple_interface后,接口svn就創(chuàng)建成功了,接下來配置supervisord
輸入命令:vi /etc/supervisord.conf?(之前創(chuàng)建的test配置這里也可以直接刪除)
在supervisord.conf后面添加下面配置
[program:simple_interface] command=/usr/local/bin/uwsgi?/etc/uwsgi/simple_interface.ini directory=/data/www/simple_interface stdout_logfile=/data/logs/supervisord/simple_interface.log socket-timeout=3 autostart=true autorestart=true redirect_stderr=true stopsignal=QUIT
添加uwsgi配置:vi?simple_interface.ini?(如果是正式項目上線,最好使用Python35_plugin.so來運行xml配置,穩(wěn)定性和性能會好很多,前期寫服務(wù)器環(huán)境安裝配置時沒有經(jīng)驗,所以沒有配置成功只能使用ini了)
[uwsgi] socket?=?127.0.0.1:10080 chdir?=?/data/www/simple_interface/ wsgi-file?=?/data/www/simple_interface/main.py limit-as?=?512 reload-on-as?=?256 reload-on-rss?=?192 processes?=?1 max-requests?=?1000 Pythonpath?=?/data/www/simple_interface/ daemonize?=?/data/logs/uwsgi/simple_interface_uwsgi.log log-maxsize?=?10000000 disable-logging?=?true master?=?true vacuum?=?true no-orphans?=?true
supervisord載入添增配置(如果對supervisord.conf修改也需要使用這個命令):/usr/bin/supervisorctl reread
更新到進程管理中:/usr/bin/supervisorctl update?(這個命令會啟動有更改的服務(wù),如果不生效時,也可以使用/usr/bin/supervisorctl reload重啟整個服務(wù),如果更改的只是uwsgi配置文件,可以使用/usr/bin/supervisorctl restart xxx來啟動指定項目)
輸入命令:ps -ef | grep uwsgi?就可以查看到剛剛添加的simple_interface正在運行了
配置后端接口nginx
創(chuàng)建simple_interface.conf配置文件:vi /usr/local/nginx/conf/vhost/simple_interface.conf?(添加下面代碼)
server?{ ????listen??????20080; ????charset?????utf-8; ????root????????/data/www/simple_interface; ????server_name?192.168.0.128; ????????location?/favicon.ico?{?? ????????????????log_not_found?off; ????????????????access_log?off; ????????}? ????????location?/?{ ????????include?uwsgi_params; ????????uwsgi_param?UWSGI_PYHOME?/data/www/simple_interface; ????????uwsgi_param?UWSGI_CHDIR?/data/www/simple_interface; ????????uwsgi_param?UWSGI_SCRIPT?main;?#?對應(yīng)main.py ????????uwsgi_pass??127.0.0.1:10080; ????????proxy_connect_timeout??????2;?#nginx跟后端服務(wù)器連接超時時間(代理連接超時) ????????proxy_send_timeout?????????4;?#后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時) ????????proxy_read_timeout?????????4;?#連接成功后,后端服務(wù)器響應(yīng)時間(代理接收超時) ????} ????access_log??/data/logs/nginx/simple_interface.log??main; }
然后我們按前面步驟將代碼提交到服務(wù)器端,并檢查?/data/www/simple_interface/?目錄是否同步成功
如果沒有問題,我們訪問:http://192.168.0.128:20080/api/about/? 這個獲取公司介紹的接口,會發(fā)現(xiàn)返回 {"msg": "\u67e5\u8be2\u5931\u8d25", "data": {}, "state": -1} (PS:msg內(nèi)容是查詢失敗,它是Unicode編碼,需要使用站長工具進行轉(zhuǎn)換才能看到中文)
這是因為我們還沒有將數(shù)據(jù)庫導入進來,我們先將本地的數(shù)據(jù)庫導出,然后再導入到服務(wù)器里
打開CMD,然后輸入:cd C:\Program Files (x86)\PostgreSQL\9.6\bin\??(這是替換成你自己本地安裝的PostgreSQL數(shù)據(jù)庫的地址,我本地以前安裝的是9.4)
然后輸入命令導出數(shù)據(jù):pg_dump.exe -h localhost -U postgres -p 5432 simple_db > D:/simple_db.sql
運行完命令后,會在D盤根目錄下看到simple_db.sql這個文件,將它上傳到服務(wù)器的/tmp/目錄中
切換數(shù)據(jù)庫賬號:su postgres
登錄postgresql:psql -U postgres
創(chuàng)建數(shù)據(jù)庫simple_db:createdb simple_db
退出postgresql:\q
切回root賬號:su root?(回車后輸入密碼)
導入數(shù)據(jù)庫結(jié)構(gòu)與數(shù)據(jù):psql simple_db < /tmp/simple_db.sql
這時我們再次訪問:http://192.168.0.128:20080/api/about/?就可以看到返回的公司介紹內(nèi)容了,而直接訪問?http://192.168.0.128?會發(fā)現(xiàn)內(nèi)容還是空的,這是因為我們還沒有對前端進行反向代理處理,還需要做下面最后一步操作
編輯前端hmtl的nginx配置:vi /usr/local/nginx/conf/vhost/simple_html.conf? ?(替換成下面配置內(nèi)容)
upstream?myweb?{ ????ip_hash; ????server?127.0.0.1:20080?weight=1?max_fails=5?fail_timeout=5s;? } server?{ ????listen??????80; ????charset?????utf-8; ????root????????/data/www/simple_html; ????server_name?192.168.0.128; ????????location?/favicon.ico?{ ????????????????log_not_found?off; ????????access_log?off; ????????} ????????location?/?{ ????????????????index??Index.html?index.html; ????????} ????location?~*?^/(index|api|upload)/?{ ????????proxy_pass?????????????????http://myweb; ????????proxy_cache_key????????????$host$uri$is_args$args; ????????proxy_set_header???????????Host?$host;? ????????proxy_set_header???????????X-Real-IP?$remote_addr;? ????????proxy_set_header???????????X-Forwarded-For?$proxy_add_x_forwarded_for; ????????proxy_connect_timeout??????3; ????????proxy_send_timeout?????????5; ????????proxy_read_timeout?????????5; ????} ????access_log??/data/logs/nginx/simple_html.log??main; }
PS:添加了反向代理,當訪問以index、api和upload為開頭的url時,就會調(diào)用后端的接口地址了
重啟nginx服務(wù),讓剛剛的配置生效:/usr/local/nginx/sbin/nginx -s reload
現(xiàn)在直接訪問?http://192.168.0.128就可以看到首頁有數(shù)據(jù)了
我們輸入http://192.168.0.128/login.html?想要登錄后臺時,驗證碼會顯示出錯,顯示不了,這是因為我們使用的字體在服務(wù)器上不存在,需要上傳驗證碼圖片和修改驗證碼工具包的地址
將文章后面的包下載下去,static文件夾里有arial.ttf字體,另外還需要修改common文件夾里的verify_helper.py文件,將參數(shù)修改為:font_type='/data/www/simple_interface/static/arial.ttf'? 這是更改為你上傳后字體文件所在的路徑就可以了
按以上步驟只要細心的話應(yīng)該就能正常運行了。
本文對應(yīng)的源碼下載(完整代碼)
python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。