首页 > Python基础教程 >
-
带你认识 flask linux 部署
01
传统托管
当提到“传统托管”时,意思是应用是手动或通过原始服务器机器上的脚本安装部署的。该过程涉及安装应用程序、其依赖项和生产规模的Web服务器,并配置系统以确保其安全。
当你要部署自己的项目时,要问的第一个问题是在哪找服务器。目前有很多经济的托管服务。只需每月5美元,Digital Ocean,Linode或Amazon Lightsail就可以租借一台虚拟化Linux服务器(Linode和Digital Ocean为其入门级服务器提供1GB RAM,而亚马逊仅提供512MB)给你运行部署实验。如果你一分钱都不愿意花,那么Vagrant和VirtualBox组合而成的工具,可以让你在自己的计算机上创建一个与付费服务器类似的虚拟服务器。
就技术角度而言,该应用可以部署在任何主流操作系统上,包括各种开放源代码的Linux和BSD发行版以及商用的OS X(OS X是一个开源和商业的混种,因为它基于开源BSD衍生产品Darwin)和Microsoft Windows。
由于OS X和Windows是的桌面操作系统,不是作为服务器的最佳选择,因此不是首选。Linux或BSD操作系统之间的选择很大程度上取决于爱好,所以我将选择其中更受欢迎的Linux。而Linux发行版中,我将再次选择受欢迎的Ubuntu。
02
创建 Ubantu 服务器
如果你有兴趣与我一起部署,那么就需要一台服务器才能开始工作。为你推荐两种选择,一种是付费的,另一种是免费的。如果你愿意花一点钱,可以在Digital Ocean,Linode或Amazon Lightsail上注册一个账户,并创建一个Ubuntu 16.04镜像的虚拟服务器。你应该使用最低配置的服务器,在我写这篇文章的时候,三家的最低配置都是每月5美元。开销是按照服务器启动的小时数进行比例计算的,因此,如果你创建服务器后,使用几个小时然后删除它,那么有可能你只需支付美分级别的费用。
免费的方案基于你的计算机上可以运行虚拟机。要使用此选项,请在你的机器上安装Vagrant和VirtualBox,然后创建一个名为Vagrantfile的文件并用以下内容来描述虚拟机的规格:
Vagrantfile:Vagrant配置
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
end
该文件配置了一个带有1GB RAM的Ubuntu 16.04服务器,你可以用其IP地址192.168.33.10来访问该服务器。要创建服务器,请运行以下命令:
$ vagrant up
03
使用 SSH 客户端
你的服务器处于后端,所以不需要像个人计算机上那样拥有桌面。你可以通过SSH客户端连接到服务器,并运行命令行进行交互。如果你使用的是Linux或Mac OS X,则可能已经安装了OpenSSH。如果你使用Microsoft Windows,Cygwin,Git和Windows Subsystem for Linux提供OpenSSH,因此你可以安装这些选项中的任何一个。
如果你正在使用来自第三方提供商的虚拟服务器,则在创建服务器时,会为其分配IP地址。你可以使用以下命令打开终端会话来连接到该服务器:
$ ssh root@<server-ip-address>
系统会提示你输入密码。密码已在创建服务器后自动生成并显示给你,或者你自己指定了密码。
如果你使用的是Vagrant VM,则可以使用以下命令打开终端会话:
$ vagrant ssh
如果你使用的是Windows并且拥有Vagrant虚拟机,请注意你需要从可以调用ssh
命令的shell运行上述命令
04
免费登录
如果你使用的是Vagrant虚拟机,那么可以跳过本节,因为你的虚拟机已正确配置为使用名为ubuntu
的非root帐户,Vagrant不用输入密码就可以自动登录。
要是你使用的是虚拟服务器,则建议创建一个常规用户来完成你的部署工作,并配置此帐户以便在不使用密码的情况下登录,这么做最初看起来似乎是一个糟糕的主意, 之后你会发现它不仅更方便,而且更安全。
我将创建一个名为ubuntu
的用户帐户(如果你愿意,可以使用其他名称)。要创建这个用户,请使用前一节中的ssh
指令登录到你的服务器的root帐户,然后键入以下命令来创建用户,给它sudo
权限并最终切换到它:
$ adduser --gecos "" ubuntu
$ usermod -aG sudo ubuntu
$ su ubuntu
现在我要配置这个新的ubuntu
帐户来使用public key认证,以便你可以免密登录。
先不管服务器上打开的终端会话,然后在本地计算机上启动第二个终端。如果你使用的是Windows,这需要是可以访问ssh
命令的终端,所以它可能是一个bash
或者类似的提示符的终端,而不是本地的Windows终端。在该终端会话中,检查 ~/.ssh 目录的内容:
$ ls ~/.ssh
id_rsa id_rsa.pub
如果目录列表显示如上所述的名为id_rsa和id_rsa.pub的文件,那么你已经有一个密钥。如果没有这两个文件,或者根本没有 ~/.ssh 目录,则你需要运行以下命令(也是OpenSSH工具集的一部分)来创建SSH密钥对:
$ ssh-keygen
此应用程序将提示你输入一些内容,为此我建议你在所有提示中按Enter以接受默认设置。你当然也可以做一些设置,如果你知道这么做意味着什么的话。
运行此命令后,应该有上面列出的两个文件了。文件id_rsa.pub是你的公钥,这是一个你将提供给第三方的文件,用于识别你的身份。 id_rsa文件是你的私钥,不应与任何人共享。
你现在需要将公钥配置为服务器中的授权主机。在你自己的计算机上打开的终端上,将公钥打印到屏幕上:
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjw....F8Xv4f/0+7WT miguel@miguelspc
这将是一个非常长的字符序列,显示时可能跨越多行(但实际上只有一行)。你需要将此数据复制到剪贴板,然后切换回远程服务器上的终端,你将在其中运行以下命令来存储公钥:
$ echo <paste-your-key-here> >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
免密登录现在应该可以工作了。背后逻辑是,你机器上的ssh
会用私钥执行加密操作来向服务器标识自己。然后服务器使用你的公钥验证操作是否有效。
你现在可以注销ubuntu
会话,然后注销root
会话,然后尝试直接登录到ubuntu
帐户:
$ ssh ubuntu@<server-ip-address>
这一次不用输入密码就登录了!
05
保护你的服务器
为了最大限度地降低服务器受到攻击的风险,你可以采取一些措施来关闭攻击者可能访问的大量潜在漏洞。
我要做的第一个更改是禁用root用户通过SSH登录。你现在可以无密码地访问ubuntu
帐户,并且可以通过sudo
从该帐户运行管理员命令,因此实际上不需要暴露root帐户。要禁用root登录,你需要编辑服务器上的 /etc/ssh/sshd_config 文件。你可能在你的服务器上安装了vi
和nano
文本编辑器,你可以用它来编辑文件(如果你不熟悉这两种文件编辑器,可以首先尝试nano
)。由于SSH配置对普通用户是不可访问的,所以你需要在编辑器命令前添加sudo
(即sudo vi /etc/ssh/sshd_config
)。你需要更改此文件中的单行:
/etc/ssh/sshd_config:禁止root登录
PermitRootLogin no
请注意,要进行此更改,你需要找到以PermitRootLogin
开头的行(找不到就新建一行)并将该值更改为no
。
下一个更改在同一个文件中。现在我要为所有帐户禁用密码登录。你有一个无密码的登录设置,所以没有必要允许密码。如果你对完全禁用密码感到紧张,可以跳过此更改,但对于生产服务器来说,这是一个非常好的主意,因为攻击者经常在所有服务器上尝试随机帐户名和密码并希望能中奖。要禁用密码登录,请在 /etc/ssh/sshd_config 中更改以下行:
/etc/ssh/sshd_config:禁用密码登录
PasswordAuthentication no
完成编辑SSH配置后,需要重新启动ssh服务以使更改生效:
$ sudo service ssh restart
我要做的第三个改变是安装防火墙。这是一个阻止在任何未明确启用的端口上访问服务器的软件:
$ sudo apt-get install -y ufw
$ sudo ufw allow ssh
$ sudo ufw allow http
$ sudo ufw allow 443/tcp
$ sudo ufw --force enable
$ sudo ufw status
这些命令会安装ufw(简单防火墙),并将其配置为仅允许端口22(ssh),80(http)和443(https)上的外部通信。任何其他端口将不被允许