服务部署
安装python3.6
在官网下载编译安装包或者直接执行以下命令下载
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
解压
tar -xvJf Python-3.6.2.tar.xz
进入文件夹并编译安装
cd Python-3.6.2
shell ./configure prefix=/usr/local/python3
make
sudo make install
添加软链到执行目录下/usr/bin
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
安装python虚拟环境及flask
安装virtualenv
sudo pip install virtualenv
创建项目文件夹
mkdir test
创建并启动虚拟环境
cd test
virtualenv -p /usr/local/python3/bin/python3 venv
source venv/bin/activate
安装flask
pip install flask
创建主程序main.py文件
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host='0.0.0.0', port=9000)
浏览器访问127.0.0.1:9000或ip:9000,可看到如下页面:
至此,web服务由flask托管,但是在生产环境中应当配置nginx。下面介绍nginx的配置
安装并配置nginx
安装并测试nginx
sudo apt install nginx
sudo /etc/init.d/nginx start
此时打开浏览器输入127.0.0.1或127.0.1.1,应该可以看到nginx欢迎页
删除nginx的默认配置文件
sudo rm /etc/nginx/sites-enabled/default
为应用创建新的配置文件test.conf
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
location / { try_files $uri @test; }
location @test {
include uwsgi_params;
uwsgi_pass 0.0.0.0:9000;
}
}
将新的配置文件链接到nginx配置文件夹下并重启nginx
sudo ln -s test.conf /etc/nginx/conf.d/
sudo /etc/init.d/nginx restart
安装并配置uwsgi
安装uwsgi
pip install uwsgi
创建新uwsgi配置文件test.ini
base = /path/test # 项目的绝对路径
#python module to import
app = main
module = %(app)
#home = %(base)/venv
pythonpath = %(base)/venv/bin/python3.6
#socket file's location
http-socket = 0.0.0.0:9000
#permissions for the socket file
chmod-socket = 666
buffer-size = 32781
#the variable that holds a flask application inside the module imported at line #6
callable = app
#location of log files
logto = %(base)/log/uwsgi.log
pidfile = %(base)/uwsgi/uwsgi.pid
创建日志文件夹存放uwsgi日志
mkdir log
mkdir uwsgi
执行uwsgi
uwsgi –ini test.ini
打开浏览器访问127.0.0.1:9000或ip:9000可访问
至此,应用已经由nginx托管,大功告成!
将uwsgi添加为系统服务(可选)
Ubuntu自带的systemd是最简单的实现方式,可以将项目变为系统服务
首先创建test.service文件
sudo vim /etc/systemd/system/test.service
[Unit]
Description=uWSGI instance to serve test
After=network.target
[Service]
[Unit]
Description=uWSGI instance to serve test
After=network.target
[Service]
WorkingDirectory=/path/test
ExecStart=/usr/local/bin/uwsgi --ini /path/test/test.ini
ExecStop=/usr/local/bin/uwsgi --stop /path/test/uwsgi/uwsgi.pid
ExecReload=/usr/local/bin/uwsgi --reload /path/test/uwsgi/uwsgi.pid
[Install]
WantedBy=multi-user.target
配置完后需要reload systemdctl,此时项目已变为系统服务
启动 systemctl start test.service
停止 systemctl stop test.service
重载 systemctl reload test.service