Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器
<p>之前一直使用nginx+fastcgi来搭建python web服务器,本文介绍nginx+uwsgi组合来实现。uwsgi 是一个快速的、纯c语言开发的、自维护的、对开发者友好的wsgi服务器,旨在提供专业的 python web应用发布和开发。它更符合python web的标准协议,速度要比fastcgi要快、性能更加稳定。</p>
<p>
<strong>一、安装平台</strong><br>
1、安装pcre</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code67501">
<br>
cd /home<br>
mkdir -p /home/install/nginx && cd /home/install/nginx<br>
wget http://ftp.exim.llorien.org/pcre/pcre-8.00.tar.gz<br>
tar -zxvf pcre-8.00.tar.gz<br>
cd pcre-8.00<br>
./configure<br>
make && make install<br>
cd ..</div>
<p>
</p>
<p>
2、安装nginx</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code59215">
<br>
wget http://nginx.org/download/nginx-0.8.50.tar.gz<br>
tar -zxvf nginx-0.8.50.tar.gz<br>
cd nginx-0.8.50/<br>
./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-cc-opt='-o3' --with-cpu-opt=opteron<br>
make && make install<br>
cd ..</div>
<p>
</p>
<p>
3、安装python&mysql-python</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code37189">
<br>
wget http://www.python.org/ftp/python/2.5.1/python-2.5.1.tgz<br>
tar -zxvf python-2.5.1.tgz<br>
cd python-2.5.1<br>
./configure && make && make install<br>
echo "export path=\$path:/usr/local/bin" >> /etc/profile<br>
source /etc/profile</div>
<p>
</p>
<p>
4、安装mysql-python</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code76710">
<br>
cd ../<br>
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.2/mysql-python-1.2.2.tar.gz?r=&ts=1285248455&use_mirror=nchc<br>
cd mysql-python-1.2.2<br>
python setup.py install</div>
<p>
</p>
<p>
5、安装django</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code58147">
<br>
wget http://www.djangoproject.com/download/1.2.3/tarball/<br>
tar -zxvf django-1.2.3.tar.gz<br>
cd django-1.2.3<br>
python setup.py install<br>
cd ..</div>
<p>
</p>
<p>
6、安装uwsgi</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code40393">
<br>
wget http://projects.unbit.it/downloads/uwsgi-0.9.6.2.tar.gz<br>
tar -zxvf uwsgi-0.9.6.2.tar.gz<br>
cd uwsgi-0.9.6.2<br>
make<br>
cp uwsgi /usr/bin</div>
<p>
</p>
<p>
<strong>二、平台配置</strong></p>
<p>
1、平台环境说明<br>
1.1、项目位置:/opt/www/purgesys<br>
创建项目方法:</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code67096">
<br>
cd /opt/www<br>
django-admin.py startproject purgesys</div>
<p>
</p>
<p>
1.2、查看项目(出现以下文件结构说明项目已创建成功)<br>
#tree purgesys</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code86986">
<br>
purgesys<br>
|-- __init__.py<br>
|-- manage.py<br>
|-- settings.py<br>
`-- urls.py</div>
<p>
</p>
<p>
2、nginx相关配置</p>
<p>
#cd /usr/local/nginx/conf<br>
#vi django_uwsgi.conf</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_667462">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain"># django project</code>
</div>
<div class="line number2 index1 alt1">
<code class="plain plain">server {</code>
</div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain">listen 80;</code>
</div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain">server_name purgesys.domain.com;</code>
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">location / {</code>
</div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain">uwsgi_pass 127.0.0.1:9000;</code>
</div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain">include uwsgi_params;</code>
</div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">access_log off;</code>
</div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code><code class="plain plain">}</code>
</div>
<div class="line number12 index11 alt1">
</div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain">location ^~ /static {</code>
</div>
<div class="line number14 index13 alt1">
<code class="plain spaces"> </code><code class="plain plain">root /opt/www/purgesys;</code>
</div>
<div class="line number15 index14 alt2">
<code class="plain spaces"> </code><code class="plain plain">}</code>
</div>
<div class="line number16 index15 alt1">
</div>
<div class="line number17 index16 alt2">
<code class="plain spaces"> </code><code class="plain plain">location ^~ /admin/ {</code>
</div>
<div class="line number18 index17 alt1">
<code class="plain spaces"> </code><code class="plain plain">uwsgi_pass 127.0.0.1:9000;</code>
</div>
<div class="line number19 index18 alt2">
<code class="plain spaces"> </code><code class="plain plain">include uwsgi_params;</code>
</div>
<div class="line number20 index19 alt1">
<code class="plain spaces"> </code><code class="plain plain">access_log off;</code>
</div>
<div class="line number21 index20 alt2">
<code class="plain spaces"> </code><code class="plain plain">}</code>
</div>
<div class="line number22 index21 alt1">
</div>
<div class="line number23 index22 alt2">
<code class="plain spaces"> </code><code class="plain plain">location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ {</code>
</div>
<div class="line number24 index23 alt1">
<code class="plain spaces"> </code><code class="plain plain">root /opt/www/purgesys/static;</code>
</div>
<div class="line number25 index24 alt2">
<code class="plain spaces"> </code><code class="plain plain">access_log off;</code>
</div>
<div class="line number26 index25 alt1">
<code class="plain spaces"> </code><code class="plain plain">}</code>
</div>
<div class="line number27 index26 alt2">
</div>
<div class="line number28 index27 alt1">
<code class="plain plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
*nginx-0.8.50默认已添加uwsgi输出头支持<br><span>include uwsgi_params;</span></p>
<p>
#vi nginx.conf<br>
追加子配置文件django_uwsgi.conf</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_513748">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">http{ </code>
</div>
<div class="line number2 index1 alt1">
<code class="plain plain">........ </code>
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">include django_uwsgi.conf; </code>
</div>
<div class="line number4 index3 alt1">
<code class="plain plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
3、uwsgi配置<br>
#mkdir -p /home/uwsgi;cd /home/uwsgi<br>
#mkdir -p /opt/www/logs<br>
#echo "" > /opt/www/logs/django.log<br>
#vi uwsgi.xml</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_676420">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain"><uwsgi></code>
</div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code><code class="plain plain"><socket>127.0.0.1:9000</socket></code>
</div>
<div class="line number3 index2 alt2">
<code class="plain spaces"> </code><code class="plain plain"><listen>200</listen></code>
</div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code><code class="plain plain"><master>true</master></code>
</div>
<div class="line number5 index4 alt2">
<code class="plain spaces"> </code><code class="plain plain"><pidfile>/usr/local/nginx/uwsgi.pid</pidfile></code>
</div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain"><processes>8</processes></code>
</div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain"><pythonpath>/opt/www/purgesys</pythonpath></code>
</div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code><code class="plain plain"><pythonpath>/opt/www/</pythonpath></code>
</div>
<div class="line number9 index8 alt2">
<code class="plain spaces"> </code><code class="plain plain"><module>django_wsgi</module></code>
</div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain"><profiler>true</profiler></code>
</div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code><code class="plain plain"><memory-report>true</memory-report></code>
</div>
<div class="line number12 index11 alt1">
<code class="plain spaces"> </code><code class="plain plain"><enable-threads>true</enable-threads></code>
</div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain"><logdate>true</logdate></code>
</div>
<div class="line number14 index13 alt1">
<code class="plain spaces"> </code><code class="plain plain"><limit-as>6048</limit-as></code>
</div>
<div class="line number15 index14 alt2">
<code class="plain spaces"> </code><code class="plain plain"><daemonize>/opt/www/logs/django.log</daemonize></code>
</div>
<div class="line number16 index15 alt1">
<code class="plain plain"></uwsgi></code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
4、创建应用模块<br>
cd /opt/www/purgesys<br>
vi django_wsgi.py</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_714740">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">import os</code>
</div>
<div class="line number2 index1 alt1">
<code class="plain plain">os.environ['django_settings_module'] = 'purgesys.settings'</code>
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">import django.core.handlers.wsgi</code>
</div>
<div class="line number4 index3 alt1">
<code class="plain plain">application = django.core.handlers.wsgi.wsgihandler()</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
5、启动服务<br>
#/usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
#/usr/local/nginx/sbin/nginx</p>
<p>
6、查看进程<br>
## ps -ef|grep uwsgi|grep -v grep</p>
<p>
</p>
<div class="codetitle">
<span><u>复制代码</u></span> 代码如下:</div>
<div class="codebody" id="code53874">
<br>
root 21652 1 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21653 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21654 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21655 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21656 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21657 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21658 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21659 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br>
root 21660 21652 0 17:12 ? 00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml</div>
<p>
</p>
<p>
7、监听端口<br>
## netstat -an|grep 9000<br>
引用</p>
<p>
tcp 0 127.0.0.1:9000 0.0.0.0:* listen</p>
<p>
8、访问测试<br>
输入http://serverip/</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器" alt="Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器" src="https://zhuji.jb51.net/uploads/img/202305/c888243cce7584c5c5ed30f070f59592.jpg"></p>
<p>
大功告成!</p>
<p>
*附uwsgi启动脚本<br>
#cd /home/uwsgi<br>
#vi uwsgiserver.sh</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_420540">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash preprocessor bold">#!/bin/bash</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash keyword">if</code> <code class="bash plain">[ $1 = start ];</code><code class="bash keyword">then</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash spaces"> </code><code class="bash plain">psid=`</code><code class="bash functions">ps</code> <code class="bash plain">aux|</code><code class="bash functions">grep</code> <code class="bash string">"uwsgi"</code><code class="bash plain">|</code><code class="bash functions">grep</code> <code class="bash plain">-</code><code class="bash functions">v</code> <code class="bash string">"grep"</code><code class="bash plain">|</code><code class="bash functions">wc</code> <code class="bash plain">-l`</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash spaces"> </code><code class="bash keyword">if</code> <code class="bash plain">[ $psid -gt 2 ];</code><code class="bash keyword">then</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash spaces"> </code><code class="bash functions">echo</code> <code class="bash string">"uwsgi is running!"</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash spaces"> </code><code class="bash functions">exit</code> <code class="bash plain">0</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash spaces"> </code><code class="bash keyword">else</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash spaces"> </code><code class="bash plain">/usr/bin/uwsgi</code> <code class="bash plain">-x </code><code class="bash plain">/home/uwsgi/uwsgi</code><code class="bash plain">.xml</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash spaces"> </code><code class="bash keyword">fi</code>
</div>
<div class="line number10 index9 alt1">
<code class="bash spaces"> </code><code class="bash functions">echo</code> <code class="bash string">"start uwsgi service "</code>
</div>
<div class="line number11 index10 alt2">
<code class="bash keyword">elif</code> <code class="bash plain">[ $1 = stop ];</code><code class="bash keyword">then</code>
</div>
<div class="line number12 index11 alt1">
<code class="bash spaces"> </code><code class="bash plain">killall -9 uwsgi</code>
</div>
<div class="line number13 index12 alt2">
<code class="bash spaces"> </code><code class="bash functions">echo</code> <code class="bash string">"stop uwsgi service "</code>
</div>
<div class="line number14 index13 alt1">
<code class="bash keyword">elif</code> <code class="bash plain">[ $1 = restart ];</code><code class="bash keyword">then</code>
</div>
<div class="line number15 index14 alt2">
<code class="bash spaces"> </code><code class="bash plain">killall -9 uwsgi</code>
</div>
<div class="line number16 index15 alt1">
<code class="bash spaces"> </code><code class="bash plain">/usr/bin/uwsgi</code> <code class="bash plain">-x </code><code class="bash plain">/home/uwsgi/uwsgi</code><code class="bash plain">.xml</code>
</div>
<div class="line number17 index16 alt2">
<code class="bash spaces"> </code><code class="bash functions">echo</code> <code class="bash string">"restart uwsgi service "</code>
</div>
<div class="line number18 index17 alt1">
<code class="bash keyword">else</code>
</div>
<div class="line number19 index18 alt2">
<code class="bash spaces"> </code><code class="bash functions">echo</code> <code class="bash string">"usages: sh uwsgiserver.sh "</code>
</div>
<div class="line number20 index19 alt1">
<code class="bash keyword">fi</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
#sh uwsgiserver.sh start<br>
parsing config file /home/uwsgi/uwsgi.xml<br>
start uwsgi service </p>
<p>
如大家有什么疑问或感兴趣的话题可以通过weibo与我交流:http://t.qq.com/yorkoliu</p>
<p>
<span>以下是补充:</span></p>
<p>
1、mysql-python 安装错误如下<br>
from setuptools import setup importerror:</p>
<p>
先安装<br>
python ez_setup.py</p>
<p>
在安装<br>
python setup.py install</p>
<p>
贴一下,方便其他兄弟了</p>
<p>
2、我的nginx+uwsgi+django遇到大header的request,经常出现502,uwsgi报的是 invalid request header size,何解我的uwsgi配置为socket = :8010master = truemodule = django_wsgiprocesses = 8home = /path/to/virtualenvharakiri = 20daemonize = /path/to/uwsgi.logpidfile = /path/to/uwsgi.pidpythonpath = /path/to/projectpythonpath = /path/to/uwsgibuffer-size = 32768reload-mercy = 8max-requests = 5000socket-timeout = 4</p>
<p>
解决方法:大header可以修改nginx http head部分参数。</p>
<p>
3、nginx报502,但是uwsgi正常启动端口9000也正常监听。有可能是应用程序有错误导致。</p>
頁:
[1]