提示:如果你正在linux下面(比如ubuntu系统)尝试搭建基于python的服务器,nginx+uwsgi+webpy 。假如你在google上搜索了很多帖子,依然有许多问题。
并且某些问题在网上基本找不到答案。那建议你果断重装系统。从头开始。因为,其实这个组合挺好搭建。请看下文。
本人的版本为
ubuntu 12.04 LTS+nginx1.2.2+UWSGI1.2.4+webpy0.36(当然0.37也可以),基本一次跑通。
最近在ubuntu12.04 lts server 下搭建nginx+uwsgi+webpy服务器,经历许多波折,现在此版本的server和destop版本跑通,这里一并记录下来
server版本从http://www.ubuntu.com/download/server 下载。安装完成后。要先安装gcc,g++,make,webbench,apach2等基本工具.
本人参考的帖子如下(呵呵,IT要站在巨人的肩膀上)
nginx学习研究(一)安装启动及调试 :http://blog.csdn.net/apache0554/article/details/7766567
搭建UWSGI,通过简单的webpy例子:http://www.cnblogs.com/Jerryshome/archive/2011/07/20/2111683.html
纯静态文件环境下的Nginx优化思路 :http://os.51cto.com/art/201111/300876.htm
关于Nginx的一些优化(突破十万并发) :http://www.howtocn.org/nginx:%E9%85%8D%E7%BD%AE%E4%B8%80%E4%B8%AA%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84nginx_fastcgi%E6%9C%8D%E5%8A%A1%E5%99%A8
主要精华按照顺序是:
nginx最好从官方网站下载安装,而不要从apt-get install 安装,这里下载地址是
http://nginx.org/en/download.html
tar -xvf nginx-1.2.2.tar.gz cd nginx-1.2.2 useradd www ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module 如果发现缺少Pcre模块,则apt-get install libpcre3 libpcre3-dev 重新configure make && make install
注释:PCRE模块的一个功能是,解析正则。下面会讲到。
这里编译完成后的nginx为2M多,你可以
cd nginx-1.2.2 vi auto/cc/gcc 注释掉CFLAGS="$CFLAGS -g"
这样编译完成后,nginx为500多K。效率也会得到极大提升。
安装完成后我们会在/usr/local/nginx下看到如下几个文件
conf nginx默认配置文件存放目录
html nginx默认的网站根目录
logs nginx默认日志文件目录
sbin nginx默认可执行文件目录
首先我们来尝试启动nginx,启动的命令如下:
/usr/local/nginx/sbin/nginx 执行过后如果没有任何提示,那么nginx可能就已经启动成功
当然也可以使用ps -ef | grep nginx 来查看进程中是否有nginx
这是可以在浏览器中输入http://IP来检查nginx能否访问。
在html中默认有一个欢迎index.html
如果安装成功,你将能够看到Welcome to nginx!字样,当然你可以更改html/index.html文件中的显示文字。
常用命令:启动nginx
/usr/local/nginx/sbin/nginx
刷新nginx
/usr/local/nginx/sbin/nginx -s reload
停止
/usr/local/nginx/sbin/nginx -s stop
安装UWSGI,同样,这个最好还是自己从官网下载吧
http://projects.unbit.it/uwsgi/
wget http://projects.unbit.it/downloads/uwsgi-1.2.4.tar.gz
tar -xvf uwsgi-1.2.4.tar.gz cd uwsgi-1.2.4 python uwsgiconfig.py build
如果提示缺少python-header,则
apt-get install python-dev
注意,不需要再去执行
python setup.py install
因为build之后,uwsgi已经生成了,你只需要把它拷贝到/usr/local/nginx下,即可方便调用
配置conf/nginx.conf 。主要都在这一步,这里写出来的是关键点。你看到的自己系统里的文件内容跟这个差不多
user root root;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_connections 102400;
error_log logs/error.log;
worker_rlimit_nofile 102400;
events {
worker_connections 10240;
use epoll;
}
http{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8000;
server_name localhost;
location / {
root /home/webapp;
uwsgi_pass 127.0.0.1:9000;
include uwsgi_params;
index index.html index.htm;
uwsgi_param UWSGI_CHDIR /home/webapp;
uwsgi_param UWSGI_SCRIPT apprun;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
root /home/webapp;
break;
}
}
}
这里解释下
1,user root root;
前面提到 adduser www用户。我开始也是设置为www www.但是nginx读取静态文件老是没有权限,比如webapp下面的css文件。表现为页面混乱。用
chrome 分析,发现是加载不了CSS文件。提示Perssion denied 或者是permission forbidden.
即使对webapp目录,执行
chmod -R 777 ./ 和chown -R www 也没有用处。后来换成root,问题解决。
2,worker_processes 4和worker_cpu_affinity
这个主要是对nginx手动分配CPU。使其充分利用多核心
3
worker_rlimit_nofile 102400;
这个指令是指当一个nginx进程打开的最多文件描述符数目,linux下面的最多打开文件数(ulimit -n)一般是1024.这个你可以自己试验下。所以设置大一点有好处
4 listen 这个是设置为你最后访问的端口。
5,server name,因为在本机,就设置为localhost
6,第一组location下面的
root:网站文件夹根目录
uwsgi_pass
127.0
.
0.1
:
9000
; uwsgi的启动参数
uwsgi_param UWSGI_CHDIR
/home/webapp; 网站文件夹下运行的python程序的父目录。
uwsgi_param UWSGI_SCRIPT apprun; 网站文件夹下运行的python程序的名字。
7.第二组location下面的
root,主要是给出css等静态文件的父目录。比如我的css文件在/home/webapp/static/style.css.
当然,对应的html代码中的引入标识就是href="/static/style.css"
另外,这个location中对CSS等静态文件的 解析,正是需要pcre library的地方。因为用到了正则。
到目前为止,nginx和UWSGI都已经搞好了,下面我们安装web.py的支持库。
默认通过apt-get install python-webpy。即可安装完毕。但是这种方式得到的库webpy版本不一定是最新的,或者可能会遇到问题。
如果遇到问题,你可以通过
wget http://webpy.org/static/web.py-0.37.tar.gz tar -xvf web.py-0.37.tar.gz cd web.py-0.37 python setup.py build python setup.py install
用最新的版本来试验。
另外我还用到了Beautifulsoup.xlrd,wlwt等这些库。每个人根据项目自己选择。
要想uwsgi能调用apprun.py
要有以下代码
if __name__=="__main__": app.run() else : application = app.wsgifunc()
else的语句是关键。
最后工作
cd /usr/local/nginx ./sbin/nginx -s reload ./uwsgi -s 127.0.0.1:9000 -w apprun
在浏览器上输入:http://your server address:8000即可访问