GVKun编程网logo

uwsgi + nginx + flask: upstream prematurely closed

26

如果您对uwsgi+nginx+flask:upstreamprematurelyclosed感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解uwsgi+nginx+flask:upstream

如果您对uwsgi + nginx + flask: upstream prematurely closed感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解uwsgi + nginx + flask: upstream prematurely closed的各种细节,此外还有关于CentOS 下用 Nginx 和 uwsgi 部署 flask 项目、CentOS 傻瓜式部署uWSGI + nginx + flask、debian10+Nginx+Flask+uWSGI+uWSGI Emperor配置流程、Debian8 + Flask + Nginx + uWSGI + uWSGI Emperor 基本配置文件注意事项的实用技巧。

本文目录一览:

uwsgi + nginx + flask: upstream prematurely closed

uwsgi + nginx + flask: upstream prematurely closed

我在烧瓶上创建了一个端点,该端点从数据库查询(远程数据库)生成电子表格,然后将其作为下载内容发送到浏览器中。Flask不会抛出任何错误。Uwsgi没有抱怨。

但是当我检查nginx的error.log时,我看到了很多

2014/12/10 05:06:24 [错误] 14084#0:* 239436上游过早关闭连接,同时从上游读取响应头,客户端:34.34.34.34,服务器:me.com,请求:“ GET / download / export .csv HTTP / 1.1”,上游:“ uwsgi://0.0.0.0:5002”,主机:“ me.com”,引荐来源网址:“ https://me.com/download/export.csv ”

我像部署uwsgi

uwsgi --socket 0.0.0.0:5002 --buffer-size=32768 --module server --callab app

我的nginx配置:

server {     listen 80;     merge_slashes off;     server_name me.com www.me.cpm;     location / { try_files $uri @app; }       location @app {          include uwsgi_params;          uwsgi_pass 0.0.0.0:5002;          uwsgi_buffer_size 32k;          uwsgi_buffers 8 32k;          uwsgi_busy_buffers_size 32k;     }}server {      listen 443;      merge_slashes off;      server_name me.com www.me.com;    location / { try_files $uri @app; }       location @app {          include uwsgi_params;          uwsgi_pass 0.0.0.0:5002;          uwsgi_buffer_size 32k;          uwsgi_buffers 8 32k;          uwsgi_busy_buffers_size 32k;       }}

这是nginx或uwsgi问题,还是两者都有?

答案1

小编典典

更改nginx.conf以包括

sendfile        on;client_max_body_size 20M;keepalive_timeout  0;

CentOS 下用 Nginx 和 uwsgi 部署 flask 项目

CentOS 下用 Nginx 和 uwsgi 部署 flask 项目

前几天利用flask 写了几个调用salt-api 的接口,需要上线到正式环境,搜了一下 都是 用 nginx + uwsgi 来部署,这里记录下关键的配置项。

1.首先将代码上传到服务器上目录为:

/home/www/wwwroot/salt-api

2.配置服务器代理

使用的代理一共有两个,nginx和uwsgi,先说明一下,如果不用nginx一样可以访问你的项目,使用nginx的目的是为了安全和负载均衡。配置了nginx做前端代理,uwsgi作后端代理的服务器(这里所说的前后端都是相对的位置,并无实际含义),在处理来自Internet的请求时,要先经过nginx的处理,nginx把请求再交给uwsgi,经过uwsgi才能访问到项目本身。

没有nginx而只有uwsgi的服务器,则是Internet请求直接由uwsgi处理,并反馈到我们的项目中。
nginx可以实现安全过滤,防DDOS等保护安全的操作,并且如果配置了多台服务器,nginx可以保证服务器的负载相对均衡。

而uwsgi则是一个web服务器,实现了WSGI协议(Web Server Gateway Interface),http协议等,它可以接收和处理请求,发出响应等。所以只用uwsgi也是可以的。

先安装uwsgi

pip3.6 install uwsgi

在你的项目根目录下创建一个配置文件uwsgi.ini(uwsgi支持多种配置文件格式,xml,ini,json等)

#监听的ip和端口
socket = 127.0.0.1:8080   

#项目目录           
chdir = /home/www/wwwroot/salt-api/

#flask程序的启动文件,通常在本地是通过运行  
wsgi-file = app.py      

#程序内启用的application变量名                          
callable = app      

#处理器个数
processes = 2  

 #获取uwsgi统计信息的服务地址
stats = 127.0.0.1:9191

保存配置文件,我们可以通过键入 uwsgi uwsgi.ini 来启动uwsgi。

如果需要后台方式启动并且指定日志:

uwsgi uwsgi.ini -d /var/log/uwsgi/uwsgi.log

编写nginx 配置 ,在vhosts里新增一个flask.conf文件

[root@wechat02 vhost]# cat flask.conf 
server {
    listen 8080;
    server_name 127.0.0.1; #访问ip
    
    location / {
      include uwsgi_params;
      uwsgi_pass 127.0.0.1:5000;  #代理到uwsgi.ini里兼容的ip和端口
    }
}

然后重新加载nginx配置

nginx -s reload

到此,我们终于完成了所有的工作,马上就可以访问自己的项目了。

curl http://127.0.0.1:8080/

如果一切顺利的话,显示的就是你想要的页面了,如果不是,首先查看一下ini里设置的日志文件。

 

CentOS 傻瓜式部署uWSGI + nginx + flask

CentOS 傻瓜式部署uWSGI + nginx + flask

###交代背景 这篇帖子是为了提供我自己的July Novel站点的小说数据支撑。解决分布式部署爬虫程序的繁琐过程,由于本人对shell编程并不熟悉,故而先逐步记录操作步骤,通过以下操作达到节省时间的方式。 三个前提: 1.首先是四台云服务器,全部安装Cent OS 7.4, 四台服务器中一台主服务器,三台从服务器,服务器都是刚刚全新安装,并且,主服务器已经安装MariaDB和Redis数据库; 2.其次是客户端连接远程服务器使用的是Xshell,通过Xshell同时打开多个标签页,并且通过撰写栏发送命令,每次发送四台服务器都同时收到指令开始执行; 3.待部署的代码已经躺在github上了。

###具体实施步骤

下面我会逐步交代如何操作

获取管理员权限 sudo -s

1.预装接下来会用到的软件

#gcc编译器
#源码方式安装nginx所需。
yum install gcc gcc-c++
#nginx rewrite 需求 
yum install -y pcre-devel
#安装anaconda3 解压需求(貌似Azure的centos云服务器内置了,而Aliyun似乎)
yum install -y zlib-devel
#版本控制,不谈了
yum install -y git
#控制uWSGI停止启动的脚本需要
yum install -y psmisc
#网站上https必备。建议上。
yum install -y openssl openssl-devel

2.编译nginx

mkdir /home/web
mkdir /home/download
cd /home/download

wget https://nginx.org/download/nginx-1.12.2.tar.gz
tar zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make
make install

3.安装anaconda3(版本很关键,最新版5.10.1跟我这套配置有点冲突,建议用我这个版本5.0.1)

cd ../
wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh
bash Anaconda3-5.0.1-Linux-x86_64.sh
#激活环境变量
source ~/.bashrc
#创建虚拟python环境
conda create --name web
#跳转到新建的web环境下
source activate web

4.clone我的JulyNovel后端源代码

cd /home/web

git clone https://github.com/congjinruo/JulyNovel.git
cd JulyNovel

pip install -r requirements.txt
nginx和uWSGI需求的几个日志文件生成一下
mkdir logs
touch logs/access.log
touch logs/error.log
touch logs/uwsgi.log

5.三个配置文件的单独设置,我把这三份文件详细设置放在我的github README.md上。

JulyNovel Github

#配置nginx
vim /usr/local/nginx/conf/nginx.conf
#配置JulyNovel的MariaDB、Redis、Aliyun OSS的连接方式
vim /home/web/JulyNovel/config.py
#编辑管理uWSGI运行启动的脚本
vim /home/web/manage_uwsgi.sh

6.开启uWSGI和nginx
注意,部分服务器在运行下面命令可能会报错,请将anaconda/lib里的文件用cp命令复制到/lib64文件夹内

uwsgi --ini /home/web/JulyNovel/uwsgiconfig.ini
/usr/local/nginx/sbin/nginx

7.最后,别忘了服务器安全组端口入站规则开启。

debian10+Nginx+Flask+uWSGI+uWSGI Emperor配置流程

debian10+Nginx+Flask+uWSGI+uWSGI Emperor配置流程

之前写过 debian8 和 debian9 的配置文章,现在升级到了 debian10,那就重新调整一下安装过程.

debian9+flask+uWSGI+uWSGI Emperor 配置流程

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

查看系统相关信息

debian版本号

cat /etc/issue

pythonGCC 版本号

python3

pip 版本号

pip3 -V

安装 uwsgi

注意,有的同学会提前安装好项目的 python 虚拟环境,但这里不是在虚拟环境里安装的,是在根目录环境安装 uwsgi

pip install uwsgi

安装 nginx

我用的是 oneinstack 一键脚本。可以百度找一下。

注意:文章所有 xxx.com 地方均需要改为自己的域名或文件夹路径。

通过自带功能新增域名映射文件存放路径:

/data/root/xxxx.com

安装 Flask

创建虚拟环境

使用python3自带的venv命令虚进行创建虚拟环境。以下命令中,第二个venv是文件夹名称:

cd /data/root/xxxx.com
python3 -m venv venv

其它虚拟环境也可以,大家可以自由选择, 比如 virtualenv

安装 Flask

进入虚拟环境:

source venv/bin/activate

通过 pip命令进行安装flask

pip3 install flask

新建 uWSGI 配置文件

创建一个新的 uWSGI 配置文件/data/root/xxx.com/xxx.com_uwsgi.ini

[uwsgi]

#指向网站跟目录,应用程序的文件夹路径 application''s base folder
base = /data/root/xxx.com

# 按字面意思是python的环境变量路径,写的是网站根目录
# 给PYTHONPATH 增加一个目录(或者一个egg),你可以最多使用该选项64次。
# 给PYTHONPATH python-path pp 这三个是相同作用
pythonpath = %(base)

# 虚拟目录,设置PYTHONHOME/virtualenv
home = %(base)/venv

# 指定监听文件,修改后重新打开日志
# 如果修改/碰了指定的文件,那么触发日志的重新打开
touch-logreopen = /data/logs/uwsgi/.touchforlogrotate

#使进程在后台运行,并将日志打到指定的日志文件或者udp服务器。
#这个指令会让uWSGI在后台运行并将日志打到 /data/logs/uwsgi/的对应文件中。
daemonize = /data/logs/uwsgi/%n.log

#日志文件的路径 location of log files
; logto = /data/logs/uwsgi/%n.log


#加载指定的python WSGI模块(模块路径必须在PYTHONPATH里)
module = app

# 设置在收到请求时,uWSGI加载的模块中哪个变量将被调用,默认是名字为“application”的变量。
callable = app

#socket文件的路径 socket file''s location
socket = %(base)/tmp/%n.sock

#pchmod-socket的权限 ermissions for the socket file
chmod-socket = 666

# 处理器数
processes = 2

# 线程数
1threads = 2

#您需要的是,reload-mercy是用作回退的全局值。
#what you need, reload-mercy is a global value used as a fallback
#--reload-mercy-在重新加载/停止整个uWSGI实例时使用
#--worker-reload-mercy-在重新加载/停止单个工作程序时使用
worker-reload-mercy = 10

# 修改代码时,自动重启uwsgi服务,每1秒检查一次
python-autoreload = 1

# 这个选项会设置harakiri超时时间(可以看wiki首页的相关内容)。如果一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)。
# 这个设置会使uwsgi丢弃所有需要60秒才能处理完成的请求。
harakiri = 60

按照实际情况修改文件中的路径。

创建日志文件夹

创建一个新文件夹存放uWSGI日志,更改文件夹的所有权(因为我是用 oneinstack 脚本创建的文件夹,默认用户组是www:www,所以相关文件夹拥有者权限也是给了www:www):

mkdir -p /data/logs/uwsgi
chown -R www:www /data/logs/uwsgi

配置网站的nginx配置文件

在原有的域名conf配置文件中添加以下内容:

location / {
    try_files $uri @yourapplication;
}
location @yourapplication {
    include uwsgi_params;
    uwsgi_pass unix:/data/root/xxx.com/tmp/xxx.com_uwsgi.sock;
}

配置uWSGI Emperor

使用uWSGI Emperor管理多个 uwsgiuWSGI Emperor是用来管理uwsgi后台运行的。
新建/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文件夹

mkdir /etc/uwsgi

创建文件/etc/uwsgi/emperor.ini

touch /etc/uwsgi/emperor.ini

里面代码如下:

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

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

mkdir /etc/uwsgi/vassals
ln -s /data/root/xxx.com/xxx.com_uwsgi.ini /etc/uwsgi/vassals

/etc/uwsgi/emperor.ini文件里,设置了文件所有者是 www:www,我们要给对应的文件夹和文件做所有者权限修改(这一步根据实际情况来判断是否需要):

chown -R www:www /data/root/xxx.com
chown -R www:www /data/logs/uwsgi/

至此,配置已经完成。

相关命令

启动服务

systemctl start emperor.uwsgi.service

检查状态

systemctl status emperor.uwsgi.service

你会看到提示:

emperor.uwsgi.service - uWSGI Emperor
   Loaded: loaded (/etc/systemd/system/emperor.uwsgi.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-10-31 23:55:52 CST; 3s ago
 Main PID: 27634 (uwsgi)
   Status: "The Emperor is governing 0 vassals"
    Tasks: 1 (limit: 3549)
   Memory: 3.4M
   CGroup: /system.slice/emperor.uwsgi.service
           └─27634 /usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini

Oct 31 23:55:52 giaogiao uwsgi[27634]: *** WARNING: you are running uWSGI without its master process manager ***
Oct 31 23:55:52 giaogiao uwsgi[27634]: your processes number limit is 11830

开机启动

systemctl enable emperor.uwsgi.service

其它命令

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

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

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

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

Debian8 使用 uWSGI Emperor Debina7 是不一样的。相关问题,可以直接查看本篇文章的第4步。

注意:本篇文章是在服务器中用 root 账号执行的。文章主要讲相关配置文件,安装方法请自寻。
-----更新------
2017年9月8日更新:更正运行服务的代码


1.uWSGI 配置文件 /home/luejiao.com/luejiao_uwsgi.ini

[uwsgi]
# 指向网站目录
base = /home/luejiao.com

# 启动文件
wsgi-file = run.py

module = app

# 虚拟目录
home = %(base)/flask

# 按字面意思是python的环境变量路径,写的是网站根目录
pythonpath = %(base)

#socket文件的路径 socket file''s location
socket = /home/luejiao.com/tmp/%n.sock

#pchmod-socket的权限 ermissions for the socket file
chmod-socket = 644

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

#日志文件的路径 location of log files
logto = /wwwlogs/uwsgi/%n.log 

# 处理器数
processes = 4

# 线程数
1threads = 2

# 修改代码时,自动重启uwsgi服务
python-autoreload=1

2.新建保存日志的文件夹,并赋权

mkdir -p /wwwlogs/uwsgi
chown -R www:www /wwwlogs/uwsgi

3.在网站的 nginx conf 配置文件中,添加:

location / {
    try_files $uri @yourapplication;
    }
  location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/home/luejiao.com/tmp/luejiao_uwsgi.sock;# 这里注意替换成自己的socket文件路径
    }

下面是重头戏,debian8debian7 在配置 uWSGI Emperor 是不一样的!!!
debian7 是把配置文件放到 /etc/init/uwsgi.conf,而在 debian8 中,是放到 /etc/systemd/system/ 中的。
本文章是讲 debian8 的环境下配置 uWSGI Emperor 。 官方对应文档

4.新建/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

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

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

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

mkdir /etc/uwsgi && mkdir /etc/uwsgi/vassals
ln -s /home/luejiao.com/luejiao_uwsgi.ini /etc/uwsgi/vassals

7.在第5步中的文件夹中,设置了文件所有者是 www:www,我们要给对应的文件夹和文件做所有者权限修改(这一步根据实际情况来判断是否需要):

chown -R www:www /home/luejiao.com
chown -R www:www /var/log/uwsgi/

8.运行服务、停止服务、状态查询:

debian7 开启服务的代码是:service uwsgi start
debian8 的代码是

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

End!

今天关于uwsgi + nginx + flask: upstream prematurely closed的介绍到此结束,谢谢您的阅读,有关CentOS 下用 Nginx 和 uwsgi 部署 flask 项目、CentOS 傻瓜式部署uWSGI + nginx + flask、debian10+Nginx+Flask+uWSGI+uWSGI Emperor配置流程、Debian8 + Flask + Nginx + uWSGI + uWSGI Emperor 基本配置文件注意事项等更多相关知识的信息可以在本站进行查询。

本文标签: