这部分主要介绍如何搭建uWSGI+Ngnix环境来运行Python应用。
uWSGI
uWSGI是一个web服务器,实现了WSGI协议,uwsgi协议、http协议等。uWSGI旨在为部署分布式集群的网络应用开发一套完整的解决方案。主要面向web及其标准服务。由于其可扩展性,能够被无限制的扩展用来支持更多平台和语言。
uWSGI的主要特点是:
- 超快的性能
- 低内存占用
- 多app管理
- 详尽的日志功能(可以用来分析app的性能和瓶颈)
- 高度可定制(内存大小限制,服务一定次数后重启等)
uWSGI服务器自己实现了基于uwsgi协议的server部分,我们只需要在uwsgi的配置文件中指定application的地址,uWSGI就能直接和应用框架中的WSGI application通信。
Ngnix
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
部署
1.搭建虚拟环境
- 安装virtualenv
sudo apt-get update
sudo apt-get install python-dev
sudo pip install virtualenv
- 如果代码已上传至github,可直接通过git clone http:项目地址,将代码拉取到本地。
- 创建虚拟环境
virtualenv myprojectenv
- 激活虚拟环境
source myprojectenv/bin/activate
2.安装Flask及相关依赖
pip install flask
先安装相关依赖
sudo apt-get install libcairo2-dev libffi-dev libpango-1.0-0
sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
将项目中的requirement.txt导出,安装requirement.txt中的相关依赖
pip install -r requirements.txt
3.配置uWSGI
- 安装包
sudo apt-get install uwsgi
4.配置uwsgi
- 创建配置文件
nano ~/myproject/myproject.ini
文件内容
[uwsgi]
module = wsgi:application
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true
- 创建自动启动文件,保证在服务器重启之后程序还可以正常运行
sudo nano /etc/init/myproject.conf
文件内容
description "uWSGI server instance configured to serve myproject"
start on runlevel [2345]
stop on runlevel [!2345]
setuid demo
setgid www-data
env PATH=/home/demo/myproject/myprojectenv/bin
chdir /home/demo/myproject
exec uwsgi --ini myproject.ini
- 保存退出后,启动配置
sudo start myproject
5.配置Nginx
- 安装包
sudo apt-get install python-dev nginx
- 配置Nginx
sudo nano /etc/nginx/sites-available/myproject
文件内容:
server {
listen 80;
server_name 服务器地址或域名;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/demo/myproject/myproject.sock;
}
}
监听服务器的80端口,也就是我们浏览器一般会访问的端口。
- 保存退出,链接文件,保证配置成功:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
- 删除默认的配置文件
sudo rm /etc/nginx/sites-available/default
- 测试一下Nginx配置是否正常
sudo nginx -t
没有错误之后重启nginx
sudo service nginx restart