nginx+uWSGI+flask 服务器部署

Updated on 31 Aug 2016

写在前面

-该部署是在Ubuntu 14.04.2完成
-参考文献
-更多配置文档说明
NGINX
uWSGI
flask
virtualenv

准备活动

1.安装nginx

sudo apt-get install nginx
运行nginx服务器
sudo nginx
打开浏览器,输入localhost,如果服务器启动成功则出现nginx欢迎界面

PS:如果出现端口已经使用的错误,一般是没有正常退出导致的,使用下面命令,80可以为其他端口号。
sudo fuser -k 80/tcp

关闭nginx服务器
sudo nginx -s stop

2.安装python虚拟环境

安装virtualenv
sudo pip install virtualenv
安装virtualenvwrapper
sudo pip install virtualenvwrapper
**PS: virtualenvwrapper provides a set of commands which makes working with virtual environments much more pleasant. **

设置环境变量和初始化
export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh
创建虚拟环境
mkvirtualenv venv
进入/切换虚拟环境,刚创建完默认是进入的
workon venv
退出虚拟环境
deactivate
删除虚拟环境,只有退出当前环境才能删除环境
rmvirtualenv venv
注意因为我们要使用python的版本是python3.4所以重新做一下操作
mkvirtualenv -p python3 venv
测试python版本
python -V

3.安装flask

进入虚拟环境后使用pip3确保安装的flask是支持python3的
pip3 install flask

4.安装uwsgi

首先安装C编译器
apt-get install build-essential python
And if you want to build a binary with python/wsgi support
apt-get install python-dev
同样的操作对于python3
sudo apt-get install python3-dev
使用pip3来安装
pip3 install uwsgi
Exception: you need a C compiler to build uWSGI解决方法:
export CC=gcc
查看已经安装的python包
pip list

5.创建项目目录

sudo mkdir /var/www;sudo mkdir /var/www/mysite
赋予牛逼的权限
sudo chmod -R 777 /var/www/mysite

CONFIG

1.配置nginx

跳转到项目目录下
cd /var/www/mysite
编辑文件
vim mysite_nginx.conf
mysite_nginx.conf:

server {
    listen          8888;
    server_name     localhost;
    charset         utf-8;
    client_max_body_size  75M;
    error_log      /var/www/mysite/logs/error.log warn;
    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include          uwsgi_params;
        uwsgi_pass       unix:/var/www/mysite/mysite_uwsgi.sock;
    }
    location /static/ {
    root /var/www/mysite/;
    }
}

生成软链接,将nginx的配置文件和我们项目目录下的文件绑定起来
sudo ln -s /var/www/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

2.配置uwsgi

uwsgi python3 插件
下载安装包
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
解压
tar zxvf uwsgi-latest.tar.gz
进入安装包目录
cd <dir>
执行python脚本
python uwsgiconfig.py --plugin plugins/python core python34
将文件 python34_plugin.so放在项目目录下
之后就可以将tar文件和uwsgi-2.0.11.2(名字可能变化)文件删掉了

在项目目录下 编辑文件
vim mysite_uwsgi.ini

[uwsgi]
#set python version
plugin = python34
#application base folder
base = /var/www/mysite

#python module to import
app = hello
module = %(app)

#socket file's location
socket = /var/www/mysite/%n.sock

#permissions for the socket file
chmod-socket = 666

#the variable that holds a flask application inside the module  imported at line #6
callable = app

master = true
#number of thread
processes = 4

#clean up the socket when the process stops
vacuum = true

#to avoid ImportError
no-site = true

#location of log files
logto = /var/www/mysite/log/uwsgi/%n.log

3.配置flask

编辑文件(注意python中的对齐)
vim hello.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__== "__main__":
    app.run(debug=True)

日志和静态文件

在项目目录下
mkdir logs; mkdir logs/uwsgi; mkdir static; touch /logs/error.log

最后一步:开启服务器

sudo nginx
uwsgi --ini mysite_uwsgi.ini
进入localhost:8888查看结果,返回Hello World说明部署成功


存在的问题:缺包

解决办法(#简单粗暴的办)法

首先下载python3.4.3的包
wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
解压缩
tar xzf Python-3.4.3.tgz
把python3.4.3的所有包拷贝到我们虚拟环境venv的python包下
cp -R Python-3.4.3/Lib/* ~/Envs/venv/lib/python3.4/
在mysite_uwsgi.ini文件中加入一行内容
pythonpath = /home/yubokai/Envs/venv/lib/python3.4/site-packages
其中,把‘yubokai’换成你的用户名,uwsgi无法识别‘~’符号 = =
以上操作完成就可以把Python3.4.3的tgz文件和Python3.4.3源文件删掉了

再次运行以下命令,bingo!!!!
uwsgi --ini mysite_uwsgi.ini


终端启动项设置

为了使下次登录终端的时候能找得到virtualenvwrapper的命令,将以下shell代码添加到 ~/.bashrc文件

source /usr/local/bin/virtualenvwrapper.sh
export WORKON_HOME=~/Envs

数据库相关

PostgreSQL 上网下载PostgreSQL最新稳定版
安装下列包
sudo apt-get install libpg-dev
如果安装libpg-dev时遇到了E: Unable to locate package libpg-dev的报错则先执行
sudo apt-get remove libpq5
安装好libpg-dev后
pip install psycopg2
Mac OS X用户可能遇到的问题(Linux用户可以忽略)
**Install libpq-dev **
PATH=$PATH:/Library/PostgreSQL/9.4/bin/
软链接防止not image found 错误(Linux用户可以忽略)
sudo ln -s /Library/PostgreSQL/9.3/lib/libssl.1.0.0.dylib /usr/local/lib/
sudo ln -s /Library/PostgreSQL/9.3/lib/libcrypto.1.0.0.dylib /usr/local/lib/

其他(如果你手滑nginx玩坏了)

完全删除nginx
rm -rf /etc/nginx
rm -rf /usr/sbin/nginx
rm /usr/share/man/man1/nginx.1.gz
apt-get remove nginx* (apt-get remove --purge nginx)

sudo apt-get remove nginx #Removes all but config files.
sudo apt-get purge nginx #Removes everything.
重新安装
apt-get purge nginx nginx-common nginx-full
apt-get install nginx

错误排查

有一天在调试的时候发生了502错误,uWSGI的报错是:
upstream prematurely closed connection while reading response header from upstream
最后发现不是配置文件的的问题,而是数据库连接问题