如果您对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
- 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
我在烧瓶上创建了一个端点,该端点从数据库查询(远程数据库)生成电子表格,然后将其作为下载内容发送到浏览器中。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 项目
前几天利用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
###交代背景 这篇帖子是为了提供我自己的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配置流程
之前写过 debian8 和 debian9 的配置文章,现在升级到了 debian10,那就重新调整一下安装过程.
debian9+flask+uWSGI+uWSGI Emperor 配置流程
Debian8 + Flask + Nginx + uWSGI + uWSGI Emperor 基本配置文件注意事项
查看系统相关信息
debian
版本号
cat /etc/issue
python
及 GCC
版本号
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
管理多个 uwsgi
。uWSGI 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 使用 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文件路径
}
下面是重头戏,debian8 和 debian7 在配置 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 基本配置文件注意事项等更多相关知识的信息可以在本站进行查询。
本文标签: