centos服务器uWSGI 和 Nginx 部署 Flask 项目

2020-05-29 10:54:16 浏览数 (1)

前言

前段时间手贱买了几个月的腾讯云服务器。我一个做移动端的买国内服务器干啥。最后想用python爬写数据写几个接口用app玩玩试试看看。

可惜自己只用过servelet,python的web框架完全不了解。网上找了找说Flask做这种移动端的服务框架挺简单的,本地写个Demo跑了一下感觉的确很方便。

网上有很多关于【Ubuntu上uWSGI 和 Nginx 部署 Flask】的文章,有很多都讲的很错,但是为什么在我服务器上相同的部署就不能成功呢?

于是乎载膝盖中了很多箭的情况下,就有了这一次用uWSGI和Nginx部署Flask的爬坑之旅。

概念

WSGIWeb Server Gateway Interface)是一个 Python 协议,定义了应用程序(我们写的软件)如何与 Web 服务器(如 Nginx)通信,WSGI 只是一个接口。而 uWSGI 是一个支持多种语言的服务器容器,使用 WSGI 定义的标准实现与多种 Web 服务器的通信,并将 Web 服务器发来的请求“翻译”成应用程序所能理解形式。

Nginx(发音同engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存。

没有Nginx其实也能在centos上部署Flask项目,因为我自己的Flask项目并没有多少调用量。只不过,我就想用Nginx。。。

部署

python

Centos的python2和3,pip2和3安装

Flask 和 uwsgi:

代码语言:javascript复制
pip install uwsgi flask

创建应用

/root/PythonWorkSpace/myproject/myproject.py

代码语言:javascript复制
# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


@app.route('/index')
def hello_world2():
    return '你好世界!'


if __name__ == '__main__':
    app.run(host='0.0.0.0')

myproject.py 同时也可以作为启动文件

运行python myproject.py,访问http://server_domain_or_IP:5000将会看到"Hello World!"

uwsgi

首先确保你安装了 uwsgi,然后运行:

代码语言:javascript复制
uwsgi --socket 0.0.0.0:5000 --protocol=http -w myproject:app

protocol说明使用http协议,-w指明了要启动的模块,myproject就是项目启动文件 myproject.py去掉扩展名,appmyproject.py 文件中的变量 app,即 Falsk 实例。然后访问 http://server_domain_or_IP:5000,同样会看到上图。说明 uwsgi可以正常运行。

但是这样的话每次都从命令行启动太麻烦,可以在 ~/myproject/目录下创建一个配置文件 myproject.ini

代码语言:javascript复制
[uwsgi]
# web应用的入口模块名称
module = myproject:app
# 启动主进程
master = true
# 说明要启动5个子进程处理请求
processes = 3
# 程序内启用的application变量名
callable = app
# flask程序的启动文件,通常在本地是通过运行
wsgi-file = myproject.py
# 项目目录
chdir = /root/PythonWorkSpace/myproject
# 启动程序时所使用的ip和端口号
socket = 127.0.0.1:8001
# uwsgi日志路径
logto = /home/to/log/gushici.log
chmod-socket = 660
vacuum = true
# 获取uwsgi统计信息的服务地址
stats = 127.0.0.1:9191
# uwsgi进程的pid,用于以后的stop和reload
pidfile = uwsgi.pid

配置完成后运行:

代码语言:javascript复制
uwsgi --ini myproject.ini

Nginx

代码语言:javascript复制
server {
    listen       80;
    server_name  118.25.228.94;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8001;  #监听的ip和端口号
        uwsgi_param UWSGI_PYHOME /root/PythonWorkSpace/myproject/Flask;   #pyathon环境
        uwsgi_param UWSGI_CHDIR /root/PythonWorkSpace/myproject;  #项目地址
        uwsgi_param UWSGI_SCRIPT myproject:app;   #web应用的入口模块名称
    }
}

nginx的一些命令

  • 启动: nginx
  • 停止: nginx -s stop
  • 强制停止: pkill -9 nginx
  • 查看nginx是否应用配置文件: nginx -t
  • 查看版本: nginx -v

通过netstat -ntlp 查看端口占用情况,看看是不是你的nginx占用的80端口。如果发现有其他程序占用了nginx的默认的80端口,可以杀掉这些进程,再启动nginx。

结果

  • 键入 nginx 来启动nginx
  • 键入uwsgi myproject.ini启动uwsgi

我们运行 uwsgi --ini myproject.ini之后,按 ctrl c 或者关闭 ssh 连接窗口,都会导致 uwsgi 进程关闭。所以我们可以将uwsgi设置为系统服务,参考centos将uwsgi添加为系统服务。

0 人点赞