最近开发中用到了python,在项目中要做发布,其实简单,但还是花费了一些时间才搞明白怎么使用
网络上的资源大多比较零散,因此我把自己操作的完整过程记录下来,作为备忘吧
1、首先,我需要提供一个外部api供别人调用,因此查阅资料后发现了Flask这个东西,用了之后发现确实很方便
但是要搭建真正的支持并发的web服务,简单的Flask提供的restfull api感觉还不够用,继续查阅资料后,采用了Flask+uwsgi+nginx的方案
2、Flask、uwsgi、nginx安装和简单说明
Flask是一个轻量级的web应用框架,还有Django等
Flask安装:
pip install flask
Flask的简单应用如下(manage.py)
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__': #服务器部署时,注释掉这两行,不需要启动main函数
app.run()
uwsgi是一种接口,定义web服务器和web应用之间的接口规范
uwsgi安装:
pip install uwsgi
Nginx是一个高性能的http和反省代理web服务器
Nginx安装:
rpm -ivh http://nginx.org/packages/centos/6/x86_64/RPMS/nginx-1.10.0-1.el6.ngx.x86_64.rpm
sudo yum install nginx
3、服务器环境配置
配置uwsgi,保存在uwsgiconfig.ini文件
[uwsgi]
socket = 127.0.0.1:5000 # 启动程序时所使用的地址和端口,通常在本地运行flask项目,
# Flask地址和端口是127.0.0.1:5000,
# 不过在服务器上是通过uwsgi设置端口,通过uwsgi来启动项目,
# 也就是说启动了uwsgi,也就启动了项目。
chdir = /home/www/ # 项目目录
wsgi-file = manage.py # flask程序的启动文件,通常在本地是通过运行
# python manage.py runserver 来启动项目的
callable = app # 程序内启用的application变量名
processes = 4 # 处理器个数
threads = 2 # 线程个数
stats = 127.0.0.1:9191 # 获取uwsgi统计信息的服务地址
pidfile = uwsgi.pid # 保存pid信息,方便停止服务和重启的时候用
daemonize = ./log/uwsgi.log # 后台运行时记录uwsgi的运行日志
lazy-apps = true # 当需要连接cassandra时,uwsgi无法启动服务,可以使用该选项设置
master-fifo = /opt/mt-search/web-service/mfifo # 使用chain-reloading 逐个work重启,服务不中断, 命令是 echo c > mfifo
touch-chain-reload = true
# 程序内启用的application变量名
processes = 4 # 处理器个数
threads = 2 # 线程个数
stats = 127.0.0.1:9191 # 获取uwsgi统计信息的服务地址
pidfile = uwsgi.pid # 保存pid信息,方便停止服务和重启的时候用
daemonize = ./log/uwsgi.log # 后台运行时记录uwsgi的运行日志
lazy-apps = true # 当需要连接cassandra时,uwsgi无法启动服务,可以使用该选项设置
master-fifo = /opt/mt-search/web-service/mfifo # 使用chain-reloading 逐个work重启,服务不中断, 命令是 echo c > mfifo
touch-chain-reload = true
配置Nginx:
/etc/nginx/nginx.conf 会默认调用下面的配置文件,因此只需要修改下面配置文件即可
sudo vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name 127.0.0.1;
#charset koi8-r;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
uwsgi_param UWSGI_PYHOME /path/mtenv; #python位置,要么是虚拟机,要么是运行的环境变量位置
uwsgi_param UWSGI_CHDIR /path/python-prj/flask-prj; #项目根目录
uwsgi_param UWSGI_SCRIPT manage:app; #启动项目的主程序,如果manage.py位域flask-prj的src/flask/这样的目录下,那么就写成src/flask/manage:app这样
#root /usr/share/nginx/html;
#index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
4、服务启动
启动、停止和升级uwsgi(不需要启动python main.py这样):
uwsgi uwsgiconfig.ini
uwsgi --ini uwsgiconfig.ini
uwsgi uwsgiconfig.ini --daemonize //后台运行启动
uwsgi --stop uwsgi.pid //停止服务
uwsgi --reload uwsgi.pid //可以无缝重启服务
备注:当需要启动后台线程时,uwsgi也会无法启动代码,这时候可以用进程替代线程
启动Nginx:
nginx //启动
nginx -s stop/quit //停止
nginx -s reload //重启加载配置
参考资料
1、http://blog.csdn.net/lihao21/article/details/52304119
2、http://docs.jinkan.org/docs/flask/
3、https://segmentfault.com/a/1190000004294634