Skip to content

Linux

服务器大多数都是运行在 Linux 之上

部署前的项目处理

在部署到服务器之前,需要修改加载脚本中的指令

python
# 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)

然后需要修改配置文件

python
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 来连接服务器:

shell
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命令可以登出)。

安装基本库和工具

连接到远程主机后,首先更新系统可安装的包列表,并对可升级的包进行升级:

shell
$ sudo apt update
$ sudo apt upgrade

数据库安装

见进阶课数据库部分课件

设置防火墙

特别提示:如果是购买的阿里云或者腾讯云的服务器,需要在安全组开发端口。

需要在云服务器管理页面开放数据库的端口

Ubuntu 默认安装了 ufw,即 Uncomplicated Firewall,我们需要使用它来设置开放的端口:

shell
$ 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/

下载安装包

shell
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,最简单的方式是在线安装。只需要几行简单的命令( # 号后面是注释):

shell
# 安装 MySQL 服务端、核心程序
sudo apt install mysql-server

# 安装 MySQL 客户端
sudo apt-get install mysql-client

在安装过程中会提示确认输入 YES,设置 root 用户密码(之后也可以修改)等,稍等片刻便可安装成功。