Linux
服务器大多数都是运行在 Linux 之上
部署前的项目处理
在部署到服务器之前,需要修改加载脚本中的指令
# filename:configs.py
import os
from dotenv import load_dotenv
basedir = os.path.abspath(os.path.dirname(__name__))
dot_env_path = os.path.join(basedir, '.env')
flask_env_path = os.path.join(basedir, '.flaskenv')
if os.path.exists(dot_env_path):
load_dotenv(dot_env_path)
if os.path.exists(flask_env_path):
load_dotenv(flask_env_path)
然后需要修改配置文件
class BaseConfig:
"""基本的配置文件"""
...
LOG_LEVEL = logging.WARN
class ProductionConfig(BaseConfig):
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://windows:123456@106.52.167.142/qdbbs"
部署到 Linux 服务器
传统部署就意味着我们要自己搭建一个服务器环境。在此之前,你需要做下面这些任务:
1)租用一个远程主机。租用成功后你会获得主机的 IP 和 root 密码。
提示
提示:选择要安装的服务器操作系统时,建议选择 Linux Ubuntu22.04.4 LTS,因为本节的操作是基于该 Linux 发行版的。
2)(可选)购买一个域名。域名作为互联网中唯一的标识,其他人可以通过这个域名访问到你的程序,这样就不用通过一长串无意义的数字 IP 来访问你的程序。流行的域名购买服务有 腾讯云、阿里云 等。
3)(可选)域名解析,即把域名指向服务器所在的 IP 。
登录远程主机
如果你不习惯使用命令行,那么这对你来说将是个坏消息:你只能通过命令行来操作远程主机。当你获取了远程主机的 IP 和 root 密码,就可以使用 OpenSSH 来连接服务器:
ssh root@your_server_ip
输入密码后,你会看到类似下面的提示,因为是第一次连接,所以本地主机会请求确认远程主机的身份,输入yes按下Enter即可:
The authenticity of host '128.19.128.156 (128.19.128.156)' can't be established.
ECDSA key fingerprint is SHA256:Cwwd1iOGBU17IH2wAqRrNI1yZ5o4AGfLaNPo8ZvvWIc.
Are you sure you want to continue connecting (yes/no)?
现在你会看到命令行提示符变为远程主机的提示符,比如 root@your server name:~$
,这说明你已经成功登录了远程主机(使用exit命令可以登出)。
安装基本库和工具
连接到远程主机后,首先更新系统可安装的包列表,并对可升级的包进行升级:
$ sudo apt update
$ sudo apt upgrade
数据库安装
见进阶课数据库部分课件
设置防火墙
特别提示:如果是购买的阿里云或者腾讯云的服务器,需要在安全组开发端口。
需要在云服务器管理页面开放数据库的端口
Ubuntu 默认安装了 ufw,即 Uncomplicated Firewall,我们需要使用它来设置开放的端口:
$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw allow 443
如果你使用SMTP发送邮件,那么还需要允许 SMTP 使用的端口,比如 25、465 或 587。
通过上面的命令,我们将仅开放远程主机的 22 端口(SSH)、80 端口(HTTP)、443 端口(HTTPS)。更新规则后可以使用下面的命令来开启防火墙:
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
现在你可以通过下面的命令查看防火墙的状态:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
初始化程序环境
安装python环境
安装包地址:https://repo.anaconda.com/miniconda/
下载安装包
wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-x86_64.sh
安装解释器
sh https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-x86_64.sh
下载项目代码
下一步是把我们的程序上传到服务器,这可以有很多种方式实现。因为我们将示例程序代码托管在 GitHub 上,所以最简单的方式还是直接从 GitHub 的 Git 服务器上复制仓库到远程主机:
$ cd ~
$ git clone https://github.com/username/xxxxxx.git
切换进仓库目录,使用 python -m venv venv 创建虚拟环境并安装依赖,最后激活虚拟环境:
$ python -m venv venv
$ source venv/bin/activate
在程序的配置文件中,包含敏感信息的配置都从环境变量中读取。在开发时,我们将这些环境变量定义在.env文件夹中。在部署时,为了让程序正常运行,我们需要在远程主机的项目目录中也创建一个.env文件,并将本地的.env文件内容复制到这个文件中:
$ vim .env
为了确保执行命令时配置和环境正确设置,我们还需要在.env文件中为 FLASK_ENV 变量和自定义的FLASK_CONFIG 变量设置正确的值:
FLASK_ENV=production
FLASK_CONFIG=production
最后我们需要执行程序的初始化操作,如果你使用 Flask-Migrate 扩展可以更新数据库:
$ flask db upgrade
如果没有使用 Flask-Migrate ,那么就使用下面的命令创建数据库表:
$ flask init-db
初始化程序,创建博客管理员账户:
$ flask init
附录
msyql 安装
在 Ubuntu 上安装 MySQL,最简单的方式是在线安装。只需要几行简单的命令( #
号后面是注释):
# 安装 MySQL 服务端、核心程序
sudo apt install mysql-server
# 安装 MySQL 客户端
sudo apt-get install mysql-client
在安装过程中会提示确认输入 YES,设置 root 用户密码(之后也可以修改)等,稍等片刻便可安装成功。