Linux 上利用Nginx代理uWSGI处理Flask web应用
wptr33 2025-01-01 22:57 17 浏览
一、介绍
最近开发要用一个测试环境,是这样的Nginx+uwsgi+flask 的一个结构。下面是一些记录,在Centos 系统上使用Flask 架构部署一个简单的Python应用。然后使用Nginx作为前端反向代理,设置uWSGI应用网关处理web应用程序。
二、条件
1) 环境要求
- Server OS:最小化安装 Centos 6.8
- Nginx :反向代理
- Python2.6~2.7:开发语言
- Flask/uWSGI:框架
- Pip:python包管理工具
- iptables&selinux:开放用到的端口,关闭selinux。
2) 安装必备的开发工具以及环境
更新系统:
[root@hcloud ~]# yum update -y
[root@hcloud ~]# yum groupinstall "Development tools" -y
更新完成后,记得重启系统,然后安装工具:
[root@hcloud ~]# yum install wget vim telnet python-devel zlib-devel openssl-devel bzip-devel -y
[root@hcloud ~]# yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel python-devel libxml2 libxml2-devel python-setuptools zlib-devel wget openssl-devel pcre pcre-devel sudo gcc make autoconf automake
-y
3) 安装python 包管理工具-pip
[root@hcloud ~]# wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py
或者参考此网站
4) 安装uWSGI与Flask
下载软件
[root@hcloud ~]# mkdir soft
[root@hcloud ~]# cd soft
[root@hcloud soft]# wget https://pypi.python.org/packages/0c/1c/44849e293e367a157f1ad863cee02b4b865840543254d8fae3ecdebdbdb9/uwsgi-2.0.12.tar.gz
[root@hcloud soft]# wget https://pypi.python.org/packages/db/9c/149ba60c47d107f85fe52564133348458f093dd5e6b57a5b60ab9ac517bb/Flask-0.10.1.tar.gz
如果下载该软件比较慢,可以在/etc/reslov.conf dns中添加一个8.8.8.8 ,很快的哦。
安装软件(开发要求固定版本,如果不介意版本的话,可以直接使用pip install packge 即可安装,相当于linux中的yum)
[root@hcloud soft]# tar -xf Flask-0.10.1.tar.gz
[root@hcloud ~]# cd Flask-0.10.1
[root@hcloud Flask-0.10.1]# python setup.py install
[root@hcloud soft]# tar -xf uwsgi-2.0.12.tar.gz
[root@hcloud soft]# cd uwsgi-2.0.12
[root@hcloud uwsgi-2.0.12]# python setup.py install
5) 创建一个测试应用
创建一个Web应用程序存放的文件夹
[root@hcloud ~]# mkdir -pv /usr/local/webtest
[root@hcloud ~]# cd /usr/local/webtest
创建一个python 脚本,内容如下:
[root@hcloud webtest]# cat myproject.py
from flask import Flask
application = Flask(__name__)
@application.route("/")
def hello:
return "<h1 style='color:blue'>Hello Flask!</h1>"
if __name__ == "__main__":
application.run(host='0.0.0.0')
创建WSGI入口点文件,名字为:wsgi.py,内容如下
[root@hcloud webtest]# cat wsgi.py
from myproject import application
if __name__ == "__main__":
application.run
6) 配置uWSGI服务器网关服务运行方式,运行端口等。
上述两个python脚本文件创建完成后,uwsgi命令启动,运行在8000端口上,指定协议http,运行时会出现一些警告,暂时可以忽略,是因为当前是root账户运行的uwsgi,后面从配置文件启动时会配置普通用户nginx即可。
[root@hcloud webtest]# uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi
验证下,看下监听端口
[root@hcloud webtest]# netstat -aultnp | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 7181/uwsgi
tcp 0 0 192.168.30.58:8000 192.168.30.65:48164 TIME_WAIT -
可以打开浏览器访问测试一下:http://192.168.30.58:8000
7) 创建uWSGI配置文件
以.ini格式为uwsgi启动配置文件(还有xml,json,等多种格式),这样就不用在命令行输入一大堆命令了,用uwsgi命令启动,后面可以创建uwsgi启动脚本,加入到系统服务
在项目的目录中,创建uwsgi.ini:
[root@hcloud webtest]# cat uwsgi.ini
[uwsgi]
uid = nginx
gid = nginx
socket = 127.0.0.1:8000
master = true
vhost = true
workers = 8
reload-mercy = 10
vacuum = true
max-requests = 10000
limit-as = 1024
buffer-sizi = 3000
pidfile = /var/run/uwsgi.pid
daemonize = /var/log/uwsgi/uwsgi.log
chdir = /usr/local/webtest
module = wsgi
chmod-socket = 660
enable-threads = true
保存并退出。配置文件参考:http://heipark.iteye.com/blog/1847421
大致的解释下:
uid 、gid :以哪个用户、组启动服务
socket:监听的ip及端口
master: 启动主进程
workes:服务器启动的进程数
reload-mercy:平滑的重启
pidfile :启动时的pid 文件。
daemonize :启动日志
module :web应用的入口模块名称
enable-threads : 启用线程模式
8) 创建开机系统启动脚本文件,名字为uwsgid。
[root@hcloud webtest]# cat /etc/init.d/uwsgid
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for uwsgi webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f uwsgi defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add uwsgi'
### BEGIN INIT INFO
# Provides: uwsgid
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the uwsgi web server
# Description: starts uwsgi using start-stop-daemon
### END INIT INFO
# Author: licess
# website: http://lnmp.org
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="uwsgi daemon"
NAME=uwsgi
DAEMON=/usr/bin/uwsgi
CONFIGFILE=/usr/local/webtest/$NAME.ini
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/uwsgid
set -e
[ -x "$DAEMON" ] || exit 0
do_start {
$DAEMON $CONFIGFILE || echo -n "uwsgi already running"
}
do_stop {
$DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
rm -f $PIDFILE
echo "$DAEMON STOPED."
}
do_reload {
$DAEMON --reload $PIDFILE || echo -n "uwsgi can't reload"
}
do_status {
ps aux|grep $DAEMON
}
case "$1" in
status)
echo -en "Status $NAME: \n"
do_status
;;
start)
echo -en "Starting $NAME: \n"
do_start
;;
stop)
echo -en "Stopping $NAME: \n"
do_stop
;;
reload|graceful)
echo -en "Reloading $NAME: \n"
do_reload
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
exit 3
;;
esac
exit 0
View Code
创建完成后,赋予执行权限,加入开机启动
[root@hcloud ~]# chmod +x /etc/init.d/uwsgid
[root@hcloud ~]# chkconfig --add uwsgid[root@hcloud ~]# chkconfig --level 2345 uwsgid on
检查下
[root@hcloud ~]# chkconfig --list uwsgid
uwsgid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
启动uwsgid
[root@hcloud ~]# service uwsgid start
Starting uwsgi:
[uWSGI] getting INI configuration from /usr/local/webtest/uwsgi.ini
验证下监听端口(注:这里我们使用127.0.0.1 作监听,是为了后期在使用时,对外只有nginx可以访问web应用):
[root@hcloud ~]# netstat -aultnp | grep :8000
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 8945/uwsgi
9) 安装Nginx配置代理
先下载安装6.6的epel源
[root@hcloud ~]# wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@hcloud ~]# rpm -ivh epel-release-6-8.noarch.rpm
安装nginx
[root@hcloud ~]# yum install nginx -y
安装完成后,修改nginx默认配置文件default.conf,修改之前可以先备份下源文件噢。完整内容如下:
[root@hcloud ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name 192.168.30.58;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_param UWSGI_SCRIPT wsgi;
uwsgi_param UWSGI_CHDIR /usr/local/webtest;
index index.html index.htm;
client_max_body_size 35m;
}
}
以上内容代理了uwsgi的端口,客户端通过访问nginx的80端口,然后nginx在将请求转发到后台flask应用的8000端口上。
启动nginx
[root@hcloud ~]# service nginx start
Starting nginx: [ OK ]
在浏览器内测试访问一下nginx:http://192.168.30.58
相关推荐
- 为什么劝你不要买Switch OLED?(现在买switch oled划算吗)
-
那么在聊我们自己的观点前,还是先来看看这款任天堂SwitchOLED款式究竟带来了哪些变化吧。SwitchOLED已经把它最大的特点之一写到了名字里——OLED。这款产品改动最大的地方,就是在维...
- 新游戏、怀旧机!没有Switch新机的任天堂还能俘虏玩家们的心吗?丨C位
-
6月16日凌晨,日本电子游戏巨头任天堂在E3游戏展会上举行了发布会。翘首以盼的SwitchPro并未亮相,截止发稿,任天堂股价跌2.44%。但玩家们最为期待的《塞尔达:荒野之息2》将于2022年推出...
- 腾讯引进Nintendo Switch (OLED版)开启预售 多重满足您的娱乐需求
-
1月4日,腾讯引进NintendoSwitch(OLED版)开启预售,并将于1月11日正式发售。NintendoSwitch(OLED版)是NintendoSwitch的全新款式,配置色彩艳丽的...
- 股东大会上任天堂考虑移植更多WiiU和GC游戏到Switch
-
任天堂股东大会上有任天堂的忠实小股东玩家提议想在Switch玩到WiiU以及GC的经典游戏,对于这个问题,官方给了正面的回应。官方表示目前皮克敏等部分游戏已经可以在switch上玩了,今后会认真考虑玩...
- 《野狗子》M站均分低至60分!IGN仅给5分、VGC感觉像是PS3游戏
-
外山圭一郎工作室首部作品《野狗子》全球媒体口碑已解禁,总体评价一般,目前M站均分已降低至60分,21条评价,好评5条,中评14条,差评2条。IGN为其打出5分评价。《野狗子》的特色在于一些有趣的附身交...
- 《EA SPORTS FC 25》加入任天堂游戏试玩会,Switch版可免费体验
-
近日,EASPORTS宣布其最新力作《EASPORTSFC25》的Switch版本已正式加入任天堂游戏试玩会。即日起至3月2日,所有NintendoSwitchOnline订阅用户均可限时...
- Double Kill!马里奥乐园+Switch能解任天堂焦虑吗?丨C位
-
近日,“超级任天堂世界”主题乐园在大阪环球影城开园,“超级马里奥之父”宫本茂现身揭幕仪式。任天堂近来喜事连连,2020年财年前九个月实现营收838亿元,贡献最大的Switch销量远超索尼PS5与微...
- 迷你主机、Switch好搭子:16寸4K超亮QLED CFORCE便携屏值得入手吗
-
一、迷你主机、Switch好搭子...
- 怎样查看Switch的“主机序列号信息”
-
小时候看到游戏机就走不动,现在玩游戏越来越方便了,比如Switch.今天讲讲怎样查看Switch的“主机序列号信息”。第一步:点击【设置】...
- Switch版《EA SPORTS FC 25》容量相比前作缩水
-
备受期待的Switch版足球游戏《EASPORTSFC25》即将发布,根据任天堂官方网站的游戏信息显示,与前作《EASPORTSFC24》相比,游戏容量有所下降。在任天堂官方网站可以查到,...
- switch双系统升级注意点(switch双系统升级注意点是什么)
-
升级系统有风险,建议只有实在想玩的游戏玩不了的时候再升级。1、针对双系统进行,单系统不适用。2、国行系统同pj系统的升级是分开的,互不干涉。国行系统进入后直接升级即可。3、升级之前,建议先做好各类备份...
- 《鬼泣4:特别版》游戏评测:全家老小齐上阵
-
游戏名称:鬼泣4:特别版英文名称:DevilMayCry?4SpecialEdition游戏类型:动作游戏ACT制作公司:CAPCOMCo.,Ltd.发行公司:CAPCOMCo.,L...
- 最好不要在超过35°C的环境温度里玩你的掌机
-
随着进入“初伏”,天气越发酷热,今年全球高温尤为严重。Valve对此发布了一个安全警告,告诉玩家SteamDeck可以在哪些温度下安全运行。Valve指出,SteamDeck的最佳工作环...
- 任天堂回应股东玩家 考虑Switch回溯游玩WiiU以及GC游戏
-
今日有任天堂的忠实小股东玩家提议想在Switch玩到WiiU以及GC的经典游戏,官方回应称正在考虑中,敬请期待。·当然,Switch回溯游玩WiiU以及GC游戏的方式有任天堂的在线服务直接游玩官方优...
- Switch 2神秘C键用途曝光!或能连接初代NS手柄
-
直到近日,游戏圈内的风云人物、知名爆料人extas1s站了出来,带来一则令人颇感意外的消息。extas1s爆料称,玩家有望借助这个神秘的C按钮,实现初代Switch与Switch2...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 为什么劝你不要买Switch OLED?(现在买switch oled划算吗)
- 新游戏、怀旧机!没有Switch新机的任天堂还能俘虏玩家们的心吗?丨C位
- 腾讯引进Nintendo Switch (OLED版)开启预售 多重满足您的娱乐需求
- 股东大会上任天堂考虑移植更多WiiU和GC游戏到Switch
- 《野狗子》M站均分低至60分!IGN仅给5分、VGC感觉像是PS3游戏
- 《EA SPORTS FC 25》加入任天堂游戏试玩会,Switch版可免费体验
- Double Kill!马里奥乐园+Switch能解任天堂焦虑吗?丨C位
- 迷你主机、Switch好搭子:16寸4K超亮QLED CFORCE便携屏值得入手吗
- 怎样查看Switch的“主机序列号信息”
- Switch版《EA SPORTS FC 25》容量相比前作缩水
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mysql max (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)