當前位置:首頁 » 編程語言 » nginxpython

nginxpython

發布時間: 2023-03-05 01:04:33

⑴ 在Windows系統上搭建Nginx+python+Mysql環境的教程

1 安裝nginx

下載windows上的nginx最新版本,/en/download.html。

解壓後即可。

運行nginx.exe後本地打開localhost,將會看到歡迎頁面,這證明nginx在本地運行良好,如果沒有出現歡迎頁面,請檢查是否有進程佔用了80埠。

2 安裝flup

下載對應版本的flup,這里下載flup3.x版本,適合python3.2,下載地址:https:///chxanders/flup3

解壓(比如解壓到D:flup)

安裝(進入到python的安裝路徑,然後執行下面的命令

1 python setup.py install )

!注意,如果提示缺少setuptools,安裝distribute-0.6.49.tar.gz,安裝方法和flup安裝一樣,下載地址:https:///pypi/distribute/0.6.49

3 安裝Mysql

在這里我使用的是5.1版本。在win系統上雙擊安裝文件,下一步下一步完成。下載地址:/downloads/

4 安裝資料庫驅動

下載用於win上對應py版本的的python-mysql驅動,雙擊安裝即可。下面的下載地址是3.2:

/wangqc/distribute-0.6.49.zip

5 配置伺服器

首先需要修改nginx的配置文件nginx.conf。

找到:

1 2 3 4 location / { root html; index index.html index.htm; } 在裡面加上:

1 2 3 4 5 6 7 8 9 10 11 12 # host and port to fastcgi server fastcgi_pass 127.0.0.1:55880; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param QUERY_STRING $query_string; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass_header Authorization; fastcgi_intercept_errors off; 然後測試該配置文件是否正確,在cmd中切換到nginx安裝目錄里,輸入

1 nginx.exe -t 即可開始對配置文件測試,如果提示成功,說明配置正確,

這是可以結束掉任務管理器中所有的nginx.exe進程,重新運行ngin.exe重啟nginx服務。

6 運行Server.py

在cmd下切換到項目目錄,輸入命令

1 python Server.py runfcgi method=threaded host=127.0.0.1 port=55880 注意,

這條命令只能用來啟動項目,如果出現錯誤並不會給出提示。下面是正確的情況.

用瀏覽器打開127.0.0.1:8080 測試一下,項目是不是已經跑起來了(第一次運行等待的時間稍長,請耐心等待)。

7 一些注意事項

(1)、首先應該改的地方,這個大家應該都知道:

1 DEBUG = TEMPLATE_DEBUG = False#將debug設置為False (2)、改一下ALLOWED_HOSTS,我死死的就將這個給忘了,我的`配置:

1 2 3 4 if DEBUG:#根據DEBUG來確定 ALLOWED_HOSTS = [""] else: ALLOWED_HOSTS = ["localhost","127.0.0.1"] (3)、重頭戲來了,配置nginx:

這里相關的代碼網上很多,但是幾乎都沒有說明一件事:

配置location ~ ^/static/ 的位置,一定要在location ~ ^/的前面,而且不能單純的使用 location /static/ 或者location /static ,不然,static文件夾中的靜態文件都不能載入!!!

ps:提起這個,慢慢的淚啊,就錯在這里了。

嫌麻煩可以寫成批處理,運行的時候雙擊一下就好了。

⑵ CentOS+nginx+uwsgi+Python 多站點環境搭建

轉自 Xiongpq

http://www.cnblogs.com/xiongpq/p/3381069.html

略有補充(可能出現錯誤及解決辦法)

環境:

CentOS X64 6.4

nginx 1.5.6

Python 2.7.5

正文:

一:安裝需要的類庫及Python2.7.5

安裝必要的開發包

yum groupinstall "Development tools"

yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

CentOS 自帶Python2.6.6,但我們可以再安裝Python2.7.5:

cd ~

wget http://python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2

tar xvf Python-2.7.5.tar.bz2

cd Python-2.7.5

./configure --prefix=/usr/local

make && make altinstall

安裝完畢後,可是使用」python2.7」命令進入python2.7的環境。

二:安裝Python包管理

easy_install包 https://pypi.python.org/pypi/distribute

方便安裝Python的開發包

cd ~

wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz

tar xf distribute-0.6.49.tar.gz

cd distribute-0.6.49python2.7 setup.py install

easy_install --version

紅色部分必須是「python2.7」,否則將安裝到默認的2.6環境內。

pip包 https://pypi.python.org/pypi/pip

安裝pip的好處是可以pip list、pip uninstall 管理Python包, easy_install沒有這個功能,只有uninstall

easy_install pip

pip --version

三:安裝uwsgi

uwsgi: https://pypi.python.org/pypi/uWSGI

uwsgi參數詳解: http://uwsgi-docs.readthedocs.org/en/latest/Options.html

pip install uwsgi

uwsgi --version

測試uwsgi是否正常:

新建test.py文件,內容如下:

def application(env, start_response):

start_response('200 OK', [('Content-Type','text/html')])

return "Hello World"

然後在終端運行:

uwsgi --http :8001 --wsgi-file test.py

在瀏覽器內輸入: http://你購買的雲主機公網ip:8001 ,看是否有「Hello World」輸出,若沒有輸出,請檢查你的安裝過程。

四:安裝django

pip install django

測試django是否正常,運行:

django-admin.py startproject demosite

cd demositepython2.7 manage.py runserver 0.0.0.0:8002

在瀏覽器內輸入: http://1 你購買的雲主機公網 :8002,檢查django是否運行正常。

五:安裝nginx

cd ~

wget http://nginx.org/download/nginx-1.5.6.tar.gz

tar xf nginx-1.5.6.tar.gz

cd nginx-1.5.6

./configure --prefix=/usr/local/nginx-1.5.6 \

--with-http_stub_status_mole \

--with-http_gzip_static_mole

make && make install

安裝Nginx時報錯

錯誤提示:

./configure: error: the HTTP rewrite mole requires the PCRE library.

安裝pcre-devel與openssl-devel解決問題

yum -y install pcre-devel openssl openssl-devel

./configure --prefix=/usr/local/nginx

make

make install

六:配置uwsgi

uwsgi支持ini、xml等多種配置方式,但個人感覺ini更方便:

在/ect/目錄下新建uwsgi9090.ini,添加如下配置:

[uwsgi]

socket =

master = true         //主進程

vhost = true          //多站模式

no-stie = true        //多站模式時不設置入口模塊和文件

workers = 2           //子進程數

reload-mercy = 10

vacuum = true         //退出、重啟時清理文件

max-requests = 1000

limit-as = 512

buffer-sizi = 30000

pidfile = /var/run/uwsgi9090.pid    //pid文件,用於下面的腳本啟動、停止該進程

daemonize = /website/uwsgi9090.log

設置uwsgi開機啟動,在/etc/init.d/目錄下新建uwsgi9090文件,內容如下:

uwsgi9090

#! /bin/sh

# chkconfig: 2345 55 25

# Description: Startup script for uwsgi webserver on Debian. Place in /etc/init.d and

# run 'update-rc.d -f uwsgi defaults', or use the appropriate command on your

# distro. For CentOS/Redhat run: 'chkconfig --add uwsgi'

### BEGIN INIT INFO

# Provides:          uwsgi

# Required-Start:    $all

# Required-Stop:     $all

# Default-Start:     2 3 4 5

# Default-Stop:      0 1 6

# Short-Description: starts the uwsgi web server

# Description:       starts uwsgi using start-stop-daemon

### END INIT INFO

# Author:   licess

# website:  http://lnmp.org

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

DESC="uwsgi daemon"

NAME=uwsgi9090

DAEMON=/usr/local/bin/uwsgi

CONFIGFILE=/etc/$NAME.ini

PIDFILE=/var/run/$NAME.pid

SCRIPTNAME=/etc/init.d/$NAME

set -e

[ -x "$DAEMON" ] || exit 0

do_start() {

$DAEMON $CONFIGFILE || echo -n "uwsgi already running"

}

do_stop() {

$DAEMON --stop $PIDFILE || echo -n "uwsgi not running"

rm -f $PIDFILE

echo "$DAEMON STOPED."

}

do_reload() {

$DAEMON --reload $PIDFILE || echo -n "uwsgi can't reload"

}

do_status() {

ps aux|grep $DAEMON

}

case "$1" in

status)

echo -en "Status $NAME: \n"

do_status

;;

start)

echo -en "Starting $NAME: \n"

do_start

;;

stop)

echo -en "Stopping $NAME: \n"

do_stop

;;

reload|graceful)

echo -en "Reloading $NAME: \n"

do_reload

;;

*)

echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2

exit 3

;;

esac

exit 0

uwsgi9090

然後在終端執行:

-- 添加服務

chkconfig --add uwsgi9090

-- 設置開機啟動

chkconfig uwsgi9090 on

七:設置nginx

找到nginx的安裝目錄/usr/local/nginx,打開conf/nginx.conf文件,修改server配置

server {

listen       80;

server_name  localhost;

location / {

include  uwsgi_params;

uwsgi_pass  ;              //必須和uwsgi中的設置一致

index  index.html index.htm;

client_max_body_size 35m;

}

}

注意 :安裝django這步中startproject的demosite路徑,需要和nginx.conf中 uwsgi_param UWSGI_CHDIR /demosite;對應上。

設置nginx開機啟動,在/etc/init.d/目錄下新建nginx文件,內容如下:

nginx

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig:   - 85 15

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname: nginx

# config:      /usr/local/nginx/conf/nginx.conf

# pidfile:     /var/run/nginx.pid

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx-1.5.6/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx-1.5.6/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {

[ -x $nginx ] || exit 5

[ -f $NGINX_CONF_FILE ] || exit 6

echo -n $"Starting $prog: "

daemon $nginx -c $NGINX_CONF_FILE

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}

stop() {

echo -n $"Stopping $prog: "

killproc $prog -QUIT

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}

restart() {

configtest || return $?

stop

sleep 1

start

}

reload() {

configtest || return $?

echo -n $"Reloading $prog: "

killproc $nginx -HUP

RETVAL=$?

echo

}

force_reload() {

restart

}

configtest() {

$nginx -t -c $NGINX_CONF_FILE

}

rh_status() {

status $prog

}

rh_status_q() {

rh_status >/dev/null 2>&1

}

case "$1" in

start)

rh_status_q && exit 0

$1

;;

stop)

rh_status_q || exit 0

$1

;;

restart|configtest)

$1

;;

reload)

rh_status_q || exit 7

$1

;;

force-reload)

force_reload

;;

status)

rh_status

;;

condrestart|try-restart)

rh_status_q || exit 0

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

exit 2

esac

nginx

然後在終端執行:

-- 添加服務

chkconfig --add nginx

-- 設置開機啟動

chkconfig nginx on

八:測試

OK,一切配置完畢,在終端運行

service uwsgi9090 start

service nginx start

錯誤1:

[root@VM_23_251_centos nginx-1.5.6]# service uwsgi9090 start

env: /etc/init.d/uwsgi9090: Permission denied

[root@VM_23_251_centos nginx-1.5.6]# service nginx start

env: /etc/init.d/nginx: Permission denied

解決辦法1:把可執行勾選上

錯誤2:

[root@VM_23_251_centos ~]# sudo service nginx start

env: /etc/init.d/nginx: No such file or directory

解決辦法1:

Be careful what text editors you use on your local Windows computer. Some create Windows-style line endings (\r\n, CR-LF), which cause problems like this on Unix-like systems such as Linux or Mac OS X.

If you use such an editor, adjust its settings so that it creates files with Unix-style line endings. If the editor has no such setting, you should not be using it at all.

文本格式由windows 改為unix版

錯誤3:

*** WARNING: Can't find section "uwsgi" in INI configuration file /etc/uwsgi9090.ini ***

解決辦法3:

在瀏覽器輸入: http:// 雲主機公網ip,恭喜你可以看到django的「It work」了~

九:多站配置

我採用運行多個uwsgi服務的方法來實現多個站點。

重復第六步,創建uwsgi9091.ini,並相應修改文件中的

socket = 127.0.0.1:9091

pidfile = /var/run/uwsgi9091.pid

daemonize = /website/uwsgi9091.log

並創建服務uwsgi9091,設置開機啟動。

然後修改nginx的配置文件為:

nginx

然後我們就可以通過 http://127.0.0.1:1300 來訪問新的網站了。

十:其他配置

防火牆設置

CentOS默認關閉外部對80、3306等埠的訪問,所以要在其他計算機訪問這台伺服器,就必須修改防火牆配置,打開/etc/sysconfig/iptables

在「-A INPUT –m state --state NEW –m tcp –p –dport 22 –j ACCEPT」,下添加:

-A INPUT -m state --state NEW -m tcp -p -dport 80 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p -dport 3306 -j ACCEPT

然後保存,並關閉該文件,在終端內運行下面的命令,刷新防火牆配置:

service iptables restart

安裝Mysqldb

yum -y install mysql-develeasy_install-2.7 MySQL-python

注意紅色部分,easy_install-2.7,否則它將默認安裝到Python2.6環境內。

------------------------------------------------------------------------------------------------------------------

2014年12月02日添加:

CentOS 7中默認使用Firewalld做防火牆,所以修改iptables後,在重啟系統後,根本不管用。

Firewalld中添加埠方法如下:

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --reload

⑶ web伺服器 Nginx

(1)概念

Web伺服器是一台使用HTTP協議與客戶機瀏覽器進行信息交流(因此又稱為HTTP伺服器)、為互聯網客戶提供服務(信息瀏覽,下載資源等)的主機。發展趨勢:從HTML到XML、從有線到無線、從無聲到有聲

1.Linux是架設安全高效Web伺服器的操作系統

架設Web伺服器常見的操作系統:Windows、Linux、Unix。Linux安全性能最高,可以支持多個硬體平台,可以根據不同需求隨意修改、調整與復制各種程序的源碼以及發布在互聯網上,網路功能比較強大。

2.目前主流伺服器:Apache、 Nginx、 IIS

Unix/Linux操作系統下使用最廣泛的免費HTTP伺服器:Apache、Nginx。Windows(NT/2000/2003)操作系統使用ⅡS,綜合使用最多的Web伺服器是 IIs、Apache。

選擇WEB伺服器應考慮的本身特性因素有:性能、安全性、日誌和統計、虛擬主機、代理伺服器、緩沖服務和集成應用程序等。下面介紹目前最主流的三大web伺服器:

① 大型

IIS:

微軟的Internet Information Services (IIS),IIS 允許在互聯網上發布信息,提供了一個圖形界面的管理工具,稱為Internet服務管理器,可用於監視配置和控制Internet服務。IIS是一種Web服務組件,其中包括Web伺服器(網頁瀏覽)、FTP伺服器(文件傳輸)、NNTP伺服器(新聞服務)和SMTP伺服器(郵件傳輸),使得在網路上發布信息很容易。它提供ISAPI(Intranet Server API)作為擴展Web伺服器功能的編程介面,它還提供一個Internet資料庫連接器,可以實現對資料庫的查詢和更新。

Apache:

Apache是世界上用的最多的Web伺服器,源於NCSAhttpd伺服器的補丁(pache 補丁)。它的成功之處主要在於:源代碼開放、有開放的開發隊伍、支持跨平台的應用(可以運行在幾乎所有的Unix、Windows、Linux系統平台上)、可移植性。

② 小型

nginx:

nginx的模塊都是靜態編譯的,對fcgi的支持非常好,在處理鏈接的的方式上nginx支持epoll,支持通用語言介面(如:php、python、perl等),支持正向和反向代理、虛擬主機、url重寫、壓縮傳輸等。

(2)工作原理

當客戶端Web瀏覽器連到伺服器上並請求文件時,伺服器將處理該請求並將文件反饋到該瀏覽器上,附帶的信息會告訴瀏覽器如何查看該文件(即文件類型)。Web伺服器主要是處理向瀏覽器發送HTML以供瀏覽,而應用程序伺服器提供訪問商業邏輯的途徑以供客戶端應用程序使用。應用程序伺服器可以管理自己的資源,例如看大門的工作(gate-keeping ties)包括安全(security),事務處理(transaction processing),資源池(resource pooling), 和消息(messaging)。就象Web伺服器一樣,應用程序伺服器配置了多種可擴展(scalability)和容錯(fault tolerance)技術。Web伺服器的工作原理一般可分成如下4個步驟:

① 連接過程:是Web伺服器和其瀏覽器之間所建立起來的一種連接。查看連接過程是否實現,用戶可以找到和打開socket這個虛擬文件,這個文件的建立意味著連接過程這一步驟已經成功建立。

② 請求過程:是Web的瀏覽器運用socket這個文件向其伺服器而提出各種請求。

③ 應答過程:是運用HTTP協議把在請求過程中所提出來的請求傳輸到Web的伺服器,進而實施任務處理,然後運用HTTP協議把任務處理的結果傳輸到Web的瀏覽器,同時在Web的瀏覽器上面展示上述所請求之界面。

④ 關閉連接:是當上一個步驟--應答過程完成以後,Web伺服器和其瀏覽器之間斷開連接之過程。Web伺服器上述4個步驟環環相扣、緊密相聯,邏輯性比較強,可以支持多個進程、多個線程以及多個進程與多個線程相混合的技術。

Web伺服器可以解析HTTP協議。當Web伺服器接收到一個HTTP請求(request),會返回一個HTTP響應(response)。為了處理一個request,Web伺服器可以response一個靜態頁面(HTML頁面)或圖片,進行頁面跳轉(redirect),或把動態響應委託給伺服器端。Web伺服器的代理模型非常簡單。當一個request被送到Web伺服器里來時,它只單純的把request傳遞給可以很好的處理request的程序(伺服器端腳本,如:CGI腳本,JSP腳本,servlets,ASP腳本,伺服器端JavaScript等)。Web伺服器僅僅提供一個可以執行伺服器端程序和返回(程序所產生的)響應的環境,而不會超出職能范圍。伺服器端程序功能通常有:事務處理、資料庫連接、和消息等。雖然Web伺服器不支持事務處理或資料庫連接池,但它可以配置各種策略來實現容錯性、可擴展性(如:負載平衡、緩沖)。集群特徵經常被誤認為僅僅是應用程序伺服器專有的特徵。

(3)配置

如何設置默認文檔;在同一台伺服器上架設多個Web站點;(可以通過改變埠號)創建Web虛擬目錄;

1、了解DNS主機名和IP地址。

如果此WEB伺服器在Internet上,需向ISP申請和注冊此伺服器的DNS主機名和IP地址。如果此伺服器只在企業網內使用,則在內部的DNS伺服器上注冊。

2、打開伺服器文檔,選擇"埠"-"Internet埠",啟用"TCP/ IP埠"。

3、選擇"Internet協議",完成以下選項後,保存文檔。

① 綁定主機名:

A、選擇"是"則您可在"主機名"項中輸入主機別名,WEB用戶可用此別名替代Domino伺服器名訪問WEB伺服器。

B、選擇"否"(預設)則不允許使用別名。

② DNS查詢: 選擇"是"則Domino伺服器查詢發送請求的WEB客戶機的DNS名。

③ Domino日誌文件和資料庫將包含WEB客戶機的DNS主機名: 選擇"否"(預設)則不查詢,Domino日誌文件和資料庫將只包含WEB客戶機的IP地址( 注意:選擇"否"將提高Domino伺服器性能,因為伺服器不使用資源執行DNS查詢

④ "允許HTTP客戶瀏覽資料庫":選擇"是"則允許WEB用戶在URL中使用OpenServer命令來顯示伺服器上資料庫列表。選擇"否"(預設)則不允許。但即使WEB用戶不能看到伺服器上資料庫列表,他們仍能打開有許可權訪問的單個資料庫。

4、啟動HTTP任務。在伺服器控制台上,輸入:loap http

小型項目

(1)概念

1、Nginx(俄羅斯程序設計師Igor Sysoev用C語言進行編寫)是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3/SMTP)代理伺服器。

2、特點:佔有內存少(在高連接並發的情況下,Nginx是Apache伺服器不錯的替代品,能夠支持高達 50,000 個並發連接數的響應),並發能力強。

3、中國大陸使用nginx網站用戶有:網路、京東、新浪、網易、騰訊、淘寶等。

4、Nginx代碼完全用C語言從頭寫成,已經移植到許多體系結構和操作系統,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。

5、Nginx有自己的函數庫,並且除了zlib、PCRE和OpenSSL之外,標准模塊只使用系統C庫函數。而且,如果不需要或者考慮到潛在的授權沖突,可以不使用這些第三方庫。

(2)安裝

官網:http://nginx.org/

選擇要安裝的版本:

(3)使用

打開conf/nginx.conf,修改埠號,和主頁根地址為:打包後index.html的目錄

模擬域名配置(本地域名設置):

在瀏覽器地址欄輸入配置好的「域名:埠號」回車:

⑷ Nginx+Python 怎麼搞才好

python服務後台運行

由於python程序一般只有單進程,因此要用uwsgi啟動多個python進程來同時服務,寫代碼時就要求所有請求必須是無狀態的。

為了保證python程序能一直運行,一般用supervisor來拉起並運行在後台。

supervisor配置這樣寫:

[program:app]

command = uwsgi

--socket 0.0.0.0:6580

--chdir /app

--mole app.wsgi

--processes 8

--master

--uid root

--listen 100

stopsignal=QUIT

autostart=true

autorestart=true

user=root

stdout_logfile_maxbytes=10MB

stdout_logfile_backups=10

stdout_logfile=/app/log/debug.log

redirect_stderr=true

nginx轉發

要將請求轉到python,一般用nginx轉發請求到uwsgi,nginx配置文件中server段這樣寫:

server {

listen 8000;

location / {

uwsgi_pass 127.0.0.1:6580;

include uwsgi_params;

}

}

總結一下:一般的實踐是用uwsgi+supervisor啟動多個python程序的服務進程,再用nginx轉發uwsgi請求到python模塊。

⑸ Nginx+Python 怎麼搞才好

介紹NGINX和Python如何配合使用
Python以易用,有趣而出名,它讓軟體開發變得簡單,據說運行性能也高於其他腳本語言(PHP最新版本PHP 7的性能好像可以與Python一較高下)
每一個人都希望自己的網站或應用可以運行得更快。但是每一個網站在大流量和流量激增時都容易遇到性能問題,甚至當機,業務繁忙時,這種情況會更加糟糕。其實無論流量是穩定增長,還是陡峭增長,所有網站都面臨性能和當機的困擾。

NGINX和NGINX插件的出現就是為了解決這個問題。他們通過三種不同的方式來改善網站性能:

1、web服務 – 最初開發NGINX是為了解決 C10K 問題 – 可以輕松支撐10,000或更多的並發連接。使用NGINX為你的Python應用提供web服務,可以讓你的網站運行更快,即便在小流量的情況下也有效果。當你的用戶成千上萬時,確定無疑,它可以提供更高的性能,更少的崩潰,以及更少的當機時間。你也可以使用NGINX提供靜態文件緩存或者微緩存服務,一個獨立的NGINX反向代理也是很好的選擇(見下一段)。

2、反向代理– 你可以在應用服務的前端用NGINX做反向代理。NGINX接收Web請求並分發到你的應用服務。這個「怪招」可以讓你的網站運行得更快,減少當機,消費更少的服務資源,而且可以提高安全性。你也可以在反向代理伺服器上緩存靜態資源(非常高效),添加靜態內容的微緩存,以減少應用自身的負載,等等。

3、為多個應用服務提供動態均衡 – 通過布署反向代理服務。通過多應用服務並行運行和NGINX或者NGINX插件來做流量負載均衡。通過這種布署,根據流量需要,增長穩定性和運行時間需要,你可以很輕松地在線擴展網站性能。如果你需要讓給定用戶的會話在同一個服務上,你只需要配置負載均衡以支持會話持久化。

不管是為你的Python應用提供網站服務,還是做反向代理服務,還是做負載均衡,或者三者都用,NGINX和NGINX插件都會給你帶來優勢。

這是本系列(由兩部分組成)中的第一篇文章,將會介紹五個提升Python應用性能的技巧,包括如何使用NGINX或NGINX插件提供web服務,如何實現靜態文件的緩存,如何為動態內容做微緩存。在第二部分,我們將介紹如果用NGINX或NGINX插件提供反向代理服務,以及如何為多個應用服務提供負載均衡。

技巧 1– 定位Python性能瓶頸
有兩種截然不同的情況會讓你的Python應用遇到性能問題– 第一,每天有海量用戶;第二,高負載。大部分網站長都不需要擔心性能問題,因為他們的負載很小,根據我們的拙見,他們應該努力降低響應時間。將響應時間控制在毫秒級是一個非常困難且不被關注的工作。但可以讓我們的用戶體驗更好,業績更優秀。

但是這篇博文和剩下的第二部分,將關注每個人都確實關注的場景:當網站繁忙時可能會出現的性能問題,如性能大幅下降和當機。還有黑客模擬大量用戶攻擊造成的流量激增,同時提高網站性能也是處理攻擊的重要步驟。

像Apache HTTP Server這樣的系統會為每個用戶分配一定數量的內存,隨著用戶的不斷增加,物理內存不堪重負。伺服器開始使用磁碟的交換分區,性能直線下降,性能問題和當機接踵而至。這篇博文中所介紹的遷移到NGINX,有助於解決這一問題。

Python特別容易出現內存相關的性能問題,因為與其他腳本語言相比,Python通常是使用更多的內存來執行任務(所以執行速度快)。所以在相同條件下,與用其他語言寫的應用相比,你的Python應用更容易在少量用戶的情況下而「絆倒」。

優化你的應用對解決問題會有所幫助,但要解決流量相關的性能問題,這通常不是最好最快的方式。這篇博文及剩下的第二部分,將介紹一種最好並且最快的方式。在實施這些措施之後,再採取一切方法優化你的應用,或者使用微服務架構重寫。

技巧 2 – 選擇單服務或者微服務布署
小網站在單個伺服器上就可以運行得很好。大的網站需要多個伺服器。但如果你處於中間地帶–或者你的網站從一個小網站變成一個大網站– 你可以做一些有趣的選擇。

如果你使用單機布署,大流量和瀏覽激增會給你帶來很大的風險。你的擴展手段非常有限,無外乎優化你的應用,把web服務切換到NGINX,使用一個更大更快的伺服器,或者使用內容分發網路(CDN)。所有這些可選項的實施都耗時耗錢,而且在實施過程中還有引入bug的風險。

另外一個很顯然的風險是單機布署存在單點故障問題 – 很多問題可以導致你的站點掛掉,而且沒有快速簡單的解決方案。

使用NGINX做為應用的代理服務

如果你把服務切換成NGINX並且使用單機布署,你可以自由地選擇使用開源的NGINX或者NGINX插件。NGINX包括企業級支持和一些擴展功能。像實時活動監測這樣的擴展功能是支持單機布署的。如果做為反向代理,採用分布式布署,你可以使用其他NGINX插件,如負載均衡和會話持久化。

有很多事情都要考慮周詳,除非你確定你的網站在未來很長時間內都是一個小網站,不需要關心當機問題,否則,你要明白,單機布署存在很多風險。分布式布署比較易於擴展 – 單點故障可以通過工程解決,性能可以按需調整,可以快速擴充伺服器能力。

技巧 3 – 使用NGINX替換你的Web服務
在Web時代的早期,Apache就是web服務的同義詞。但NGINX自2000年出現以來,迅速流行開來;現在已經是排名第一的web服務,被1,000, 10,000多個網站和世界上最繁忙的100,000多個網站使用。

NGINX最初是為了解決C10K問題而開發 – 在給定內存預算下支持10,000+並發。其他web服務需要為每個連接分配內存塊,所以他們會耗盡物理內存,當數以千記的用戶在同一時間訪問一個網站,它會變慢甚至崩潰。NGINX處理器可以單獨處理一個請求,也可以優雅地擴展,同時處理多個用戶。(這可以很好地解決額外問題,後面會詳述。)

一個高層NGINX架構圖如下所示。

NGINX 架構, 選自開源應用架構第二卷

在上圖,一個Python應用服務被布署在後端的應用服務塊中,如圖所示,它通過FastCGI被訪問。NGINX不「知道」怎麼運行Python,所以它需要一個網關連結需要的環境。FastCGI是一個被PHP,Pyhton和其他語言廣泛使用的介面。

但是,連結Python和NGINX的流行方案是網路服務網關介面(WSGI)。WSGI工作在多線程和多進程環境下,所以他兼容本文所提到的所有布署選項。

如果你將web服務遷移到NGINX,這里有一些有用的軟體:

Configuring gunicorn – 「Green Unicorn」是一個流行的WSGI服務,配合NGINX使用。
Configuring uWSGI – 另一個流行的WSGI服務,配合NGINX使用. uWSGI包含NGINX指令支持。
Using uWSGI, NGINX, and Django – 一個流行的Python web框架。

下面的代碼片斷將向你展示如何配置NGINX和uWSGI – 這個案例中的工程使用Python框架Django。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

http
{
...
upstream
django {
server
127.0.0.1:29000;
}

server
{
listen
80;
server_name
myapp.example.com;

root
/var/www/myapp/html;

location
/ {
index
index.html;
}

location
/static/
{
alias
/var/django/projects/myapp/static/;
}

location
/main {
include
/etc/nginx/uwsgi_params;
uwsgi_pass
django;

uwsgi_param
Host $host;
uwsgi_param
X-Real-IP $remote_addr;
uwsgi_param
X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param
X-Forwarded-Proto $http_x_forwarded_proto;
}
}
}

技巧 4 – 實現靜態文件緩存
緩存靜態內容包括:為不經常變更的文件保存副本 – 不經常是指數小時或者永遠 – 副本保存在其他位置而不是應用服務中。典型的靜態內容是網頁中經常用到的JPEG圖片。

緩存靜態文件是提升應用性能的常用手段,經常被用到:

1、用戶瀏覽器
2、互聯網提供商 – 從公司網路到互聯網提供商(ISP)
3、web服務, 也就是本文所講的

在web服務端實現靜態文件緩存有兩個好處:
1、為用戶提供快速服務 – NGINX 專門為靜態文件緩存做過優化,對靜態內容請求的處理比應用服務要快。
2、減少應用服務負載– 應用服務不需要處理已經緩存的靜態文件,已經由web服務接管。

緩存靜態文件在單伺服器上也可以很好的實現,但底層硬體資源仍然是由web服務和應用服務所共享。如果web服務要處理頻率的靜態文件訪問 – 甚至是海量 – 應用服務可以使用的硬體資源就會變少,一些功能可能就會變慢。

如果要支持瀏覽器緩存,需要正確設置靜態文件的頭部信息。如HTTPCache Control(特別是它的max age設置),Expires,和Entity標記。如果想深入了解,參見NGINX Plus的管理員指南:使用NGINX為uWSGI和Django提供應用網關

下面的NGINX配置代碼用來緩存靜態文件,包括JPEG文件,GIF文件,PNG文件,MP4文件,Powerpoint文件,和一些其他文件,請把www.example.com替換成你自己的網址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

server
{
#
substitute your web server's URL for

"www.example.com"
server_name
www.example.com;
root
/var/www/example.com/htdocs;
index
index.php;
access_log
/var/log/nginx/example.com.access.log;
error_log
/var/log/nginx/example.com.error.log;

location
/ {
try_files
$uri $uri/ /index.php?$args;
}

location
~ \.php$ {
try_files
$uri =404;
include
fastcgi_params;
#
substitute the socket, or address and port, of your Python server
fastcgi_pass
unix:/var/run/php5-fpm.sock;
#fastcgi_pass
127.0.0.1:9000;
}

location
~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg
|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid
|midi|wav|bmp|rtf)$
{
expires
max;
log_not_found
off;
access_log
off;
}
}

技巧 5 – 實現微服務
微緩存可以很明顯的大幅提升Python, PHP和一些其他語言開發的應用服務性能,根據是否適合緩存,可以把網頁分成三類:

靜態文件 – 這類文件適合緩存,見技巧4所述。
動態,非個性化頁面 – 因為它們需要刷新,這些文件通常不適合做緩存。例如未登錄前的電商用戶所看到的頁面(見下一點) – 可用商品和推薦相似商品經常要發生改變,所以必須生成新頁面。但是,如果有另外一個用戶,在10毫秒之後發送同樣請求,將前一用戶看到的網頁緩存並發送給後一用戶就變得合情合理。
動態,個性化頁面 –這些不適合緩存,因為它們是針對具體用戶的,同一個用戶不希望兩次看到同一個個性化頁面。例如一個電商用戶登錄後的頁面不應該展示給另外一個用戶。

靜態文件和非個化性動態內容可以緩存

微緩存適用於上面提到的第二類頁面–動態,非個性化頁面。「微」是指很短的時間。如果你的網站在一秒內要多次生成同一個頁面,如果你把這個頁面只緩存一秒,並不影響該頁面的刷新。但這個短暫的緩存可以極大的降低應用服務的負載,特別是流量較大時。將原來在一個緩存區間內,同一內容生成10,或者20,甚至100次,調整為只生成一次並緩存,為其他用戶提供緩存內容。

這個效果是很神奇的。一個服務如果一秒鍾要處理大量請求會變得很慢,但如果只處理一個請求,就會變得很快。(包括任何個性化頁面)。我們自己的Owen Garrett有一篇博客對微服務的優勢做了詳情介紹,裡面還有配置代碼。主要要修改的地方是把代理緩存過期時間設為一秒,只需要幾行配置代碼就可以搞定。

1
2
3
4
5
6

proxy_cache_path
/tmp/cache keys_zone=cache:10m levels=1:2

inactive=600s max_size=100m;
server
{
proxy_cache
cache;
proxy_cache_valid
200

1s;
...
}

更多配置樣例,參見Tyler Hicks Wright關於Python和uWSGI如何使用NGINX的博客。

總結
在第一部分,我們回顧了一下在單機環境下提高Python應用性能的解決方案,還有緩存的使用,在單機情況下緩存可以應用於反向代理伺服器或者獨立緩存服務(緩存比獨立服務性能更好)。在下一部分,我們將會介紹分布式環境下的性能提升方案。

如果你想在應用中使用更多的NGINX Plus特性,如實時事件監測,在線修改配置,你可以馬上開通30天免費試用,或者聯系我們,可以獲得一個真實例子。

⑹ 如何快速有效的安裝Python+Nginx+Tornado+Mysql

下面我將介紹在UNIX(LINUX、MAC下的配置方法其本一致)下如何快速搭建其運行環境:

1、安裝Python
wget http //www python org/ftp/python/2.7.5/Python-2.7.5.tgz tar xvfz Python-2.7.5.tgzcd Python-2.7.5 ./configure
make
sudo make install

2、安裝Python的包管理工具setuptools、pip和打包工具distribute
wget http //peak telecommunity com/dist/ez_setup.py python ez_setup.py
wget http //python-distribute org/distribute_setup.py python distribute_setup.py
wget https //github com/pypa/pip/raw/master/contrib/get-pip.py python get-pip.py

3、安裝Readline
sudo pip install readline

4、安裝Mysql
#安裝cmake wget http //www cmake org/files/v2.8/cmake-2.8.8.tar.gz
tar xvfz cmake-2.8.8.tar.gz
cd cmake-2.8.8
./configure
make
sudo make install #安裝mysql wget http //cdn mysql com/Downloads/MySQL-5.5/mysql-5.5.29.tar.gz
tar xvfz mysql-5.5.29.tar.gz
cd mysql-5.5.29
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/localmysql/data/ -DMYSQL_UNIX_ADDR=/usr/localmysql/data/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_unicode_ci -DWITH_DEBUG=0
make
sudo make install #下載安裝mysql-python wget http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz
tar xvfz MySQL-python-1.2.3.tar.gz
cd MySQL-python-1.2.3 #修改site.py中mysql_config的路徑(為mysql安裝路徑下的/bin/mysql_config), site.py
mysql_config = /usr/local/mysql/bin/mysql_config #更改完進行編譯和安裝 python setup.py build
sudo python setup.py install #將mysql安裝路徑下的lib加入到環境變數LD_LIBRARY_PATH中 export LD_LIBRARY_PATH=/usr/local/mysql/lib/:$LD_LIBRARY_PATH

5、安裝一些Python的常用模塊和tornado
pip install tornado
pip install torndb
pip install requests
pip install markdown

6、配置Mysql
groupadd mysql useradd -g mysql mysql chown mysql.mysql -R /service/mysql/ /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

7、安裝Nginx
wget http://nginx.org/download/nginx-0.8.33.tar.gz tar zxvf nginx-0.8.33.tar.gz
cd nginx-0.8.33 ./configure
make
make install

8、配置nginx,編輯/usr/local/nginx/conf/nginx.conf文件
user nobody;
worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

upstream snail {
server 127.0.0.1:8888;
}

sendfile on; #tcp_nopush on; keepalive_timeout 65;
proxy_read_timeout 200;
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_min_length 1000;
gzip_proxied any;

server {
listen 80;
server_name localhost; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location / {
proxy_pass_header Server;
proxy_set_header Host $http_host; # proxy_redirect false; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://snail; }

}

}

9、創建一個項目
vi demo.py
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")

application = tornado.web.Application([
(r"/", MainHandler),
]) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

10、運行這個項目
#啟動項目 nohup python demo.py & #重啟Nginx /usr/local/nginx/sbin/nginx -s reload

在瀏覽器中輸入http://127.0.0.1 看到頁面輸出hello word!
轉載,僅供參考,祝你愉快,滿意請採納。

熱點內容
md5加密64 發布:2024-05-05 21:59:30 瀏覽:526
259pp頁面訪問升級 發布:2024-05-05 21:47:51 瀏覽:88
迅雷阻止上傳 發布:2024-05-05 21:26:19 瀏覽:913
資料庫運維題 發布:2024-05-05 21:21:47 瀏覽:961
RM魔塔編程 發布:2024-05-05 21:21:47 瀏覽:285
matlab獲取文件夾 發布:2024-05-05 21:12:24 瀏覽:291
一根式演算法 發布:2024-05-05 21:12:23 瀏覽:955
php無刷新 發布:2024-05-05 21:08:11 瀏覽:982
搭建一個流媒體伺服器 發布:2024-05-05 20:40:59 瀏覽:667
2017中超資料庫 發布:2024-05-05 20:37:25 瀏覽:379