FLASK 部署22

Linux 上利用Nginx代理uWSGI處理Flask web應用

 

1、介紹html

  最近開發要用一個測試環境,是這樣的Nginx+uwsgi+flask 的一個結構。下面是一些記錄,在Centos 系統上使用Flask 架構部署一個簡單的Python應用。而後使用Nginx做爲前端反向代理,設置uWSGI應用網關處理web應用程序。前端

2、條件python

1)         環境要求linux

  • Server OS:最小化安裝 Centos 6.8
  • Nginx :反向代理
  • Python2.6~2.7:開發語言
  • Flask/uWSGI:框架
  • Pip:python包管理工具
  • iptables&selinux:開放用到的端口,關閉selinux。

2)         安裝必備的開發工具以及環境nginx

更新系統:git

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

更新完成後,記得重啓系統,而後安裝工具:web

[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 包管理工具-pipsql

[root@hcloud ~]# wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py

或者參考此網站json

4)         安裝uWSGI與Flaskflask

下載軟件

[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。

#! /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
uwsgid

 

建立完成後,賦予執行權限,加入開機啓動

[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

每一個人都應是守望者,守望咱們的心智,咱們的理想,以防它在生活中不知不覺地墜落、被操控和被本身遺忘。。。
 
分類: 運維
0
0
 
 
 
« 上一篇: Linux 之不一樣運維人員共用root 帳戶權限審計
» 下一篇: NUMA架構的CPU -- 你真的用好了麼?
posted @ 2016-06-29 13:14 飛走不可 閱讀( 441) 評論( 0) 編輯 收藏
相關文章
相關標籤/搜索