写在前面
最近在做一个为学音乐的女朋友定制的无损音乐搜索引擎的flask项目,计划部署到腾讯云服务器上,找了一些方案,最终选定uwsgi+nginx,目前搭建成功了,期间踩了很多坑,走了很多弯路,在此记录一下。
1.基础准备
- 腾讯云服务器(以学生身份购买,价格相当便宜)
- python 3.6.7
- uwsgi
- nginx
2.部署步骤
a.连接腾讯云服务器
ssh -i /Users/Macx/Downloads/test_Flask ubuntu@公网ip
b.将本地项目上传至腾讯云服务器
这里,我应用了scp命令。scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
scp kugou.tar.gz ubuntu@公网ip:~/Flask
这里,有一个坑,我本计划把项目直接上传至uwsgi的根目录 /var/www 中,但由于某种权限的原因始终没有成功,所以只能曲线救国。先将项目通过scp命令上传至没有权限限制的Flask文件夹,再通过 mv 命令将项目移动至跟目录。
mv kugou.tar.gz /var/www # 将文件移动到目标目录下
tar -zxvpf xx.tar.gz # 再解压到当前目录
用 tree -L 2 命令显示当前文档目录结构
c.在Flask项目下创建虚拟环境
virtualenv venv
激活虚拟环境
source venv/bin/activate
d.配置uwsgi文件并运行
编辑 uwsgi.ini文件
vim uwsgi.ini
[uwsgi]
socket = 127.0.0.1:8001
chdir = /var/www/my_flask #指定项目目录
wsgi-file = app.py #启动程序文件
callable = app
processes = 2 #核心数
threads = 4
stats = 127.0.0.1:5000 #状态监测地址
daemonize = /var/www/my_flask/logs/uwsgi.log #添加它,使uwsgi能够后台运行
touch-reload = /var/www/my_flask #项目重新加载的地址
e. 接下来配置nginx进行反向代理
Uwsgi 是一个 Web 服务器,虽然只有 Uwsgi 也可以直接部署项目,但是为了安全,需要 Nginx 来进行请求代理,众所周知类似于学校之类的内部计算机通过信息中心服务器访问外网的行为称为正向代理,所有的访问请求都由中央服务器代理,此时正常情况下外网是不知道你的计算机的地址的;而 Nginx 的作用就是实现反向代理,正向代理代理的是内部计算机,而反向代理代理的是内部服务器,正是有 Nginx 存在,Uwsgi 的真正接口才不会暴露在网络上,服务器的安全才有了一定的保障。此外,Nginx 还自带防 DDoS 攻击机制,可以说日常使用是非常省心了。
vim /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/my_flask; #项目地址
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name 云主机的公网ip地址;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001; #此地址要和uwsgi.ini的套接字相同
uwsgi_param UWSGI_PYHOME /var/www/my_flask/venv; #指向虚拟环境
uwsgi_param UWSGI_CHDIR /var/www/my_flask; #指定网站根目录
uwsgi_param UWSGI_SCRIPT app:app; #指定启动程序
}
}
配置完后重新启动Nginx服务:
sudo service nginx restart
d. 最后执行
uwsgi config.ini
至此,flask项目就部署成功了,通过在浏览器输入公网ip就可以进行访问了!当然还可以购买域名经解析后同样可以访问: