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
建立完成後,賦予執行權限,加入開機啓動
[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