uWSGI服务器提供了一个非FastCGI方法用于使用nginx Web服务器部署Python应用程序。 与nginx结合,uWSGI提供极大的稳定性,灵活性和高性能。 但是,要部署具有uWSGI和nginx的应用程序,必须手动编译包含uwsgi模块的nginx。
安装uWSGI
首先执行以下命令来更新系统并安装uWSGI的依赖关系:
- apt-get update
- apt-get upgrade
- apt-get install build-essential psmisc python-dev libxml2 libxml2-dev python-setuptools
依顺序执行以下命令以下载和编译uWSGI:
- cd /opt/
- wget http://projects.unbit.it/downloads/uwsgi-0.9.6.5.tar.gz
- tar -zxvf uwsgi-0.9.6.5.tar.gz
- mv uwsgi-0.9.6.5/ uwsgi/
- cd uwsgi/
- python setup.py install
执行以下命令以创建系统用户来运行uwsgi进程:
- adduser --system --no-create-home --disabled-login --disabled-password --group uwsgi
执行以下命令以设置所需的文件权限:
- chown -R uwsgi:uwsgi /opt/uwsgi
- touch /var/log/uwsgi.log
- chown uwsgi /var/log/uwsgi.log
编译nginx及uWSGI模块
执行以下命令来下载和编译nginx及uwsgi模块。 如果您以前从Debian软件包安装了nginx,请在此时删除它们。
- apt-get install libpcre3-dev libssl-dev
- cd /opt/
- wget http://nginx.org/download/nginx-1.0.0.tar.gz
- tar -zxvf nginx-1.0.0.tar.gz
- cd /opt/nginx-1.0.0/
- ./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-http_ssl_module
- make
- make install
- adduser --system --no-create-home --disabled-login --disabled-password --group nginx
- wget -O init-deb.sh http://www.linode.com/docs/assets/682-init-deb.sh
- mv init-deb.sh /etc/init.d/nginx
- chmod +x /etc/init.d/nginx
- /usr/sbin/update-rc.d -f nginx defaults
- /etc/init.d/nginx start
配置uWSGI
执行以下命令以下载init脚本来管理uWSGI进程,位于/etc/init.d/uwsgi:
- cd /opt/
- wget -O init-deb.sh http://www.linode.com/docs/assets/683-uwsgi-init-deb.sh
- mv /opt/init-deb.sh /etc/init.d/uwsgi
- chmod +x /etc/init.d/uwsgi
创建/etc/default/uwsgi文件用来存放Python应用程序的特定设置。 MODULE指定包含wsgi规范的Python模块的名称。 考虑下面的例子:
/etc/default/uwsgi:
- PYTHONPATH=/srv/www/example.com/application
- MODULE=wsgi_configuration_module
如果要部署“Hello World”应用程序,请将以下代码插入到/srv/www/example.com/application/wsgi配置module.py文件中:
/srv/www/example.com/application/wsgi_configuration_module.py:
- import os
- import sys
-
- sys.path.append('/srv/www/example.com/application')
-
- os.environ['PYTHON_EGG_CACHE'] = '/srv/www/example.com/.python-egg'
-
- def application(environ, start_response):
- status = '200 OK'
- output = 'Hello World!'
-
- response_headers = [('Content-type', 'text/plain'),
- ('Content-Length', str(len(output)))]
- start_response(status, response_headers)
-
- return [output]
执行以下命令使此初始化脚本可执行,确保WSGI在下一个重新启动后重新启动,并启动服务:
- /usr/sbin/update-rc.d -f uwsgi defaults
- /etc/init.d/uwsgi start
配置nginx
为uWSGI应用程序的站点创建类似于以下内容的nginx服务器配置:
- server {
- listen 80;
- server_name www.example.com example.com;
- access_log /srv/www/example.com/logs/access.log;
- error_log /srv/www/example.com/logs/error.log;
-
- location / {
- include uwsgi_params;
- uwsgi_pass 127.0.0.1:9001;
- }
-
- location /static {
- root /srv/www/example.com/public_html/static/;
- index index.html index.htm;
- }
- }
所有以/static结尾的网址请求都会直接从/srv/www/example.com/public_html/static目录提供。 通过执行以下命令重新启动Web服务器:
- /etc/init.d/nginx restart