ubuntu 18.04 搭建flask服务器(大合集)
本次使用的Ubuntu版本为:Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-112-generic x86_64)
本文档基于aliyun服务器上部署个人站步骤建立,全为个人实操,请参考自己项目使用,因为aliyun服务器中的Ubuntu镜像默认使用的就是阿里源,所以我不需要进行换源操作(推荐换为国内源软件下载速度快)
因为服务器上使用的是root账户,所以部分命令没有加sudo权限也能使用,个人电脑上安装时,相应命令无法使用时,可以加上
sudo
权限试试
准备:
本次搭建的是flask服务器环境,需要安装的组件有Nginx、MySQL、uwsgi、flask
Ubuntu 18.04中自带的python版本为
Python 2.7.17 (default, Jul 20 2020, 15:37:01)
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
我的项目python3.6就够用了,所以我不需要对python环境进行改变,如有其它需求,请自行对应修改。
对Ubuntu相关资源升级
- linux资源升级
sudo apt-get update
- linux软件升级
sudo apt-get upgrade
Nginx组件下载安装
1、Nginx下载并安装 sudo apt install nginx
2、查看安装状态:sudo systemctl status nginx
3、查看安装版本:sudo nginx -v
4、上面结果正确后,浏览器访问你服务器的地址可得到下面结果(默认情况下,阿里云的80端口是打开的,如果是本地的话还可能需要配置端口以及防火墙,请自行操作,本地地址http://127.0.0.1:80)
MySQL下载安装
1、MySQL下载安装:sudo apt-get install mysql-server
2、配置MySQL,初始化:sudo mysql_secure_installation
1)验证密码插件可以用来测试密码提高安全性。它检查密码的强度只允许用户设置足够安全。是否要设置验证密码插件?
我选的 N (因为我是个人站,学习使用)
2)然后输入密码,第二次再次输入确认,这个密码就是MySQL数据库的root账号密码
3)默认情况下,MySQL安装有一个匿名用户,允许任何人登录MySQL而不必为他们创建的用户帐户。这只是为了测试,并使安装变得更加顺利。您应该在进入生产之前删除它们环境。
我选的 N
4)通常,只允许根用户从“本地主机”。这确保了有人不能猜到来自网络的根密码。
我选的 Y
5)默认情况下,MySQL附带一个名为“test”的数据库任何人都可以访问。这也仅用于测试,在投入生产前应将其移除环境。
我选的 Y
6)重新加载特权表将确保所有更改到目前为止,将立即生效。
我选的 Y
3、检查服务状态 systemctl status mysql.service
,出现以下结果及说明正常。
4、配置远程访问(仅本地使用即可不管)
1)首先使用root用户登入MySQL sudo mysql -uroot -p
,回车后输入密码
2)GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "password";
*.*
:代表可以访问所有数据库和表
root
:代表远程登录的用户名为root
"%"
:代表任何ip地址都可访问,默认为本地localhost
"password"
:代表远程访问root用户的密码是password
成功后会输出如下字样:Query OK, 0 rows affected, 1 warning (0.00 sec)
成功后使用exit;
退出数据库命令行
实例:
1 创建数据库weixx
CREATE DATABASE weixx;
2 创建用户wxx(密码654321) 并允许wxx用户可以从任意机器上登入mysql的weixx数据库
GRANT ALL PRIVILEGES ON weixx.* TO wxx@"%" IDENTIFIED BY "654321";
5、编辑mysql配置文件vi /etc/mysql/mysql.conf.d/mysqld.cnf
。
将bind-address= 127.0.0.1
注掉。
或者在bind-address后面增加远程访问IP地址
bind-address=127.0.0.1 114.196.197.1
(允许多个IP可访问mysql服务器,空格隔开)
我是简单粗暴直接注释掉
6、重启MySQL服务 service mysql restart
,重启后systemctl status mysql.service
检查服务状态是否为runing,是则正确。
flask 环境安装配置
flask可以安装在虚拟环境中,也可全局安装
1、全局安装 pip3 install Flask
,flask后面可跟版本号,不加版本号默认安装资源路径最新版, (aliyun的Ubuntu中pip默认指向的是python2,我需要用python3,所以使用pip3,如果你默认pip指向为python3则使用pip即可)
使用python -m Flask --version
命令验证安装,该命令将打印 Flask 版本.
我使用的是 python3 -m flask --version 命令,本教程记录时flask最新版为1.1.2
Python 3.6.9
Flask 1.1.2
Werkzeug 1.0.1
2、虚拟环境中安装。
1)安装虚拟模块 sudo apt-get install python3-venv
.
对于使用python2的来说,那么 venv 模块无法使用。相应的,必须安装 virtualenv.
virtualenv 通过操作系统的包管理器安装:
sudo apt-get install python-virtualenv
2)在任何安全位置创建一个你的项目文件夹,用于存放你的项目和虚拟环境,如myproject
。然后进入myproject.
使用python3 -m venv venv
创建一个环境.创建完成后myproject里面会多一个venv
文件夹
3)激活相应的虚拟环境:
. venv/bin/activate
,也可以使用source venv/bin/activate
激活
激活后,你的终端提示符会显示虚拟环境的名称venv
。
4)激活后,在虚拟环境中可使用pip安装flask: pip install Flask
使用命令 pip 而不是 pip3 、 python 而不是 python3。
(不过我在实际使用中,项目后面安装组件的时候有时使用python安装不上,而使用python3反而安装上了,请自己结合实际使用)
5)使用python -m flask --version
验证安装
到此flask就安装完成了。接着就开始在你的项目中写代码吧
3、停用虚拟环境
完成工作后,通过键入 deactivate
来停用环境,您将返回正常的 shell。
flask 项目部署
首先将你的完整项目上传到服务器上,上传的方法有许多,自行上传
我使用的是git方式: git在Ubuntu 18.04上安装方法
项目上传到服务器上后,安装缺少的组件
在本地生成requirements.txt文件
pip freeze > requirements.txt
然后在服务器虚拟环境中安装requirements.txt依赖
pip install -r requirements.txt
所有依赖安装完成后使用python运行项目,如果能成功运行则进入下一步,否则解决所有错误。
项目调试完毕后,进行项目部署
uwsgi 安装和配置
1、使用命令 pip3 install uwsgi
安装uwsgi
安装检测:
创建test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello uwsgi! uwsgi is ok!"]
然后使用 uwsgi运行该文件
uwsgi --http-socket :5000 --wsgi-file test.py
然后浏览器访问服务器的5000端口(aliyun服务器记得配置5000端口的安全组,或者改成你已经有的端口,但不能是80等其他程序占用了的)。
如果浏览器得到** Hello uwsgi! uwsgi is ok! **输出则成功。
2、uwsgi 配置
在项目更目录下新建一个ini文件 vi uwsgi.ini
文件内容参考如下(下面是我使用的ini配置,uwsgi还有许多其他的配置功能,请自行查阅 官方文档):
[uwsgi]
# 监听端口,使用Nginx代理时使用这个
socket = 127.0.0.1:8000
# 独立服务器运行时使用这个
# http = 0.0.0.0:8000
# 工作路径(你的项目根目录路径)
chdir = /www/myproject
# wsgi 路径,项目调用的主程序文件(不在项目根目录需要带上路径)
wsgi-file = myproject_run.py
# 项目内的python程序名称,flask的程序通常叫app,
callable = app
# 设置进程 processes 和 workers 一样的意思
# processes = 2
workers = 2
# 每个进程下面的线程数
threads = 4
# 以独立守护进程运行
master = True
# 允许在请求中开启新线程
enable-threads = True
# 存放uwsgi进程的pid,便于重启和关闭操作
pidfile = uwsgi.pid
# 日志文件
daemonize = uwsgi_server.log
# 返回一个json串,显示各进程和worker的状态
stats=127.0.0.1:9191
# 启用内存报告,报告占用的内存
memory-report=true
# 缓冲区大小,设置请求的最大大小
buffer-size = 65535
3、uwsgi 相关操作
(ini就是上面新建的ini文件,pid文件在ini运行后会出现)
启动:uwsgi --ini xxx.ini
重启:uwsgi --reload xxx.pid
停止:uwsgi --stop xxx.pid
如果你配置的是 http = 0.0.0.0:8000 的话,启动以后你就可以在浏览器中访问你的网站了,不过当前还没有进行Nginx代理,所以浏览器收不到静态资源文件,网页上的静态文件就,反正我自己理解是这样的。
Nginx配置
假设我项目路径为
myproject/
├── manage.py
├── uwsgi.ini
├── static
├── mycss.css
├── myjs.js
├── myimg.jpg
└── project
├── __init__.py
├── settings.py
├── urls.py
└── works.py
myproject项目
路径为/www/myproject
static
为项目静态文件
manage.py
为项目启动文件
uwsgi.ini
为uwsgi配置文件
Nginx配置文件
路径在/etc/nginx/sites-available/default
我是直接改的原本的Nginx配置文件,不想修改原文件的可以复制一份或者网上查看其它教程。
不知道为什么aliyun的Nginx安装后配置文件和网上许多教程路径(/etc/nginx/nginx.conf)不一样,aliyun在nginx.conf文件里面又导入了sites-available文件夹里面的default文件,然后default里面的内容才和网络上大部分教程内容相同(我没研究过Nginx),反正结合自己的实际为准。
vi /etc/nginx/sites-available/default
修改Nginx配置文件内容
我原本文件内容,其中注释已经被我去掉了,占空间
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
其中:
root :指定虚拟主机根目录(web项目根目录)
index :默认首页
修改后:
server {
listen 80;
server_name _ localhost;
root /www/myproject; # 项目路径
location /static{
# 项目静态文件,动静分离
alias /www/myproject/static;
}
location / {
# uwsgi_params在Nginx里面,使用自己的路径
include /etc/nginx/uwsgi_params;
# 这里是之前配置uwsgi时设置的端口号8000
uwsgi_pass localhost:8000;
}
}
然后重启Nginx,网上的许多重启Nginx的教程和aliyun里面安装的Nginx对不上,比如在我的服务器上找不到/usr/local/nginx/sbin
这个路径,我使用的方式是service nginx reload
直接重启,结果能成功,至于为什么,我不知道,反正能用就行,哈哈。
nginx启动:service nginx start
nginx停止:service nginx stop
nginx重启:service nginx reload
到此不出意外的话,恭喜你,你已经可以访问你的网站了。
我的小站,里面什么都没有,只是贴上来说明我操作成功了的。
我的小站还在建设中,所以如有问题后面碰到会修改,如果没改那说明我能够运行