❶ 用python做web開發,tornado 如何部署,都是用nginx+supervisor嗎
因為Tornado是非同步的網路框架,性能夠好,可以直接放在最外層,但是為了避免阻塞問題,會開多個進程,然後使用 Nginx 做反向代理實現負載均衡。具體可以看這篇文章 Introction to Tornado 中文翻譯。
那麼這里就涉及到要開多個Tornado進程的問題,使用Supervisor來做這件事是最簡單的。Supervisor 的使用方法可以看這篇文章 Python 進程管理工具 Supervisor 使用教程
另外,如果你需要部署Django或者 Flask,則推薦 Nginx+Gunicorn+Supervisor
Nginx放在最外層,然後使用Supervisor做進程管理,使用Gunicorn啟動Django或者Flask,相較於uwsgi 的方法,簡單很多,而且Gunicorn可以讓你使用Gevent和Tornado來為你的後端實現非同步訪問,性能直接飆升。
❷ linux下python和webpy怎麼搭建
基於python的web開發,這里我們使用linux為開發環境,搭建基於nginx + web.py + fastcgi
有些基本基本概念解釋下,哈哈,因為我不懂
1.wsgi為Web伺服器網關介面(Python Web Server Gateway Interface,縮寫為WSGI)是是為Python語言定義的Web伺服器和Web應用程序或框架之間的一種簡單而通用的介面。自從WSGI被開發出來以後,許多其它語言中也出現了類似介面
2.uwsgi,另一種python定義的web伺服器和web應用的介面
3.REST服務,REST(Representational State Transfer表述性狀態轉移)是一種針對網路應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。
4.CRUD是指在做計算處理時的增加(Create)、查詢(Retrieve)(重新得到數據)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。主要被用在描述軟體系統中資料庫或者持久層的基本操作功能
以下內容主要來自
http://webpy.org/cookbook/fastcgi-nginx
需要的軟體
nginx 0.7以上版本,我使用的是nginx 0.9.2
webpy我使用的web.py-0.37
spawn-fcgi 1.6.3
flup 1.0
nginx的配置請參看官方文檔
spawn-fcgi是lighttpd的一個子項目用於多進程管理
webpy和flup安裝方式為解壓後運行python setup.py install
安裝編寫index.py
點擊(此處)折疊或打開
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import web
urls = ("/.*", "hello")
app = web.application(urls, globals())
class hello:
def GET(self):
return 'Hello, world!'
if __name__ == "__main__":
web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)
app.run()
注意index.py需要使用命令chmod +x index.py加入可執行許可權
將index.py放入/data/www(我所使用的目錄你可以修改)
修改nginx.conf配置
index要加入index.py
Nginx的配置加入
點擊(此處)折疊或打開
location / {
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_pass 127.0.0.1:9002;
}
使用Spawn-fcgi
spawn-fcgi -d /data/www -f /data/www/index.py -a 127.0.0.1 -p 9002
如果報錯為126,說明index.py沒有可執行許可權
netstat -lnp | grep 9002參考是否啟動成功
我運行的實際為
spawn-fcgi -d /data/www -f /data/www/index.py -a 127.0.0.1 -p 9002 -F 2
啟動2個進程
啟動nginx
瀏覽器輸入地址
成功結束
❸ 如何用nginx部署python寫的socket伺服器代碼
1.安裝nginx安裝過nginx這就不好從新演示了.默認你也安裝好了nginx.
2.安裝flup$:dpkg -l *flup*列印信息:Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-===========================-===========================-======================================================================
ii python-flup 0.2126-1 Implements Python Web Server Gateway Interface (WSGI)
$:apt-get install python-flup
3:配置nginx.conf.這個是按照網上配置的.
server {listen 1235;
server_name localhost;
#charset koi8-r;
#access_log /dev/null;
access_log /usr/local/nginx/logs/access.log;
location / {
#location /htm {
# root /home/utest/ms;#}root /home/utest/ms;
fastcgi_pass 127.0.0.1:1234;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param CONTENT_LENGTH $content_length;
include fastcgi_params;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;}}解釋:埠:1235--為監聽埠.埠:1234----為web伺服器運行的埠.
from=olddocs
❹ nginx+uwsgi+flask搭建後怎麼訪問.py文件
一、介紹
最近開發要用一個測試環境,是這樣的Nginx+uwsgi+flask 的一個結構。下面是一些記錄,在Centos 系統上使用Flask 架構部署一個簡單的Python應用。然後使用Nginx作為前端反向代理,設置uWSGI應用網關處理web應用程序。
二、條件
1) 環境要求
Server OS:最小化安裝 Centos 6.8
Nginx :反向代理
Python2.6~2.7:開發語言
Flask/uWSGI:框架
Pip:python包管理工具
iptables&selinux:開放用到的埠,關閉selinux。
- [root@hcloud ~]# service nginx start
- Starting nginx: [ OK ]
以上內容代理了uwsgi的埠,客戶端通過訪問nginx的80埠,然後nginx在將請求轉發到後台flask應用的8000埠上。
啟動nginx
在瀏覽器內測試訪問一下nginx:http://192.168.30.58
每個人都應是守望者,守望我們的心智,我們的理想,以防它在生活中不知不覺地墜落、被操控和被自己遺忘。。。
❺ win7下 nginx fastcgi 怎麼運行python
CGI的英文全稱為Common Gateway Interface(公共網關介面),是Nginx和動態腳本程序的橋梁,Nginx通過FastCGI介面將動態請求發送給FastCGI,FastCGI中的Wrapper進程生成一個線程,將請求交給腳本解釋程序執行,然後通過原來的socket將解釋執行後的結果原路返回給Nginx,之後Nginx將結果交給客戶端。 Nginx是通過套接字文件socket來將動態請求發送給wrapper,使用的是Tcp協議。wrapper通過CGI介面來接受請求。這樣web伺服器和解釋程序之間完全可以獨立開發,這樣避免了解釋程序直接調用伺服器的介面而導致的出錯和崩潰以及安全性問題。而且可以使Nginx專心處理靜態頁面請求和轉發動態請求,而將腳本解釋器安裝在另一台伺服器,使伺服器的壓力得到分攤。 CGI是作為PHP程序的補丁開發的,安裝PHP首先安裝其所依賴的庫,之後在編譯配置參數時加入對CGI的支持--enable-fpm --enable-cgi等選項。編譯PHP的擴展模塊,需要用到php中的phpize工具用來生成模塊編譯時的configure文件,如果運行phpize時無法生成configure文件,原因有:沒有安裝autoconf軟體包。 php-fpm進程的配置文件為/usr/local/php/etc/php-fpm.conf 可以對php-fpm進行相應的配置。 Nginx配置支持fastcgi: location ~ \.php${ root html; fastcgi_pass unix:/tmp/fastcgi.soke //通過套接字文件和cgi建立聯系,該文件在php-fpm.conf中設置 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME html$SCRIPT_FILE_NAME;設置參數 include fastcgi_params; //導入fastcgi參數配置文件,該文件在nginx安裝時自動生成。 }
❻ 如何部署python web程序
Python Web 程序的部署方案
綜合而言, 高性能的Python web站點部署方式首推 nginx + uwsgi
apache + mod_wsgi 是簡單穩定但性能一般的方式
API伺服器 可以直接使用tornado或者gevent
mod_python
非常原始的cgi模式部署python已經沒有什麼好介紹了。對於不太追求性能的管理系統和網站來說,使用 Apache 部署是一個不錯的選擇。較早的時候,使用 mode_python 部署python的web應用十分流行,在Django 0.96 的時候官方文檔甚至推薦這種方式。
它將Python解釋器嵌入到Apache server,以提供一個訪問Apache server內部的介面。mod_python 在現在看來性能是不佳的,每一個http請求 mod_python 都會由一個進程初始化python解釋器、載入代碼、執行、然後銷毀進程。
mod_wsgi
如果非要用Apache來部署python應用,mod_wsgi是一個更好的選擇。WSGI 全稱是 Web Server Gateway Interface ,由 PEP-333 定義。 基本上所有的python web框架都實現了wsgi介面,用mod_wsgi 能部署任何實現了wsgi的框架。實際上,不需要任何框架也可以用mod_wsgi 部署python程序。使用mod_wsgi的daemon模式,python程序會常駐內存,不會有很大的初始化和銷毀進程方面的開銷,所以性能是好於mod_python的。綜合來說,使用Apache部署python web程序,推薦使用mod_wsgi的daemon模式。
Fastcgi
先說觀點:不建議用fastcgi的方式部署Python web。
前幾年由於lighttpd風頭正勁和豆瓣的成功案例,fastcgi是一種很流行的部署方式。fastcgi與具體語言無關,也與web伺服器無關。是一種通用的部署方式。fastcgi是對於cgi的增強,CGI程序運行在獨立的進程中,並對每個Web請求建立一個進程。面對大量請求,進程的大量建立和消亡使操作系統性能大大下降。
與為每個請求創建一個新的進程不同,FastCGI使用持續的進程來處理一連串的請求。這些進程由FastCGI伺服器管理,而不是web伺服器。 當進來一個請求時,web伺服器把環境變數和這個頁面請求通過一個socket比如FastCGI進程與web伺服器都位於本地)或者一個TCP connection(FastCGI進程在遠端的server farm)傳遞給FastCGI進程。
主流的web伺服器,Apache,lighttpd,nginx 都支持fastcgi,在幾年前,lighttpd的mod_fcgi模塊性能強勁,lighttpd+fastcgi十分流行。無論是python,ruby還是php,都有大量的站點使用這種方式部署。由於nginx的崛起,現在很少有人使用lighttpd了。
fastcgi 並不是專門為python設計,並不是所有的python框架天然的支持fastcgi,通常需要flup這樣的容器來配適。flup由python編寫,和專門的c實現的wsgi容器比起來性能顯得相當不堪。fastcgi的穩定性對於新興的wsgi容器來說也有差距。無論從哪個方面來看,部署python web程序,fastcgi 都已經是過去式。
uwsgi
前幾年nginx還未內置uwsgi模塊的時候,部署uwsgi還是一件挺麻煩的事情。隨著能夠在nginx中直接使用uwsgi模塊,uwsgi已經是最可靠,最方便的高性能python web程序的部署方式了。
在1U的四核XEON伺服器上,一個簡單的wsgi handler甚至能用AB壓到8000以上的qps,這已經是完爆tornado,接近gevent的性能了。 同時,uwsgi的穩定性極好。之前我們有個每天500w-1000w動態請求的站點使用uwsgi部署非常穩定,在一個渣HP 1U 伺服器上,基本不用管它。
上面提到的部署方式都是相對於web網站的方式,在移動互聯網的時代,我們需要的是高性能的API服務,上面這些都是過時的東西。
tornado
tornado 號稱高性能,如果拿他寫網站,其實一般般,只不過跟uwsgi加一些簡單框架差不多而已。它真正的作用,是用來寫API伺服器和長連接的伺服器。
由於tornado能夠直接處理http請求,很多人直接拿他來裸奔直接提供服務。這種方式是不可取的,單線程的tornado只能利用cpu的一個核心,並且一旦阻塞直接就廢了。通常情況下,由supervisor啟動多個tornado進程,通過nginx進行反向代理負載均衡。nginx 1.14 以後的版本反向代理支持長連接,配合tornado的comet效果很好。
tornado還有一些比較奇葩的用法,比如用來做wsgi容器之類的。
gevent
gevent是一個神器,能做的事情很多。在web方面,處理http請求,用起來其實跟tornado差不多,但是要簡陋很多,cookie之類的都沒有。用gevent寫的一些API服務,部署方式還是類似tornado,用supervisor管理多個守護進程,通過nginx做負載均衡。 同樣的它的奇葩用法也和tornado一樣,可以當wsgi容器用。
❼ 為什麼 Nginx 已經這么成熟,Python 還有各種如 web.py 等 web 框架
為什麼 Nginx 已經這么成熟,Python 還有各種如 web.py 等 web 框架
nginx 是一個web伺服器,不是web框架。這是兩碼事。
nginx 主要用來做靜態文件服務(js/css/images)和HTTP反向代理。web框架用於提供動態內容,一般是web應用的主要業務邏輯。一般web框架編寫好的東西,可以跑在nginx伺服器上。兩者不沖突的。
django和web.py相比,django實力更強,但是我需要解釋一下: 我感覺django太大了,研究透比較浪費時間和精力,不過你按照他的教材用來開發的話,還是比較省心省力,適合那種整站的開發,不過一旦遇到特別需求的話,修改起來就比較困難.
❽ 如何在 virtualenv 環境下搭建 Python Web
安裝組件庫
第一步安裝所需要的存儲庫,因為打算用到虛擬環境,用到 pip 安裝和管理 Python 組件,所以先更新本地包,然後安裝組件:
sudo apt-get update
sudo apt-get install python-pip python-dev nginx
創建虛擬環境 virtualenv
在一個系統中創建不同的 Python 隔離環境,相互之間還不會影響,為了使系統保持干凈,遂決定用 virtualenv 跑應用程序,創建一個容易識別的目錄,開始安裝,再創建項目目錄 super,然後激活環境:
sudo pip install virtualenv
mkdir ~/supervisor && cd ~/supervisor
virtualenv super
source super/bin/activate
安裝 Flask 框架
好了,現在在虛擬環境裡面,開始安裝 Flask 框架,flask 依賴兩個庫 werkzeug 和 jinjia2, 採用 pip 方式安裝即可, pip 是一個重要的工具,Python 用它來管理包:
pip install flask
先用 Flask 寫一個簡單的 Web 服務 myweb.py ,因為後面要做一些測試,所以設置了幾個請求:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'hello world supervisor gunicorn '
@app.route('/1')
def index1():
return 'hello world supervisor gunicorn ffffff'
@app.route('/qw/1')
def indexqw():
return 'hello world supervisor gunicorn fdfdfbdfbfb '
if __name__ == '__main__':
app.debug = True
app.run()
啟動 Flask 看看!
python myweb.py
在瀏覽器中訪問 http://127.0.0.1:5000 就可以看到了「幾個路徑都試一試」
用 Gunicorn 部署 Python Web
現在我們使用 Flask 自帶的伺服器,完成了 Web 服務的啟動。生產環境下,Flask 自帶的伺服器,無法滿足性能要求。所以我們這里採用 Gunicorn 做 wsgi 容器,用來部署 Python,首先還是安裝 Gunicorn:
pip install gunicorn
當我們安裝好 Gunicorn 之後,需要用 Gunicorn 啟動 Flask,Flask 用自帶的伺服器啟動時,Flask 裡面的
name 裡面的代碼啟動了 app.run()。而這里我們使用 Gunicorn,myweb.py 就等同於一個庫文件,被 Gunicorn
調用,這樣啟動:
gunicorn -w 4 -b 0.0.0.0:8000 myweb:app
其中 myweb 就是指 myweb.py,app 就是那個 wsgifunc 的名字,這樣運行監聽 8000 埠,原先的 5000 埠並沒有啟用,-w 表示開啟多少個 worker,-b 表示 Gunicorn 開發的訪問地址。
想要結束 Gunicorn 只需執行 pkill Gunicorn,但有時候還要 ps 找到 pid 進程號才能
kill。可是這對於一個開發來說,太過於繁瑣,因此出現了另外一個神器
---supervisor,一個專門用來管理進程的工具,還可以管理系統的工具進程。
安裝 Supervisor
pip install supervisor
echo_supervisord_conf > supervisor.conf # 生成 supervisor 默認配置文件
gedit supervisor.conf # 修改 supervisor 配置文件,添加 gunicorn 進程管理
在 supervisor.conf 底部下添加 myweb.py 的配置 `/home/wang/supervisor/super` 是我的項目目錄」
[program:myweb]
command=/home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myweb:app
directory=/home/wang/supervisor
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=false
user=wang
stdout_logfile=/home/wang/supervisor/log/gunicorn.log
stderr_logfile=/home/wang/supervisor/log/gunicorn.err
supervisor 的基本使用命令:
supervisord -c supervisor.conf
supervisorctl -c supervisor.conf status 查看supervisor的狀態
supervisorctl -c supervisor.conf reload 重新載入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname] 啟動指定/所有 supervisor 管理的程序進程
supervisorctl -c supervisor.conf stop [all]|[appname] 關閉指定/所有 supervisor 管理的程序進程
supervisor 還有一個 web 的管理界面,可以激活。更改下配置:
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for alliface)
username=wang ; (default is no username (open server)
password=123 ; (default is no password (open server))
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
username=wang ; should be same as http_username if set
password=123 ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
現在可以使用 supervsior 啟動 gunicorn 啦。運行命令:
supervisord -c supervisor.conf
瀏覽器訪問 http://127.0.0.1:9001 可以得到 supervisor 的 web 管理界面,訪問 http://127.0.0.1:8000 可以看見 gunicorn 啟動的返回的頁面。
配置 Nginx
前面我們已經在系統環境下安裝了 Nginx, 安裝好的 Nginx 二進制文件放在 /usr/sbin/ 文件夾下,接下來使用
Supervisor 來管理 Nginx。這里需要注意一個問題,許可權問題。Nginx 是 sudo 的方式安裝,啟動的適合也是 root
用戶,那麼我們現在也需要用 root 用戶啟動 supervisor。在 supervisor.conf 下添加配置文件:
[program:nginx]
command=/usr/sbin/nginx
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=false
stdout_logfile=/home/wang/supervisor/log/nginx.log
stderr_logfile=/home/wang/supervisor/log/nginx.err
好了,都配置完之後,啟動 supervisor:
supervisord -c supervisor.conf
訪問頁面,也可以用 ab 進行壓力測試:
ab -c 100 -n 100 http://127.0.0.1:8000/qw/1
-c 用於指定壓力測試的並發數, -n 用於指定壓力測試總共的執行次數。
安裝 Python 探針
搭建好了 web,想實時監控應用數據,有什麼好的工具,用 OneAPM 的 Python 探針試試,
首先也是安裝 Python 探針:
pip install -i http://pypi.oneapm.com/simple --upgrade blueware
根據 License Key 生成配置文件:
blueware-admin generate-config (License Key) = blueware.ini
由於是在虛擬環境下,所以要特別注意路徑,修改 supervisor.conf 裡面兩項:
[program:myapp]
command = /home/wang/supervisor/super/bin/blueware-admin run-program /home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myapp:app
environment = BLUEWARE_CONFIG_FILE=blueware.ini
重啟應用
supervisorctl # 進入命令行
supervisor> reload # 重新載入
向上面一樣訪問頁面,也可以用 ab 進行壓力測試
幾分鍾後有下圖,可以看到頁面載入時間,web 事物,頁面吞吐量,其中後面是設置自定義事物「Business Transaction」。
❾ 關於python自帶伺服器,
你可能應該訪問「localhost:81/cgi-bin/index.py」。因為「localhost:81/cgi-bin/」是一個目錄,不是一個python script。
❿ 如何用python搭建web項目,有資料庫操作,不用框架
標准庫里有CGIHTTPServer可以用,自己就是httpd。
如果你用別程序做httpd的話,像apache、nginx、cherokee這些有名氣的應該都能支持wsgi、cgi或者fastCGI,你都可以用。