我的第一個python web開發架構(20)——產品發布(部署到伺服器),python產品發布
首先按上一章節所講述的,將伺服器環境安裝好以後,接下來就是按步驟將網站部署到伺服器上了。
我們的網站是前後端分離的,所以需要部署兩個網站。首先來發布前端網站。
部署前端網站
輸入命令進入svn管理檔案夾:cd /data/svn/
建立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 (將設定檔裡的內容對著下面參數進行修改)
anon-access = noneauth-access = writepassword-db = passwdauthz-db = authz
進入勾子檔案夾:cd /data/svn/simple_html/hooks/
添加勾子檔案:vi post-commit (添加下面代碼,用於svn提交代碼成功後,自動將代碼發布出去)
#!/bin/sh# POST-COMMIT HOOKexport LANG=en_US.UTF-8/usr/bin/svn up --username=py --password=123456 /data/www/simple_html
給勾子賦可執行許可權:chmod +x post-commit (可有賦了可執行許可權後,勾子才會被執行)
建立前端網站發布檔案夾:mkdir /data/www/simple_html
檢出svn到新建立的網站發布檔案夾:svn checkout svn://localhost/simple_html /data/www/simple_html/ (輸入前面建立的帳號:py和密碼123456,提示Store password unencrypted (yes/no) 時輸入y就可以了。如果運行後出現svn: E000013 xxx Permission denied錯誤,有可能是你剛剛修改的svn配置沒有生效,重啟一下svn就可以了)
在本地電腦安裝個svn用戶端(我用的是TortoiseSVN-1.9.4.27285-x64-svn-1.9.4.msi),將剛建立的svn檢出到本地
將前端html代碼複製到剛檢出的檔案夾裡,提交到伺服器端
檢查伺服器網站檔案夾,看看提交的svn是否自動發布了
配置nginx,讓瀏覽器可以正常訪問
進入nginx設定檔夾:cd /usr/local/nginx/conf/vhost/ (如果你按前面章節操作,這裡已建立了test.conf配置,不然使用80連接埠會發生衝突,可以將它刪除:rm -rf test.conf)
建立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也可以發現介面無法訪問,接下來我們來部署後端介面服務。
部署後端介面網站
建立svn的相關步驟與前面的一樣,我們建立一個名叫simple_interface的svn,具體大家自己參考前面內容
在建立勾子時,由於介面我們要用到supervisord+uwsgi,所以在勾子裡需要添加重啟supervisord服務的命令,讓發布的代碼重新生效
vi post-commit
#!/bin/sh# POST-COMMIT HOOKexport LANG=en_US.UTF-8/usr/bin/svn up --username=py --password=123456 /data/www/simple_interface/usr/bin/supervisorctl restart simple_interface
記得給post-commit賦可執行許可權哦
當你在伺服器端檢出simple_interface到/data/www/simple_interface後,介面svn就建立成功了,接下來配置supervisord
輸入命令:vi /etc/supervisord.conf (之前建立的test配置這裡也可以直接刪除)
在supervisord.conf後面添加下面配置
[program:simple_interface]command=/usr/local/bin/uwsgi /etc/uwsgi/simple_interface.inidirectory=/data/www/simple_interfacestdout_logfile=/data/logs/supervisord/simple_interface.logsocket-timeout=3autostart=trueautorestart=trueredirect_stderr=truestopsignal=QUIT
添加uwsgi配置:vi simple_interface.ini (如果是正式項目上線,最好使用python35_plugin.so來運行xml配置,穩定性和效能會好很多,前期寫伺服器環境安裝配置時沒有經驗,所以沒有配置成功只能使用ini了)
[uwsgi]socket = 127.0.0.1:10080chdir = /data/www/simple_interface/wsgi-file = /data/www/simple_interface/main.pylimit-as = 512reload-on-as = 256reload-on-rss = 192processes = 1max-requests = 1000pythonpath = /data/www/simple_interface/daemonize = /data/logs/uwsgi/simple_interface_uwsgi.loglog-maxsize = 10000000disable-logging = truemaster = truevacuum = trueno-orphans = true
supervisord載入添增配置(如果對supervisord.conf修改也需要使用這個命令):/usr/bin/supervisorctl reread
更新到進程管理中:/usr/bin/supervisorctl update (這個命令會啟動有更改的服務,如果不生效時,也可以使用/usr/bin/supervisorctl reload重啟整個服務,如果更改的只是uwsgi設定檔,可以使用/usr/bin/supervisorctl restart xxx來啟動指定項目)
輸入命令:ps -ef | grep uwsgi 就可以查看到剛剛添加的simple_interface正在運行了
配置後端介面nginx
建立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; # 對應main.py uwsgi_pass 127.0.0.1:10080; proxy_connect_timeout 2; #nginx跟後端伺服器連線逾時時間(代理連線逾時) proxy_send_timeout 4; #後端伺服器資料回傳時間(代理髮送逾時) proxy_read_timeout 4; #串連成功後,後端伺服器回應時間(代理接收逾時) } access_log /data/logs/nginx/simple_interface.log main;}
然後我們按前面步驟將代碼提交到伺服器端,並檢查 /data/www/simple_interface/ 目錄是否同步成功
如果沒有問題,我們訪問:http://192.168.0.128:20080/api/about/ 這個擷取公司介紹的介面,會發現返回 {"msg": "\u67e5\u8be2\u5931\u8d25", "data": {}, "state": -1} (PS:msg內容是查詢失敗,它是Unicode編碼,需要使用站長工具進行轉換才能看到中文)
這是因為我們還沒有將資料庫匯入進來,我們先將本地的資料庫匯出,然後再匯入到伺服器裡
開啟CMD,然後輸入:cd C:\Program Files (x86)\PostgreSQL\9.6\bin\ (這是替換成你自己本地安裝的PostgreSQL資料庫的地址,我本地以前安裝的是9.4)
然後輸入命令匯出資料:pg_dump.exe -h localhost -U postgres -p 5432 simple_db > D:/simple_db.sql
運行完命令後,會在D盤根目錄下看到simple_db.sql這個檔案,將它上傳到伺服器的/tmp/目錄中
切換資料庫帳號:su postgres
登入postgresql:psql -U postgres
建立資料庫simple_db:createdb simple_db
退出postgresql:\q
切回root帳號:su root (斷行符號後輸入密碼)
匯入資料庫結構與資料:psql simple_db < /tmp/simple_db.sql
這時我們再次訪問:http://192.168.0.128:20080/api/about/ 就可以看到返回的公司介紹內容了,而直接存取 http://192.168.0.128 會發現內容還是空的,這是因為我們還沒有對前端進行反向 Proxy處理,還需要做下面最後一步操作
編輯前端hmtl的nginx配置:vi /usr/local/nginx/conf/vhost/simple_html.conf (替換成下面配置內容)
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:添加了反向 Proxy,當訪問以index、api和upload為開頭的url時,就會調用後端的介面地址了
重啟nginx服務,讓剛剛的配置生效:/usr/local/nginx/sbin/nginx -s reload
現在直接存取 http://192.168.0.128就可以看到首頁有資料了
我們輸入http://192.168.0.128/login.html 想要登入後台時,驗證碼會顯示出錯,顯示不了,這是因為我們使用的字型在伺服器上不存在,需要上傳驗證碼圖片和修改驗證碼工具包的地址
將文章後面的包下載下去,static檔案夾裡有arial.ttf字型,另外還需要修改common檔案夾裡的verify_helper.py檔案,將參數修改為:font_type='/data/www/simple_interface/static/arial.ttf' 這是更改為你上傳後字型檔所在的路徑就可以了
按以上步驟只要細心的話應該就能正常運行了。
本文對應的源碼下載(完整代碼)
著作權聲明:本文原創發表於 部落格園,作者為 AllEmpty 本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則視為侵權。
python開發QQ群:669058475 作者部落格:http://www.cnblogs.com/EmptyFS/