为了巩固自己部署网页的能力,现在将半小时的学习结果总结一下。

前期准备

服务器的准备

这是一开始只有基础配置的服务器:

有基础的ssh服务,也有python包。

1
echo $SHELL

指令输入后,输出为:

1
/bin/sh

这代表Shell类型不是bash

输入:

1
chsh -s /bin/bash   # 修改默认 Shell,需重新登录生效

重新登录后,就会正常使用bash的shell,一般这个更加方便且高效。

连接Github以拉取项目内容

本地生成公钥

一般而言使用Ed25519算法就可以,密码较短,但是这是新系统的配置,可能某些旧系统不能使用。

输入:

1
ssh-keygen -t ed25519

然后就会有提示​:

按回车使用默认路径(~/.ssh/id_ed25519)。

设置密钥密码(可选,增强安全性)。

生成的文件:

私钥:~/.ssh/id_ed25519(需严格保密)

公钥:~/.ssh/id_ed25519.pub(上传到服务器)

上传公钥到远程服务器

1
ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名@服务器IP

输入远程服务器密码,公钥会自动追加到 ~/.ssh/authorized_keys

配置本地 SSH(可选)

1
vim ~/.ssh/config

添加以下内容(示例):

1
2
3
4
5
Host myserver
    HostName 服务器IP或域名
    User 用户名
    Port 22                  # 默认22,若修改则替换
    IdentityFile ~/.ssh/id_ed25519

连接时只需输入​:

1
ssh myserver

禁用密码登录(增强安全)​

这是可选项,一般不用设置,但是安全系数会因为这个提高很多。

编辑服务器 /etc/ssh/sshd_config,添加下面的参数:

1
2
PasswordAuthentication no
PubkeyAuthentication yes

然后重启SSH服务:

1
sudo systemctl restart sshd

拉取远程仓库的内容

以及提前配置本地服务器,所以只需要ssh就可以拉取内容:

1
2
git clone git@github.com:用户名/仓库名.git
cd 仓库名

拉取当前分支最新代码

1
2
3
git pull origin 当前分支名
# 示例(假设分支为main):
git pull origin main

部署生产环境

安装Gunicorn

1
pip install gunicorn

启动Gunicorn

1
gunicorn -w 4 -b 0.0.0.0:8000 app:app

具体意思是:

-w 4: 4个进程

app:app:第一个app是app.py文件名称,第二个app是Flask实例名

注意,第一个文件名称就是网站运行的程序,一般就是使用python3运行后可以直接在本地测试网站的程序。

一般运行指令后:

1
gunicorn -w 4 -b 0.0.0.0:8000 app:app

在浏览器访问 http://服务器IP:8000

就会显示网站内容

在部署 Python Web 应用(如 Flask 或 Django)时,虽然 gunicorn 可以直接处理 HTTP 请求,但结合 Nginx 反向代理是生产环境的最佳实践。

仅仅通过gunicorn来处理,配置复杂且性能较差,不能覆盖高并发的请求,且不够安全,结合Nginx,可以提高效率和安全性。

通过 Nginx + Gunicorn 的分工协作,既能发挥 Python 应用的处理能力,又能利用 Nginx 的高性能和安全特性,是生产部署的黄金组合。

配置Nginx反向代理(推荐)

安装:

1
sudo apt install nginx -y

编辑配置文件:

1
sudo vim /etc/nginx/sites-available/database

其中database就是可自定义的配置文件名称,写入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
server {
    listen 80;
    server_name 你的域名或服务器IP;

    location / {
        proxy_pass http://127.0.0.1:8000;
        include proxy_params;
    }

    location /static/ {
        alias /你的项目路径/static/;
    }
}

启用配置并重启Nginx:

1
2
3
sudo ln -s /etc/nginx/sites-available/database /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

现在可以直接通过 http://服务器IP 访问网站。

设置Gunicorn为系统服务(可选)

这一步主要是设置重启后网站会自动生成。

1
sudo vim /etc/systemd/system/database.service

编辑文件输入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=Database Flask app
After=network.target

[Service]
User=你的用户名
Group=www-data
WorkingDirectory=/你的项目路径/Database
Environment="PATH=/你的项目路径/Database/venv/bin"
ExecStart=/你的项目路径/Database/venv/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app

[Install]
WantedBy=multi-user.target

其中database就是你的项目文件。

然后:

1
2
3
sudo systemctl daemon-reload
sudo systemctl start database
sudo systemctl enable database

ngrok 内网穿透

如果你的服务器IP限制于学校、家庭等不对外开放的网络地址,到这一步你还是不能通过访问https://你的域名或服务器IP/来访问你的网站,除非学校内通过局域网还有可能访问,所以为了展示网站,一般需要内网穿透。

frp(Fast Reverse Proxy)是一个高性能的反向代理应用,常用于内网穿透。一般搭配公网的VPS(比如阿里云、腾讯云、搬瓦工等)作为frp服务端就可以实现高性能的穿透。但是,需要自己购买云服务,这里不考虑。

ngrok 是一个简单易用的内网穿透工具,适合临时演示和开发测试。

最重要的是ngrok官方提供免费服务,但带宽有限,且域名是随机的,所以仅限于测试,但是操作简单且免费。

注册ngrok账号

访问 ngrok官网,注册账号并登录。

下载ngrok客户端

Download ngrok

一般选择Linux版本,下载并解压。

认证ngrok

登录ngrok官网,进入“Your Authtoken”页面,复制你的authtoken。

在服务器上运行:

1
  ./ngrok config add-authtoken <你的authtoken>

启动http隧道

假设你的Nginx监听80端口,运行:

1
  ./ngrok http 80

你会看到类似输出:

1
2
  Forwarding    http://xxxxxx.ngrok.io -> http://localhost:80
  Forwarding    https://xxxxxx.ngrok.io -> http://localhost:80

外网访问

直接用浏览器访问 http://xxxxxx.ngrok.io 或 https://xxxxxx.ngrok.io,就能访问网站!

ngrok 优缺点

  • 优点:简单、无需公网服务器、适合临时演示和开发。

  • 缺点:免费版带宽有限,域名随机,长期服务建议用frp或自建ngrok服务端。

总结

  1. 安装环境 → 2. 获取代码 → 3. 虚拟环境 → 4. 安装依赖 → 5. 初始化数据库

  2. 测试 → 7. Gunicorn部署 → 8. Nginx反代 → 9. 设置自启动 → 10.穿刺(按需)