阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux 上利用Nginx代理uWSGI处理Flask Web应用

142次阅读
没有评论

共计 6158 个字符,预计需要花费 16 分钟才能阅读完成。

一、介绍

最近开发要用一个测试环境,是这样的 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。

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用

2)        安装必备的开发工具以及环境

更新系统:

[root@linuxidc ~]# yum update -y
[root@linuxidc ~]# yum groupinstall "Development tools" -y

更新完成后,记得重启系统,然后安装工具:

[root@linuxidc ~]# yum install wget vim telnet python-devel zlib-devel openssl-devel bzip-devel -y

[root@linuxidc ~]# 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@linuxidc ~]# wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py

或者参考此网站

4)        安装 uWSGI 与 Flask

下载软件

[root@linuxidc ~]# mkdir soft
[root@linuxidc ~]# cd soft
[root@linuxidc soft]# wget https://pypi.python.org/packages/0c/1c/44849e293e367a157f1ad863cee02b4b865840543254d8fae3ecdebdbdb9/uwsgi-2.0.12.tar.gz
[root@linuxidc 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@linuxidc soft]# tar -xf Flask-0.10.1.tar.gz
[root@linuxidc ~]# cd Flask-0.10.1
[root@linuxidc Flask-0.10.1]# python setup.py install

[root@linuxidc soft]# tar -xf uwsgi-2.0.12.tar.gz
[root@linuxidc soft]# cd uwsgi-2.0.12
[root@linuxidc uwsgi-2.0.12]# python setup.py install

5)        创建一个测试应用

创建一个 Web 应用程序存放的文件夹

[root@linuxidc ~]# mkdir -pv /usr/local/webtest
[root@linuxidc ~]# cd /usr/local/webtest

创建一个 python 脚本,内容如下:

[root@linuxidc 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@linuxidc webtest]# cat wsgi.py
from myproject import application

if __name__ == "__main__":
    application.run()

6)         配置 uWSGI 服务器网关服务运行方式,运行端口等。

上述两个 python 脚本文件创建完成后,uwsgi 命令启动,运行在 8000 端口上,指定协议 http,运行时会出现一些警告,暂时可以忽略,是因为当前是 root 账户运行的 uwsgi,后面从配置文件启动时会配置普通用户 nginx 即可。

[root@linuxidc webtest]# uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi
验证下,看下监听端口
[root@linuxidc 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

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用

7)        创建 uWSGI 配置文件

以.ini 格式为 uwsgi 启动配置文件(还有 xml,json, 等多种格式),这样就不用在命令行输入一大堆命令了,用 uwsgi 命令启动,后面可以创建 uwsgi 启动脚本,加入到系统服务

在项目的目录中,创建 uwsgi.ini:

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用
[root@linuxidc 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

保存并退出。

大致的解释下:

uid、gid:以哪个用户、组启动服务

socket:监听的 ip 及端口

master: 启动主进程

workes:服务器启动的进程数

reload-mercy:平滑的重启

pidfile:启动时的 pid 文件。

daemonize:启动日志

module:web 应用的入口模块名称

enable-threads : 启用线程模式

8)        创建开机系统启动脚本文件,名字为 uwsgid。

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用

 
#! /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 | grep -v grep
}

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

 创建完成后,赋予执行权限,加入开机启动

[root@linuxidc ~]# chmod +x /etc/init.d/uwsgid 
[root@linuxidc ~]# chkconfig --add uwsgid
[root@linuxidc ~]# chkconfig --level 2345 uwsgid on

检查下

[root@linuxidc ~]# chkconfig --list uwsgid
uwsgid             0:off    1:off    2:on    3:on    4:on    5:on    6:off

启动 uwsgid

[root@linuxidc ~]# service uwsgid start
Starting uwsgi: 
[uWSGI] getting INI configuration from /usr/local/webtest/uwsgi.ini

验证下监听端口(注:这里我们使用 127.0.0.1 作监听,是为了后期在使用时,对外只有 nginx 可以访问 web 应用):

[root@linuxidc ~]# 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@linuxidc ~]# wget https://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@linuxidc ~]# rpm -ivh epel-release-6-8.noarch.rpm

安装 nginx

[root@linuxidc ~]# yum install nginx -y

安装完成后,修改 nginx 默认配置文件 default.conf,修改之前可以先备份下源文件噢。完整内容如下:

[root@linuxidc ~]# 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@linuxidc ~]# service nginx start
Starting nginx:                                            [OK]

在浏览器内测试访问一下 nginx:http://192.168.30.58

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用

更多参考

Nginx+uWSGI+Supervisor 在 Ubuntu 上部署 Flask 应用  http://www.linuxidc.com/Linux/2016-07/133064.htm

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm 

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm 

Nginx+uWSGI+Django+Python 应用架构部署  http://www.linuxidc.com/Linux/2015-10/124183.htm

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Flask+uWSGI+Nginx+Ubuntu 部署教程 http://www.linuxidc.com/Linux/2016-06/132690.htm

Ubuntu 16.04 下安装部署 Nginx+uWSGI+Django1.9.7  http://www.linuxidc.com/Linux/2016-07/133484.htm

Nginx+uWSGI+Django 在 Ubuntu 下的部署  http://www.linuxidc.com/Linux/2016-07/133490.htm

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-08/134164.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计6158字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中