Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor

前提条件python

在咱们开始安装Nginx及其余所需软件以前先安装一些前提软件。首先,咱们须要PIP与virtualenv:nginx

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install virtualenv

Nginx

安装并运行Nginx:web

sudo apt-get install nginx
sudo /etc/init.d/nginx start

Nginx是一个提供静态文件访问的web服务,然而,它不能直接执行托管Python应用程序,而uWSGI解决了这个问题。让咱们先安装uWSGI,稍候再配置Nginx和uWSGI之间的交互。flask

sudo pip install uwsgi

里程碑 #1

打开浏览器访问你的服务器,你应该能看到Nginx欢迎页:ubuntu

示例应用

咱们将托管的应用是经典的“Hello, world!”。这个应用只有一个页面,已经猜到页面上将有什么内容了吧。将全部应用相关的文件存放在/var/www/demoapp文件夹中。下面建立这个文件夹并在其中初始化一个虚拟环境:segmentfault

sudo mkdir /var/www
sudo mkdir /var/www/demoapp

因为咱们使用root权限建立了这个文件夹,它目前归root用户全部,让咱们更改它的全部权给你登陆的用户(个人例子中是ubuntu)浏览器

sudo chown -R ubuntu:ubuntu /var/www/demoapp/

建立并激活一个虚拟环境,在其中安装Flask:安全

cd /var/www/demoapp
virtualenv venv
. venv/bin/activate
pip install flask

 

使用下面的代码建立hello.py文件:服务器

from flask import Flask
app = Flask(__name__)

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

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)

 

里程碑 #2

让咱们执行咱们刚建立的脚本:app

python hello.py

 

如今你能够经过浏览器访问你服务器的8080端口,看,应用生效了:

注意:由于80端口已被Nginx使用,这里我使用8080端口。

如今应用是由Flask内置的web服务托管的,对于开发和调试这确实是个不错的工具,但不推荐在生产环境中使用。让咱们配置Nginx来挑起这个重担吧。

配置Nginx

首先删除掉Nginx的默认配置文件:

sudo rm /etc/nginx/sites-enabled/default

 

注意:若是你安装了其余版本的Nginx,默认配置文件可能在/etc/nginx/conf.d文件夹下。

建立一个咱们应用使用的新配置文件/var/www/demoapp/demoapp_nginx.conf:

server {
    listen      80;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;
    }
}

 

将刚创建的配置文件使用符号连接到Nginx配置文件文件夹中,重启Nginx:

sudo ln -s /var/www/demoapp/demoapp_nginx.conf /etc/nginx/conf.d/
sudo /etc/init.d/nginx restart

 

里程碑 #3

访问服务器的公共ip地址,你会看到一个错误:

别担忧,这个错误是正常的,它表明Nginx已经使用了咱们新建立的配置文件,但在连接到咱们的Python应用网关uWSGI时遇到了问题。到uWSGI的连接在Nginx配置文件的第10行定义:

uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;

 

这表明Nginx和uWSGI之间的连接是经过一个socket文件,这个文件位于/var/www/demoapp/demoapp_uwsgi.sock。由于咱们尚未配置uWSGI,因此这个文件还不存在,所以Nginx返回“bad gateway”错误,让咱们立刻修正它吧。

配置uWSGI

建立一个新的uWSGI配置文件/var/www/demoapp/demoapp_uwsgi.ini:

[uwsgi]
#application's base folder
base = /var/www/demoapp

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

home = %(base)/venv
pythonpath = %(base)

#socket file's location
socket = /var/www/demoapp/%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

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

 

建立一个新文件夹存放uWSGI日志,更改文件夹的全部权:

sudo mkdir -p /var/log/uwsgi
sudo chown -R ubuntu:ubuntu /var/log/uwsgi

 

里程碑 #4

执行uWSGI,用新建立的配置文件做为参数:

uwsgi --ini /var/www/demoapp/demoapp_uwsgi.ini

 

接下来访问你的服务器,如今Nginx能够链接到uWSGI进程了:

咱们如今基本完成了,惟一剩下的事情是配置uWSGI在后台运行,这是uWSGI Emperor的职责。

 

uWSGI Emperor

uWSGI Emperor (很拉风的名字,是不?) 负责读取配置文件而且生成uWSGI进程来执行它们。建立一个初始配置来运行emperor

新建/etc/systemd/system/emperor.uwsgi.service文件,代码以下:

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
#uwsgi 服务的路径,以及须要启动的 ini 文件路径,根据本身的实际状况进行修改
ExecStart=/usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

上述代码中,/etc/uwsgi/emperor.ini 文件的代码以下:

[uwsgi]
emperor = /etc/uwsgi/vassals
uid = www-data
gid = www-data

把网站的 uwsgi.ini 文件要给个软链,加到 /etc/uwsgi/vassals/ 文件夹中:

sudo mkdir /etc/uwsgi && sudo mkdir /etc/uwsgi/vassals
sudo ln -s /var/www/demoapp/demoapp_uwsgi.ini /etc/uwsgi/vassals

同时,最后一行说明用来运行守护进程的用户是www-data。为简单起见,将这个用户设置成应用和日志文件夹的全部者。

sudo chown -R www-data:www-data /var/www/demoapp/
sudo chown -R www-data:www-data /var/log/uwsgi/

注意:咱们先前安装的Nginx版本使用“www-data”这个用户来运行Nginx,其余Nginx版本的可能使用“Nginx”这个替代用户。

因为Nginx和uWSGI都由同一个用户运行,咱们能够在uWSGI配置中添加一个安全提高项。打开uWSGI配置文件,将chmod-socket值由666更改成644:

...
#permissions for the socket file
chmod-socket    = 644

运行服务、中止服务、状态查询:

systemctl start emperor.uwsgi.service
systemctl stop emperor.uwsgi.service
systemctl status emperor.uwsgi.service 

 

参考文章,

感谢分享

在 Ubuntu 上使用 Nginx 部署 Flask 应用

Debian8 + Flask + Nginx + uWSGI + uWSGI Emperor 基本配置文件注意事项

相关文章
相关标签/搜索