中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

部署Python的框架下的web app的詳細教程
來源:易賢網 閱讀:3951 次 日期:2015-05-04 09:40:23
溫馨提示:易賢網小編為您整理了“部署Python的框架下的web app的詳細教程”,方便廣大網友查閱!

這篇文章主要介紹了Python部署web app的詳細教程,示例代碼基于Python2.x版本,需要的朋友可以參考下

作為一個合格的開發者,在本地環境下完成開發還遠遠不夠,我們需要把Web App部署到遠程服務器上,這樣,廣大用戶才能訪問到網站。

很多做開發的同學把部署這件事情看成是運維同學的工作,這種看法是完全錯誤的。首先,最近流行DevOps理念,就是說,開發和運維要變成一個整體。其次,運維的難度,其實跟開發質量有很大的關系。代碼寫得垃圾,運維再好也架不住天天掛掉。最后,DevOps理念需要把運維、監控等功能融入到開發中。你想服務器升級時不中斷用戶服務?那就得在開發時考慮到這一點。

下面,我們就來把awesome-python-webapp部署到Linux服務器。

搭建Linux服務器

要部署到Linux,首先得有一臺Linux服務器。要在公網上體驗的同學,可以在Amazon的AWS申請一臺EC2虛擬機(免費使用1年),或者使用國內的一些云服務器,一般都提供Ubuntu Server的鏡像。想在本地部署的同學,請安裝虛擬機,推薦使用VirtualBox。

我們選擇的Linux服務器版本是Ubuntu Server 12.04 LTS,原因是apt太簡單了。如果你準備使用其他Linux版本,也沒有問題。

Linux安裝完成后,請確保ssh服務正在運行,否則,需要通過apt安裝:

$ sudo apt-get install openssh-server

有了ssh服務,就可以從本地連接到服務器上。建議把公鑰復制到服務器端用戶的.ssh/authorized_keys中,這樣,就可以通過證書實現無密碼連接。

部署方式

在本地開發時,我們可以用Python自帶的WSGI服務器,但是,在服務器上,顯然不能用自帶的這個開發版服務器。可以選擇的WSGI服務器很多,我們選gunicorn:它用類似Nginx的Master-Worker模式,同時可以提供gevent的支持,不用修改代碼,就能獲得極高的性能。

此外,我們還需要一個高性能Web服務器,這里選擇Nginx,它可以處理靜態資源,同時作為反向代理把動態請求交給gunicorn處理。gunicorn負責調用我們的Python代碼,這個模型如下:

名單

2015430121016418.png (487×128)

Nginx負責分發請求:

名單1

2015430121039437.png (457×265)

在服務器端,我們需要定義好部署的目錄結構:

代碼如下:

/

+- srv/

+- awesome/ <-- Web App根目錄

+- www/ <-- 存放Python源碼

| +- static/ <-- 存放靜態資源文件

+- log/ <-- 存放log

在服務器上部署,要考慮到新版本如果運行不正常,需要回退到舊版本時怎么辦。每次用新的代碼覆蓋掉舊的文件是不行的,需要一個類似版本控制的機制。由于Linux系統提供了軟鏈接功能,所以,我們把www作為一個軟鏈接,它指向哪個目錄,哪個目錄就是當前運行的版本:

名單2

2015430121102755.png (640×522)

而Nginx和gunicorn的配置文件只需要指向www目錄即可。

Nginx可以作為服務進程直接啟動,但gunicorn還不行,所以,Supervisor登場!Supervisor是一個管理進程的工具,可以隨系統啟動而啟動服務,它還時刻監控服務進程,如果服務進程意外退出,Supervisor可以自動重啟服務。

總結一下我們需要用到的服務有:

Nginx:高性能Web服務器+負責反向代理;

gunicorn:高性能WSGI服務器;

gevent:把Python同步代碼變成異步協程的庫;

Supervisor:監控服務進程的工具;

MySQL:數據庫服務。

在Linux服務器上用apt可以直接安裝上述服務:

$ sudo apt-get install nginx gunicorn python-gevent supervisor mysql-server

然后,再把我們自己的Web App用到的Python庫安裝了:

$ sudo apt-get install python-jinja2 python-mysql.connector

在服務器上創建目錄/srv/awesome/以及相應的子目錄。

在服務器上初始化MySQL數據庫,把數據庫初始化腳本schema.sql復制到服務器上執行:

$ mysql -u root -p < schema.sql

服務器端準備就緒。

部署

用FTP還是SCP還是rsync復制文件?如果你需要手動復制,用一次兩次還行,一天如果部署50次不但慢、效率低,而且容易出錯。

正確的部署方式是使用工具配合腳本完成自動化部署。Fabric就是一個自動化部署工具。由于Fabric是用Python開發的,所以,部署腳本也是用Python來編寫,非常方便!

要用Fabric部署,需要在本機(是開發機器,不是Linux服務器)安裝Fabric:

$ easy_install fabric

Linux服務器上不需要安裝Fabric,Fabric使用SSH直接登錄服務器并執行部署命令。

下一步是編寫部署腳本。Fabric的部署腳本叫fabfile.py,我們把它放到awesome-python-webapp的目錄下,與www目錄平級:

代碼如下:

awesome-python-webapp/

+- fabfile.py

+- www/

+- ...

Fabric的腳本編寫很簡單,首先導入Fabric的API,設置部署時的變量:

# fabfile.py

import os, re

from datetime import datetime

# 導入Fabric API:

from fabric.api import *

# 服務器登錄用戶名:

env.user = 'michael'

# sudo用戶為root:

env.sudo_user = 'root'

# 服務器地址,可以有多個,依次部署:

env.hosts = ['192.168.0.3']

# 服務器MySQL用戶名和口令:

db_user = 'www-data'

db_password = 'www-data'

然后,每個Python函數都是一個任務。我們先編寫一個打包的任務:

_TAR_FILE = 'dist-awesome.tar.gz'

def build():

includes = ['static', 'templates', 'transwarp', 'favicon.ico', '*.py']

excludes = ['test', '.*', '*.pyc', '*.pyo']

local('rm -f dist/%s' % _TAR_FILE)

with lcd(os.path.join(os.path.abspath('.'), 'www')):

cmd = ['tar', '--dereference', '-czvf', '../dist/%s' % _TAR_FILE]

cmd.extend(['--exclude='%s'' % ex for ex in excludes])

cmd.extend(includes)

local(' '.join(cmd))

Fabric提供local('...')來運行本地命令,with lcd(path)可以把當前命令的目錄設定為lcd()指定的目錄,注意Fabric只能運行命令行命令,Windows下可能需要Cgywin環境。

在awesome-python-webapp目錄下運行:

$ fab build

看看是否在dist目錄下創建了dist-awesome.tar.gz的文件。

打包后,我們就可以繼續編寫deploy任務,把打包文件上傳至服務器,解壓,重置www軟鏈接,重啟相關服務:

_REMOTE_TMP_TAR = '/tmp/%s' % _TAR_FILE

_REMOTE_BASE_DIR = '/srv/awesome'

def deploy():

newdir = 'www-%s' % datetime.now().strftime('%y-%m-%d_%H.%M.%S')

# 刪除已有的tar文件:

run('rm -f %s' % _REMOTE_TMP_TAR)

# 上傳新的tar文件:

put('dist/%s' % _TAR_FILE, _REMOTE_TMP_TAR)

# 創建新目錄:

with cd(_REMOTE_BASE_DIR):

sudo('mkdir %s' % newdir)

# 解壓到新目錄:

with cd('%s/%s' % (_REMOTE_BASE_DIR, newdir)):

sudo('tar -xzvf %s' % _REMOTE_TMP_TAR)

# 重置軟鏈接:

with cd(_REMOTE_BASE_DIR):

sudo('rm -f www')

sudo('ln -s %s www' % newdir)

sudo('chown www-data:www-data www')

sudo('chown -R www-data:www-data %s' % newdir)

# 重啟Python服務和nginx服務器:

with settings(warn_only=True):

sudo('supervisorctl stop awesome')

sudo('supervisorctl start awesome')

sudo('/etc/init.d/nginx reload')

注意run()函數執行的命令是在服務器上運行,with cd(path)和with lcd(path)類似,把當前目錄在服務器端設置為cd()指定的目錄。如果一個命令需要sudo權限,就不能用run(),而是用sudo()來執行。

配置Supervisor

上面讓Supervisor重啟gunicorn的命令會失敗,因為我們還沒有配置Supervisor呢。

編寫一個Supervisor的配置文件awesome.conf,存放到/etc/supervisor/conf.d/目錄下:

代碼如下:

[program:awesome]

command = /usr/bin/gunicorn --bind 127.0.0.1:9000 --workers 1 --worker-class gevent wsgiapp:application

directory = /srv/awesome/www

user = www-data

startsecs = 3

redirect_stderr = true

stdout_logfile_maxbytes = 50MB

stdout_logfile_backups = 10

stdout_logfile = /srv/awesome/log/app.log

配置文件通過[program:awesome]指定服務名為awesome,command指定啟動gunicorn的命令行,設定gunicorn的啟動端口為9000,WSGI處理函數入口為wsgiapp:application。

然后重啟Supervisor后,就可以隨時啟動和停止Supervisor管理的服務了:

$ sudo supervisorctl reload

$ sudo supervisorctl start awesome

$ sudo supervisorctl status

awesome RUNNING pid 1401, uptime 5:01:34

配置Nginx

Supervisor只負責運行gunicorn,我們還需要配置Nginx。把配置文件awesome放到/etc/nginx/sites-available/目錄下:

server {

listen 80; # 監聽80端口

root /srv/awesome/www;

access_log /srv/awesome/log/access_log;

error_log /srv/awesome/log/error_log;

# server_name awesome.liaoxuefeng.com; # 配置域名

# 處理靜態文件/favicon.ico:

location /favicon.ico {

root /srv/awesome/www;

}

# 處理靜態資源:

location ~ ^/static/.*$ {

root /srv/awesome/www;

}

# 動態請求轉發到9000端口(gunicorn):

location / {

proxy_pass ;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

然后在/etc/nginx/sites-enabled/目錄下創建軟鏈接:

$ pwd

/etc/nginx/sites-enabled

$ sudo ln -s /etc/nginx/sites-available/awesome .

讓Nginx重新加載配置文件,不出意外,我們的awesome-python-webapp應該正常運行:

$ sudo /etc/init.d/nginx reload

如果有任何錯誤,都可以在/srv/awesome/log下查找Nginx和App本身的log。如果Supervisor啟動時報錯,可以在/var/log/supervisor下查看Supervisor的log。

如果一切順利,你可以在瀏覽器中訪問Linux服務器上的awesome-python-webapp了:

名單3

2015430121102755.png (640×522)

如果在開發環境更新了代碼,只需要在命令行執行:

$ fab build

$ fab deploy

自動部署完成!刷新瀏覽器就可以看到服務器代碼更新后的效果。

更多信息請查看IT技術專欄

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产女优一区| 欧美日本免费一区二区三区| 一区二区欧美精品| 欧美一区二区三区另类| 久久综合一区二区| 国产精品视频免费一区| 亚洲精品视频免费| 欧美亚洲日本网站| 欧美日韩裸体免费视频| 伊人狠狠色丁香综合尤物| 亚洲午夜成aⅴ人片| 牛夜精品久久久久久久99黑人| 狼人社综合社区| 国产自产在线视频一区| 亚洲精品少妇30p| 欧美一进一出视频| 销魂美女一区二区三区视频在线| 欧美精品v日韩精品v国产精品| 国产丝袜一区二区| 亚洲午夜精品福利| 欧美激情精品久久久六区热门| 国产亚洲欧美一区在线观看| 亚洲综合第一页| 免费在线视频一区| 黄色在线一区| 久久精品视频va| 国产三级欧美三级| 亚洲免费婷婷| 国产精品扒开腿爽爽爽视频| 亚洲毛片在线看| 欧美黄网免费在线观看| 影音先锋久久精品| 久久av红桃一区二区小说| 国产一区深夜福利| 欧美国产精品一区| 久久久精品999| 亚洲视频免费| 欧美精品国产精品日韩精品| 久久久99爱| 国产精品99久久不卡二区| 伊甸园精品99久久久久久| 1769国内精品视频在线播放| 韩日视频一区| 狠狠色狠色综合曰曰| 国产精品主播| 久久福利资源站| 国产一区二区三区四区五区美女 | 欧美另类专区| 亚洲精品免费网站| 欧美国产日本在线| 狠狠色丁香婷综合久久| 老司机aⅴ在线精品导航| 亚洲国产黄色| 欧美日韩国产a| 亚洲一区欧美二区| 欧美午夜激情小视频| 免费一级欧美片在线观看| 欧美日韩一区国产| 国产精品一区二区三区免费观看| 欧美一级在线播放| 一本色道久久88亚洲综合88| 亚洲福利视频专区| 久久精品国产久精国产思思| 正在播放亚洲| 久久亚洲精品一区二区| 怡红院精品视频| 欧美精品一区二区三区四区| 一区二区黄色| 国产精品多人| 久久午夜电影网| 亚洲区一区二区三区| 欧美成人免费小视频| 一区二区高清视频| 欧美人与性动交cc0o| 亚洲欧美日韩成人高清在线一区| 国产欧美精品日韩精品| 六月丁香综合| 亚洲欧美亚洲| 国产亚洲欧美日韩一区二区| 亚洲精品社区| 欧美激情四色 | 欧美精品播放| 国产精品久久久久永久免费观看| 欧美在线free| 亚洲国产日韩在线一区模特| 欧美视频日韩视频在线观看| 久久国产天堂福利天堂| 亚洲精华国产欧美| 国产欧美一区二区在线观看| 欧美 日韩 国产在线| 亚洲日本理论电影| 欧美日韩国产成人在线| 亚洲理论在线| 国产亚洲精品美女| 中文久久乱码一区二区| 男女精品网站| 久久三级视频| 久久精品国产第一区二区三区最新章节| 国产精品一区二区三区四区| 六月婷婷一区| 久久这里只有精品视频首页| 欧美黄色一级视频| 国产精品美女www爽爽爽视频 | 久久国产精品网站| 日韩午夜在线观看视频| 亚洲午夜av电影| 欧美福利视频网站| 亚洲欧美日韩国产中文在线| 久久亚洲综合| 国产精品网站在线观看| 欧美二区视频| 国内精品视频久久| 欧美1区免费| 欧美破处大片在线视频| 男同欧美伦乱| 国产精品视频大全| 很黄很黄激情成人| 午夜精品久久久久久久99樱桃| 欧美成人精品不卡视频在线观看| 国产精品美女久久福利网站| av成人免费| 欧美精品国产| 亚洲精品少妇网址| 蜜臀av在线播放一区二区三区| 国产日韩一区二区三区在线| 亚洲一区二区三区四区在线观看| 欧美日韩免费高清一区色橹橹| 亚洲成色最大综合在线| 久久精品国亚洲| 国产一区视频网站| 久久av一区二区| 国产午夜精品视频| 久久精品观看| 影音先锋亚洲视频| 久久美女艺术照精彩视频福利播放| 国产欧美一级| 欧美制服丝袜第一页| 欧美视频网址| 99国产精品视频免费观看| 免费成人性网站| 亚洲国产精品久久久| 欧美aⅴ一区二区三区视频| 激情亚洲成人| 久久资源av| 亚洲精品一区二区在线观看| 欧美激情第3页| 亚洲视频一区二区| 国产美女一区二区| 欧美一区二区在线观看| 国产一区二区你懂的| 久久久噜噜噜久久中文字幕色伊伊 | 国产亚洲精久久久久久| 亚洲一区中文| 国产精品二区二区三区| 欧美一区二区三区免费看| 国产综合第一页| 欧美在线亚洲综合一区| 国产日韩欧美自拍| 久久青草欧美一区二区三区| 亚洲人成在线观看| 欧美日韩少妇| 久久精品国亚洲| 最新日韩在线视频| 欧美日韩欧美一区二区| 亚洲欧美成人一区二区三区| 国产一级一区二区| 免费看黄裸体一级大秀欧美| 亚洲精品麻豆| 国产老女人精品毛片久久| 久久久久国产免费免费| 亚洲国产婷婷香蕉久久久久久| 欧美日韩另类国产亚洲欧美一级| 亚洲欧美三级在线| 亚洲激情欧美激情| 国产精品网曝门| 欧美成人日韩| 欧美一区二区在线免费观看| 亚洲国产成人av在线| 国产精品日韩在线观看| 美女免费视频一区| 国自产拍偷拍福利精品免费一| 欧美精品一级| 在线亚洲一区| 在线成人av| 久久综合中文字幕| 亚洲另类自拍| 国产视频在线观看一区| 久久人人爽国产| 国产精品久久久久久久9999| 亚洲国产经典视频| 国产午夜精品麻豆| 欧美日本国产视频| 国产欧美日韩一区二区三区在线观看 | 欧美一级片久久久久久久| 亚洲国产日韩欧美| 欧美性猛交xxxx乱大交退制版 | 欧美视频观看一区| 国内久久婷婷综合| 美女久久网站| 亚洲国产cao|