一、背景知识:

Web服务器上有多种方式运行Python:

  1. 传统上的CGI方式:基本已被淘汰
  2. mod_python的模块方式:仍在广泛使用,但生产环境中也被逐步淘汰
  3. uwsgi方式:目前生产环境下最受推崇的方式,尤其是Nginx+uwsgi服务器组合是上线的首选。

Python与Web服务器的关系基本上和PHP与Web服务器的关系类似,可以参考该文:[ CentOS6下搭建 Nginx + PHP + MySQL服务器 ]。

uwsgi服务器的作用类似于java里面的Tomcat服务器。至于在上面跑什么样的Python程序那可能性就太多了。 
例如:

  • 按照uwsgi的规范直接编写的python代码
  • 重量级Web框架:Django编写的应用
  • 轻量级Web框架:Flask编写的应用
  • 轻量级Web框架:web2py编写的应用

Python下的Web框架真是太多了。很难说孰好孰坏,应该说没有最好的,只有最合适的。最简单的一个选择原则是:

  • 如果开发的只是一个简单的web应用的话,推荐使用轻量级的。
  • 如果是开发一个复杂的网站,使用Django的话很多成熟的模块都可以直接使用,开发效率会非常高。

这里选择web.py框架作为例子。

二、安装Nginx + uwsgi + web.py + MySQLdb

1.  升级Python至2.7 
参照: CentOS下编译安装Python2.7

2. 安装Nginx 
#rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm 
#yum install nginx

3. 安装MySQL数据库 
#yum -y install mysql mysql-server mysql-devel libdbi-dbd-mysql 
#service mysqld start 
#chkconfig mysqld on

4. 安装MySQLdb ( mysql-python ) 
#easy_install mysql-python

5. 安装web.py ( 官网 ) 
#easy_install web.py

6. 安装uwsgi ( 官网 ) 
#easy_install uwsgi

7. 配置uwsgi 
uwsgi 的配置文件 可支持xml yaml ini等格式。这里使用ini格式的配置文件。默认路径为/etc/uwsgi.ini。

[uwsgi]
#使用动态端口,启动后将端口号写入以下文件中
socket = /tmp/uwsgi_vhosts.sock
#也可以指定使用固定的端口
#socket=127.0.0.1:9031
pidfile=/var/run/uwsgi.pid
daemonize=/var/log/uwsgi.log master=true
vhost=true
gid=nginx
uid=nginx #性能相关的一些参数,具体内容查看官网文档
workers=50
max-requests=5000
limit-as=512

8. 创建uwsgi开机自启动脚本,便于进行系统管理 
vi /etc/init.d/uwsgi,内容如下:

#! /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 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="uwsgi daemon"
NAME=uwsgi
DAEMON=/usr/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

将脚本属性修改为可执行: 
#chmod 755 /etc/init.d/uwsgi

启用开机自动启动: 
#chkconfig uwsgi on

启动uwsgi服务: 
#service uwsgi start

9. 配置nginx下的uwsgi站点 
例如新增以下一个站点mysite。 
vi /etc/nginx/conf.d/mysite.conf, 内容:

server {
listen 9091;
server_name localhost;
root /www/mysite;
index index.html index.htm;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;
location / {
#使用动态端口
uwsgi_pass unix:///tmp/uwsgi_vhosts.sock;
#uwsgi_pass 127.0.0.1:9031; include uwsgi_params;
uwsgi_param UWSGI_SCRIPT uwsgi;
uwsgi_param UWSGI_PYHOME $document_root;
uwsgi_param UWSGI_CHDIR $document_root;
}
}

10. 启动Nginx服务 
#service nginx start 
#chkconfig nginx on

三、编写一个Hello World! 
#vi /www/mysite/hello.py,内容:

#!/usr/bin/env python
# -*- coding: utf-8 -*- import web urls = (
'/t', 'test', #测试
'/', 'home'
) app = web.application(urls, globals())
#返回wsgi接口
application = app.wsgifunc() class test:
'测试' def GET(self):
# 开发测试用
referer = web.ctx.env.get('HTTP_REFERER', 'http://google.com')
client_ip = web.ctx.env.get('REMOTE_ADDR')
host = web.ctx.env.get('host')
fullpath = web.ctx.fullpath
user_agent = web.ctx.env.get('HTTP_USER_AGENT') data = ""
data += 'Client: %s<br/>\n' % client_ip
data += 'User-agent: %s<br/>\n' % user_agent
data += 'FullPath: %s<br/>\n' % fullpath
data += 'Referer: %s<br/>\n' % referer return data def POST(self):
pass class home:
'根目录请求的处理'
def GET(self):
return "Hello Web.py" def POST(self):
return self.GET() if __name__ == "__main__":
app.run()

浏览器访问:

http://localhost:9091/

http://localhost:9091/t

原文:http://www.tudaxia.com/archives/727?utm_source=tuicool&utm_medium=referral

(转)Nginx + uwsgi + web.py + MySQLdb的更多相关文章

  1. Nginx uWSGI web.py 站点搭建

    一.安装nginx 在安装nginx前,需要先装nginx的依赖包. 1.如果没有yum则先安装yum   删除原有的yum  rpm -aq|grep yum|xargs rpm -e --node ...

  2. Nginx + uWSGI + web.py 搭建示例

    (1)安装Nginx1.1 下载nginx-1.0.5.tar.gz并解压1.2 ./configure (也可以增加--prefix= path指定安装路径)此时有可能会提示缺少pcre支持,如果要 ...

  3. 高并发异步uwsgi+web.py+gevent

    为什么用web.py? python的web框架有很多,比如webpy.flask.bottle等,但是为什么我们选了webpy呢?想了好久,未果,硬要给解释,我想可能原因有两个:第一个是兄弟项目组用 ...

  4. nginx部署web.py项目

    = =测试环境直接就python index.py就好啦 生产环境nginx + web.py + uwsgi 安装uwsgi... pip install uwsgi 首先把自己的代码小改一下... ...

  5. mac OS X 配置Python+Web.py+MySQLdb环境

    MAC默认支持Python 2.7所以不用安装. 1.安装pip sudo easy_install pip 2.安装Web.py sudo pip install Web.py 3.安装MySQLd ...

  6. debian完整部署 Nginx + uWSGI + Django

    手工部署一个Django服务器真心不容易,需要安装很多东西.从头开始搭建服务器,主要是为了梳理一下后续开发中一般为碰到的平台部署.对后续问题的解决有一定帮助. 通常部署有2中方式: 一种是使用现成提供 ...

  7. Nginx+uWSGI+Django环境配置

    通常项目会部署在虚拟环境,虚拟环境的使用可以参考这里,点击前往 当然你也可以直接部署,这里不多说. 一.安装uWSGI 1.通过pip安装 pip install uwsgi 这里只说明了一种安装方式 ...

  8. python nginx+uwsgi+WSGI 处理请求详解

    https://blog.csdn.net/a519640026/article/details/76157976 请求从 Nginx 到 uwsgi 到 django 交互概览 作为python w ...

  9. Nginx+uWSGI+Django+Python+ MySQL 搭建可靠的Python Web服务器

    一.安装所需工具 yum -y install gcc gcc-c++ rpm-build mysql* libtool-ltdl* libtool automake autoconf libtool ...

随机推荐

  1. Python实现多线程HTTP下载器

    本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为 ...

  2. C++ 头文件系列(iosfwd)

    简介 输入输出历来都是语言的重要部分,在C++中,该库也是占据了相当大的一部分. C++的输入输出库是其遵循面向对象设计的结果,并结合了泛型编程. 以下是这些库类的关系图(箭头标示继承,白框表示摸板, ...

  3. windows下vue+webpack前端开发环境搭建及nginx部署

    一.开发环境搭建 1.前端框架一般都依赖nodejs,我们首先要安装node.js.请参考http://www.cnblogs.com/wuac/p/6381819.html. 2.由于许多npm的源 ...

  4. 8086cpu

    1.  8086CPU和8088CPU内部结构基本相同,不同之处在于8088有8条外部数据总线,因此为准16位.8086有16条外部数据总线.两个CPU的软件完全兼容,程序的编制也完全相同. 2.   ...

  5. shell基础学习系列(一)

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行. 输入一些代码: #!/bin/bash echo "Hello World !" &qu ...

  6. 2017-2-28 C#基础 数组

    1.什么是数组? 数组就是具有相同数据类型变量的集合. 2.数组的作用:操作大量数据. 3.数组的定义要求:(1)数组里面的内容必须是同一类型.(2)数组必须有长度限制. 4.数组分为一维数组,二维数 ...

  7. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

  8. 每天一个Linux命令(02)--cd命令

    Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句都要进行操作,都是建立在使用 cd命令基础上的. 所以,学习Linux常用命令,首先就要学好 cd 命令的使用技巧. 1.命令 ...

  9. 脚本之家 前端jQuery js 学习 网站

    http://www.jb51.net/books/ http:// www.3wschool.com/

  10. 【openstack N版】——块存储服务cinder

    一.块存储服务介绍 1.1块存储服务通常包含以下组件 cinder-api: 接受API请求,并将其路由到"cinder-volume"执行. cinder-volume: 与块存 ...