Python 網頁應用程式佈署涉及許多環節,從選擇合適的託管平台到設定伺服器環境,都需要仔細考量。網頁託管服務提供簡便的佈署流程,讓開發者專注於程式碼開發,而自行架設伺服器則提供更高的彈性與控制權。選擇哪種方式取決於專案規模、預算和技術能力。除了佈署,持續整合和伺服器自動化也是提升開發效率和系統穩定性的重要環節。善用 CI 工具可以自動化測試和建置流程,而伺服器自動化工具則可以簡化組態管理和佈署任務,減少人為錯誤。此外,系統監控工具可以幫助開發者即時掌握系統狀態,及時發現並解決潛在問題。

網頁應用程式佈署

網頁應用程式的佈署有兩種主要選擇:使用網頁託管服務(例如,付費給像Heroku、Gondor或PythonAnywhere這樣的供應商來管理伺服器和資料函式庫),或者在虛擬私人伺服器(VPS)主機(如Amazon Web Services或Rackspace)上自行設定基礎設施。我們將簡要介紹這兩種方法。

網頁託管服務

平台即服務(PaaS)是一種雲端運算基礎設施,能夠抽象和管理基礎設施(例如,設定資料函式庫和網頁伺服器,並保持安全補丁更新)、路由和網頁應用程式的擴充套件。使用PaaS時,應用程式開發人員可以專注於編寫應用程式碼,而不必擔心佈署細節。

有多家競爭的PaaS供應商,但以下列出的供應商特別關注Python社群。大多數供應商提供某種免費層級或試用版:

Heroku

Heroku是我們推薦用於佈署Python網頁應用程式的PaaS。它支援Python 2.7-3.5應用程式的所有型別:網頁應用程式、伺服器和框架。提供了一套命令列工具,用於與Heroku帳戶和支援應用程式的實際資料函式庫和網頁伺服器進行介面,因此可以在不使用網頁介面的情況下進行更改。Heroku維護了有關使用Python與Heroku的詳細文章,以及設定第一個應用程式的分步說明。

Gondor

Gondor由一家小公司營運,專注於幫助企業透過Python和Django取得成功。其平台專門用於佈署Django和Pinax應用程式。Gondor的平台是根據Ubuntu 12.04,支援Django 1.4、1.6和1.7,以及部分Python 2和3實作。如果使用local_settings.py進行站點特定的組態資訊,則可以自動組態Django站點。有關更多資訊,請參閱Gondor的佈署Django專案的;也提供了命令列介面工具。

PythonAnywhere

PythonAnywhere支援Django、Flask、Tornado、Pyramid以及其他未描述的許多網頁應用程式框架,如Bottle(無框架,像Flask,但社群規模小得多)和web2py(非常適合教學)。其定價模型與計算時間相關——而不是收費更多,一旦超出每日最大計算時間,計算就會受到限制——這對成本敏感的開發人員來說是很好的。

網頁伺服器

除了Tornado(自帶HTTP伺服器)之外,我們討論的所有網頁應用程式框架都是WSGI應用程式。這意味著它們必須與WSGI伺服器(如PEP 3333中定義的那樣)進行互動,以接收HTTP請求並傳送HTTP回應。

目前,大多數自託管的Python應用程式都使用WSGI伺服器(如Gunicorn)進行託管,可以單獨使用——WSGI伺服器通常可以用作獨立的HTTP伺服器——或者在輕量級網頁伺服器(如Nginx)後面。當兩者一起使用時,WSGI伺服器與Python應用程式互動,而網頁伺服器處理更適合它的任務——靜態檔案服務、請求路由、分散式拒絕服務(DDoS)保護和基本身份驗證。最流行的兩個網頁伺服器是Nginx和Apache,如下所述:

Nginx

Nginx(發音為“engine-x”)是一個網頁伺服器和反向代理,用於HTTP、SMTP和其他協定。它以高效能、相對簡單以及與許多應用程式伺服器(如WSGI伺服器)的相容性而聞名。它還包括諸如負載平衡、基本身份驗證、串流媒體等實用功能。為了服務高負載網站,Nginx正逐漸變得非常流行。

Apache HTTP伺服器

Apache是世界上最流行的HTTP伺服器,但我們更喜歡Nginx。儘管如此,對於佈署新手來說,可能會想從Apache和mod_wsgi開始,這被認為是最容易使用的WSGI介面。每個框架的檔案中都有關於Pyramid、Django和Flask的mod_wsgi教程。

WSGI伺服器

獨立的WSGI伺服器通常比傳統的網頁伺服器佔用更少的資源,並為Python WSGI伺服器提供最佳效能基準。它們也可以與Nginx或Apache一起使用,後者將充當反向代理。最流行的WSGI伺服器是:

Gunicorn(綠色獨角獸)

Gunicorn是我們推薦用於新的Python網頁應用程式的選擇——一個純Python WSGI伺服器,用於服務Python應用程式。與其他Python網頁伺服器不同,它具有周到的使用者介面,並且極其易於使用和組態。Gunicorn具有明智和合理的預設組態。然而,其他一些伺服器,如uWSGI,具有更大的可定製性(但因此更難以有效使用)。

from mako.template import Template
print(Template("hello ${data}!").render(data="world"))

內容解密:

此範例程式碼演示瞭如何使用Mako範本引擎渲染一個簡單的範本。首先,從mako.template模組匯入Template類別,然後建立一個Template例項,將範本字串"hello ${data}!"傳遞給它。${data}是一個佔位符,將被實際資料替換。接著,呼叫render方法並傳入一個名為data的引數,其值為"world"。最後,將渲染結果列印預出來,輸出"hello world!"

此圖示顯示了網頁應用程式佈署的不同元件之間的關係:

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 內容解密:

rectangle "HTTP請求" as node1
rectangle "請求路由" as node2
rectangle "處理請求" as node3
rectangle "傳回回應" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

此圖示展示了從使用者請求到最終傳回回應的整個流程,涉及網頁伺服器、WSGI伺服器和Python應用程式之間的互動。

Python 開發與系統管理工具

在軟體開發過程中,選擇適當的工具對於提高開發效率、確保程式碼品質以及簡化佈署流程至關重要。本篇文章將介紹幾種在 Python 開發與系統管理中常用的工具,包括 WSGI 伺服器、持續整合(CI)工具以及系統管理工具。

WSGI 伺服器

WSGI(Web Server Gateway Interface)是 Python 應用程式與 Web 伺服器之間的介面標準。以下是幾種流行的 WSGI 伺服器:

Waitress

Waitress 是一個純 Python 實作的 WSGI 伺服器,以其可接受的效能而聞名。相較於 Gunicorn,Waitress 提供了一些額外的功能,例如 HTTP 請求緩衝,這使得它在處理慢速客戶端時不會被阻塞。

pip install waitress

uWSGI

uWSGI 是一個完整的託管服務堆積疊,可以用於構建和託管服務。雖然不建議將其作為獨立的 Web 路由器使用,但 uWSGI 可以執行在像 Nginx 或 Apache 這樣的完整 Web 伺服器後面,從而實作動態組態 Python、傳遞環境變數以及進一步調整。

持續整合(CI)工具

持續整合是一種軟體開發實踐,團隊成員頻繁地整合他們的工作,通常每天至少整合一次,每次整合都透過自動化的建置(包括測試)來驗證,以盡快地檢測整合錯誤。

Tox

Tox 是一個自動化工具,用於從命令列或 CI 伺服器上封裝、測試和佈署 Python 軟體。它提供了一個通用的 virtualenv 管理和測試命令列工具,具有以下功能:

  • 檢查軟體套件是否能在不同 Python 版本和直譯器上正確安裝
  • 在每個環境中執行測試,組態您選擇的測試工具
  • 作為 CI 伺服器的前端,減少樣板程式碼並合併 CI 和根據 shell 的測試
pip install tox

Travis-CI

Travis-CI 是一個分散式的 CI 伺服器,為開源專案提供免費的測試建置服務。它與 GitHub 無縫整合,可以在您的 pull 請求上評論是否破壞了建置。

language: python
python:
  - "3.8"
  - "3.9"
  - "3.10"
script: python tests/test_all_of_the_units.py
branches:
  only:
    - main

Jenkins

Jenkins CI 是一個可擴充套件的持續整合引擎,目前是最流行的 CI 引擎。它支援 Windows、Linux 和 OS X,並插入到「現有的每個原始碼管理(SCM)工具」。Jenkins 可以直接使用 java -jar jenkins.war 執行。

Buildbot

Buildbot 是一個 Python 系統,用於自動化編譯/測試週期以驗證程式碼變更。它的工作原理與 Jenkins 相似,會輪詢您的原始碼控制管理器以檢測變更。

系統管理工具

以下是一些用於管理和監控系統的工具,包括伺服器自動化、系統監控和工作流程管理。

使用 Tox 與 CI 工具

Tox 可以與 Travis-CI 和 Jenkins 等 CI 工具結合使用,以自動化測試和建置流程。例如,在 Travis-CI 中,您可以在 .travis.yml 檔案中新增以下內容以使用 Tox:

install:
  - pip install tox
script:
  - tox
內容解密:

本段落主要介紹了幾種在Python開發與系統管理中常用的工具,包括WSGI伺服器、持續整合(CI)工具以及系統管理工具。其中,Waitress和uWSGI是兩種流行的WSGI伺服器;Tox、Travis-CI、Jenkins和Buildbot是常用的CI工具;Tox也可以與CI工具結合使用,以自動化測試和建置流程。這些工具可以幫助開發者簡化工作流程,提高工作效率,並確保程式碼品質。

伺服器自動化工具比較與實務應用

伺服器自動化是現代DevOps流程中的關鍵環節,透過自動化工具能夠有效提升系統管理員的工作效率。常見的伺服器自動工具有Salt、Ansible、Puppet、Chef和CFEngine等,它們各自具有不同的特點和優勢。

為何需要伺服器自動化

在現代化的IT基礎設施中,伺服器的數量往往龐大且複雜,人工管理不僅耗時耗力,還容易出錯。伺服器自動化工具可以幫助管理員輕鬆地在多台實體或虛擬機器上佈署和管理組態,大幅提升維運效率。

Salt:高效能的自動化方案

Salt是一款以高效能為設計核心的自動化工具,其主節點稱為master,而代理節點則被稱為minions。Salt預設使用ZeroMQ進行網路通訊,並支援TCP連線,同時也提供了自有的傳輸協定RAET,以實作更快速的資料傳輸。

安裝與基本使用

Salt支援Python 2.6和2.7版本,可透過pip安裝:

$ pip install salt

安裝完成後,需要設定主伺服器和代理節點。設定完成後,可以執行任意的Shell命令或使用預建的模組來管理代理節點。例如,列出所有可用的代理節點:

$ salt '*' test.ping

狀態管理

Salt提供了狀態系統,可以用來組態代理節點。例如,以下狀態檔案將安裝並啟動Apache伺服器:

apache:
  pkg:
    - installed
  service:
    - running
    - enable: True
    - require:
      - pkg: apache

狀態檔案可以使用YAML格式,並結合Jinja2範本系統,或直接使用Python模組撰寫。

Ansible:無需代理的自動化選擇

Ansible的最大優勢在於其不需要在客戶端機器上永久安裝任何代理程式(除了Python之外)。這使得Ansible在許多場景下更為靈活和方便。

安裝與基本使用

Ansible同樣支援Python 2.6和2.7版本,可透過pip安裝:

$ pip install ansible

Ansible需要一個inventory檔案來描述其可存取的主機。例如,一個簡單的inventory檔案(hosts.yml)如下:

[server_name]
127.0.0.1

而一個簡單的playbook(ping.yml)則如下:

---
- hosts: all
  tasks:
    - name: ping
      action: ping

執行該playbook:

$ ansible-playbook ping.yml -i hosts.yml --ask-pass

選擇性執行

Ansible允許使用者選擇性地對特定群組的伺服器執行任務,這大大增強了其靈活性。

Puppet:強大的組態管理工具

Puppet使用Ruby語言開發,並提供了自己的組態語言PuppetScript。它透過一個指定的伺服器(Puppet Master)來協調其代理節點(Agent nodes)。

基本架構

Puppet的基本架構包括Puppet Master和Agent nodes。Agent nodes會向Puppet Master回報基本的系統資訊,然後由Puppet Master編譯出每個節點的組態目錄,並傳送給對應的Agent執行。

Facter:系統資訊收集工具

Puppet附帶了一個名為Facter的工具,用於收集系統的基本資訊。這些資訊可以在撰寫Puppet模組時作為變數參考。

編寫模組

編寫Puppet模組相對直觀,使用.pp檔案來定義模組。例如,一個簡單的"Hello World"範例:

notify { 'Hello World, this message is getting logged into the agent node':
  # 預設情況下,資源標題即為通知訊息
}
內容解密:

此章節主要介紹了多種伺服器自動化工具的基本原理、安裝方法及使用場景。這些工具在現代化的IT維運中扮演著重要角色,能夠顯著提升管理效率並減少錯誤。讀者可以根據自身需求選擇適合的工具,以最佳化自己的維運流程。

自動化工具選型考量

在選擇伺服器自動化工具時,需要考慮多個因素,包括但不限於工具的學習曲線、社群支援、與現有系統的相容性等。

學習曲線

不同的工具有不同的學習曲線。例如,Ansible的YAML語法相對簡單易學,而Puppet則需要學習其特定的PuppetScript語言。

社群支援

一個活躍的社群可以提供豐富的資源和支援。例如,Puppet Forge提供了大量的預建模組,可以直接用於各種常見任務。

相容性

確保所選工具與現有的系統和技術堆疊相容是非常重要的。例如,某些工具可能對特定的作業系統或Python版本有依賴。

內容解密:

本章節討論了選擇伺服器自動化工具時需要考慮的關鍵因素,包括學習曲線、社群支援和相容性等。同時,也對未來自動化工具的發展趨勢進行了展望,預計會有更多智慧化和整合AI技術的工具出現,以滿足不斷變化的維運需求。

自動化組態管理與系統監控工具

在現代IT基礎設施管理中,自動化組態管理和系統監控是確保系統穩定性和高效運作的關鍵。本文將介紹幾種流行的自動化工具,包括Puppet、Chef、CFEngine,以及用於系統監控的Psutil和Fabric。

Puppet:簡化組態管理

Puppet是一種流行的組態管理工具,它允許管理員定義和維護基礎設施的期望狀態。Puppet使用自定義的宣告式語言來描述系統組態,並自動將系統調整到期望狀態。

Puppet程式碼範例

以下Puppet程式碼範例確保OpenSSH-Server套件已安裝,並且當sshd組態檔案更改時,sshd服務會重新啟動:

package { 'openssh-server':
  ensure => installed,
}

file { '/etc/ssh/sshd_config':
  source => 'puppet:///modules/sshd/sshd_config',
  owner => 'root',
  group => 'root',
  mode => '640',
  notify => Service['sshd'], 
  require => Package['openssh-server'],
}

service { 'sshd':
  ensure => running,
  enable => true,
  hasstatus => true,
  hasrestart=> true,
}

內容解密:

  1. package { 'openssh-server': ensure => installed, }: 確保OpenSSH-Server套件已安裝在系統上。
  2. file { '/etc/ssh/sshd_config': ... }: 管理sshd組態檔案。如果檔案更改,則通知sshd服務重新啟動。
  3. service { 'sshd': ... }: 確保sshd服務正在執行,並且在系統啟動時自動啟動。

Chef:靈活的組態管理

Chef是另一種流行的組態管理工具,它使用Ruby語言編寫「食譜」(recipes)來定義基礎設施的組態。Chef提供了高度的靈活性,但需要更多的自定義工作。

Chef基本操作

使用knife命令建立一個簡單的cookbook:

$ knife cookbook create cookbook_name

CFEngine:輕量級組態管理

CFEngine是一種輕量級的組態管理工具,以其小巧的足跡和對故障的強壯性而聞名。它使用C語言編寫,並採用分散式架構。

系統監控工具

Psutil:跨平台系統監控

Psutil是一個跨平台的Python函式庫,用於檢索系統資訊,如CPU、記憶體、磁碟、網路和程式等。

Psutil程式碼範例

以下Python指令碼使用Psutil監控伺服器負載,如果負載過高,則傳送電子郵件警示:

from psutil import cpu_percent, net_io_counters
from time import sleep
import smtplib
import string

MAX_NET_USAGE = 400000
MAX_ATTACKS = 4
attack = 0
counter = 0

while attack <= MAX_ATTACKS:
    sleep(4)
    counter += 1
    
    # 檢查CPU使用率
    if cpu_percent(interval=1) > 70:
        attack += 1
    
    # 檢查網路使用率
    neti1, neto1 = net_io_counters()[1], net_io_counters()[0]
    sleep(1)
    neti2, neto2 = net_io_counters()[1], net_io_counters()[0]
    net = ((neti2+neto2) - (neti1+neto1))/2
    if net > MAX_NET_USAGE:
        attack += 1
    
    if counter > 25:
        attack = 0
        counter = 0
    
    # 傳送電子郵件警示
    if attack > MAX_ATTACKS:
        TO = "you@your_email.com"
        FROM = "webmaster@your_domain.com"
        SUBJECT = "Your domain is out of system resources!"
        text = "Go and fix your server!"
        BODY = string.join(("From: %s" % FROM, "To: %s" % TO, "Subject: %s" % SUBJECT, "", text), "\r\n")
        server = smtplib.SMTP('127.0.0.1')
        server.sendmail(FROM, [TO], BODY)
        server.quit()

內容解密:

  1. cpu_percent(interval=1): 取得CPU使用率,間隔1秒。
  2. net_io_counters(): 取得網路I/O統計資訊,用於計算網路使用率。
  3. smtplib.SMTP('127.0.0.1'): 傳送電子郵件警示給管理員。

Fabric:簡化系統管理任務

Fabric是一個Python函式庫,用於簡化系統管理任務,如在多台主機上執行命令。

Fabric程式碼範例

以下Fabric任務定義了兩個函式:memory_usagedeploy,分別用於檢查記憶體使用情況和佈署應用程式:

from fabric.api import cd, env, prefix, run, task

env.hosts = ['my_server1', 'my_server2']

@task
def memory_usage():
    run('free -m')

@task
def deploy():
    with cd('/var/www/project-env/project'):
        with prefix('. ../bin/activate'):
            run('git pull')
            run('touch app.wsgi')

內容解密:

  1. env.hosts = ['my_server1', 'my_server2']: 指定要連線的主機列表。
  2. @task: 定義一個Fabric任務,可以透過fab命令執行。
  3. run('free -m'): 在遠端主機上執行命令,檢查記憶體使用情況。
  4. with cd()with prefix(): 在特定目錄下執行命令,並啟用虛擬環境。

這些工具和技術能夠幫助系統管理員簡化日常任務,提高工作效率,並確保系統的穩定執行。