Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor

Wesley13 等级 147 0 0

前提条件

在我们开始安装Nginx及其他所需软件之前先安装一些前提软件。首先,我们需要PIP与virtualenv:

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

Nginx

安装并运行Nginx:

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

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

sudo pip install uwsgi

里程碑 #1

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

Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor

示例应用

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

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

让我们执行我们刚创建的脚本:

python hello.py

现在你可以通过浏览器访问你服务器的8080端口,看,应用生效了:

Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor

注意:因为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地址,你会看到一个错误:

Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor

别担心,这个错误是正常的,它代表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进程了:

Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor

我们现在基本完成了,唯一剩下的事情是配置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 基本配置文件注意事项

收藏
评论区

相关推荐

Ubuntu 安装uwsgi出错
1、分析了下,感觉是gcc除了问题,百度了一下,发现有类似的解决办法,记录一下。 Collecting uwsgi Using cached https://files.pythonhosted.org/packages/a2/c9/a2d5737f63cd9df4317a4acc15d1ddf4952e28398601d8d7d706
Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor
前提条件 在我们开始安装Nginx及其他所需软件之前先安装一些前提软件。首先,我们需要PIP与virtualenv: sudo apt-get install python-setuptools sudo easy_install pip sudo pip install virtualenv Nginx ----- 安装并运
ubuntu NGINX uwsgi https 部署Django 遇到的问题
搞了3天终于把Django成功部署到Ubuntu,记录一下; 引用来自[泡泡茶壶](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fblog.csdn.net%2Fbreavo_raw): [Ubuntu下的Nginx + Uwsgi + Django项目部署详细流程](https://
uwsgi 报错
[root@localhost ~]# sudo python3 -m pip install uwsgi Collecting uwsgi Using cached https://files.pythonhosted.org/packages/98/b2/19b34b20662d111f7d2f926cdf10e1338176
uwsgi+django 配置
uwsgi+django ------------ 1. 创建新的虚拟环境,且解决crm的环境依赖 2. 在虚拟环境下安装uwsgi pip3 install uwsgi 3. 学习uwsgi命令,如何启动python应用 启动python web文件 创建一个test.py写入如下代
Django + Uwsgi + Nginx 实现生产环境部署
本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx ### 如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。 ### uwsgi介绍 uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。N
Django + Uwsgi + Nginx 的生产环境部署
Django + Uwsgi + Nginx 的生产环境部署 参考网址: [https://www.cnblogs.com/chenice/p/6921727.html](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Fchenice%2Fp%2F
Django 多进程多线程的一些个人理解
### 一、Django 开发环境与生产环境 ##### 开发/调试 python manage.py runserver 0.0.0.0:8080 ##### 生产环境 Nginx + uWSGI + supervisor > 生产环境不用 `python manage.py runserver 0.0.0.0:8080` 的原
Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)
**项目部署教程** [在线演示](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2F139.199.131.146%2F) ### **1.1.原理介绍** django *  一个基于python的开源web框架 uwsgi *  一是一个web服务器,也可以当做中间件
Django3.0 + nginx + uwsgi 部署
CentOS7.6 下部署Django3.0应用,使用nginx+uwsgi部署: **1\. uwsgi部署** pip install uwsgi 在项目的根目录中,新建文件夹 conf, 然后进入conf文件夹,并新建文件 uwsgi.ini, 内容如下: # mysite_uwsgi.ini file [uws
Docker部署Django+nginx+uwsgi环境
Cenos7环境下使用Docker部署Django+nginx+uwsgi环境 --------------------------------------- **一、系统要求** ----------   此处略,[详见](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnb
Flask + Gunicorn + Nginx 部署
最近很多朋友都在问我关于 Flask 部署的问题,说实在的我很乐意看到和回答这样的问题,至少证明了越来越多人开始用 Flask 了。 之前我曾发表过一篇在 Ubuntu 上用 uwsgi + nginx 的 Flask 部署方法,说实在的 uwsgi 是个大坑可能用在 Django 上还好吧,不过用在 Flask 上未必就如此。至少 , uwsgi 是个极
Nginx+uWSGI+Django原理
Python的Web开发中,如果使用Django框架,那么较为成熟稳定的服务器架构一般是Nginx+uWSGI+Django。而为什么一定要三个结合在一起呢?直接使用Django的runserver来启动服务器进程,或者uWSGI+Django可不可以呢?为什么?  **概念说明:** * APP(应用程序),就是开发者写的应用程序,例如djang
Nginx+uwsgi+ssl配置https
使用原始django,太过于笨重和杂多 nginx是一个轻量级的web服务器,在处理静态资源和高并发有优势 uwsgi是一个基于python的高效率的协议,处理后端和动态网页有优势 所以这里采用静态网页交给nginx解析,动态网页交给uwsgi解析,并且nginx配置ssl,即可以使用出高安全,高效率的部署。 **步骤** 我
Nginx与uWSGI交互
1\. 更改uwsgi的配置文件uwsgi.ini [uwsgi] ... #使用nginx连接时, 监控地址 socket=127.0.0.1:8080 #直接做web服务器时, 所监控地址 #http=127.0.0.1:8080 2\. 在nginx配置文件中的路由模块添加uwsgi支持.