前言
前段时间手贱买了几个月的腾讯云服务器。我一个做移动端的买国内服务器干啥。最后想用python爬写数据写几个接口用app玩玩试试看看。
可惜自己只用过servelet,python的web框架完全不了解。网上找了找说Flask做这种移动端的服务框架挺简单的,本地写个Demo跑了一下感觉的确很方便。
网上有很多关于【Ubuntu上uWSGI 和 Nginx 部署 Flask】的文章,有很多都讲的很错,但是为什么在我服务器上相同的部署就不能成功呢?
于是乎载膝盖中了很多箭的情况下,就有了这一次用uWSGI和Nginx部署Flask的爬坑之旅。
概念
WSGI (Web 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
# -*- 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
,然后运行:
uwsgi --socket 0.0.0.0:5000 --protocol=http -w myproject:app
protocol
说明使用http
协议,-w
指明了要启动的模块,myproject
就是项目启动文件 myproject.py
去掉扩展名,app
是 myproject.py
文件中的变量 app
,即 Falsk 实例。然后访问 http://server_domain_or_IP:5000
,同样会看到上图。说明 uwsgi
可以正常运行。
但是这样的话每次都从命令行启动太麻烦,可以在 ~/myproject/
目录下创建一个配置文件 myproject.ini
:
[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添加为系统服务。