新弄了一台阿里云的主机,于是琢磨这把原有的一个Flask写项目迁移过来,下面总结下部署的步骤。
一,购买服务器
在阿里云上购买一台Ubuntu系统的主机,获得一个外网ip,本机ssh连接到主机
- ping 外网ip 提示 Request timeout
1. 进入阿里云后台配置安全组规则
2. 添加协议 ICMP
- ssh无法通过帐号root登录
1. cat /etc/ssh/sshd_config
2. 修改PasswordAuthentication no
3. 重启/bin/systemctl restart sshd.service
二,安装virtualenv
该台服务器准备用于部署多个应用,需要各自拥有一套独立的Python运行环境,对每个应用的Python环境进行隔离
sudo pip install virtualenv
三,创建Flask项目应用
项目目录一般放在/home
文件夹下。创建一个yys_server的项目,同时始化项目虚拟环境
mkdir /home/yys_server
virtualenv venv
. venv/bin/activate
使用git clone上传应用程序到服务器中,并安装项目依赖
git clone http://url/of/you/git/repo
pip install -r requirements.txt
其中我的项目代码
from flask_script import Manager
from app.api import api
import os
manager = Manager(api)
@manager.command
def runserver():
port = int(os.environ.get('PORT', 33333))
api.run(host='0.0.0.0', port=port)
if __name__ == "__main__":
manager.run()
执行python manage.py runserver
,在浏览器输入公网ip地址,加端口号33333即可成功访问。
四,安装 uwsgi服务器
由于Flask自带的wsgi性能低下,生产环境中使用uwsgi作为服务器
# 安装uwsgi
sudo pip install uwsgi
# 新建配置文件`/home/yys_server/uwsgi.ini`
[uwsgi]
wsgi-file = manage.py
module = runserver
callable = api
master = true
processes = 3
chdir = /home/yys_server
socket = /var/sock/yys.sock
chmod-socket = 666
vacuum = true
buffer-size = 232768
uid = www-data
gid = www-data
# 创建目录,用于存放uwsgi启动后生成的sock文件,用来和Nginx 通信
sudo mkdir /var/sock
# 根据uwsgi.ini配置修改文件夹的所有权
sudo chown -R www-data:www-data /var/sock
执行uwsgi uwsgi.ini
即可通过服务器访问应用
五,安装Supervisor
上面命令运行uwsgi的方式,如果进程异常退出后,服务就无法访问,使用supervisor来管理进程,对异常终端的服务进行自动重启
apt-get install supervisor
/etc/supervisor/conf.d/*.conf
它的配置路径在/etc/supervisord/supervisord.conf
, 项目的配置文件在/etc/supervisor/conf.d
目录下,新建一个yys.conf文件
# /etc/supervisor/conf.d/yys.conf
[program:yys]
autorestart=True
autostart=True
redirect_stderr=True
;environment=PATH="/home/yys_server/venv"
;command=python manage.py runserver
command=uwsgi uwsgi.ini
user=www-data
directory=/home/yys_server/
配置后即可启动项目
service supervisor start
六,安装Nginx作为反向代理
apt-get install nginx
项目nginx的配置文件在/etc/nginx/conf.d目录下,新建一个yys.conf文件
server {
listen 33333;
server_name 120.79.81.232;
charset utf-8;
client_max_body_size 75M;
location / { try_files $uri @yys; }
location @yys {
include uwsgi_params;
uwsgi_pass unix:/var/sock/yys.sock;
}
}
配置表明Nginx会将收到的端口为33333的所有请求都转发到uwsgi服务器上
# 重启nginx服务器
service nginx restart
大功告成~~~