部署

前端项目部署将静态文件上传到服务器上,用户每次访问时获取静态资源,不需要持续运行。

后端项目部署则是将服务器端代码部署到服务器上,通常需要持续运行以处理请求和提供服务。

监听http端口
  • 127.0.0.1:本地环回地址,只能本机访问。
    • 用于开发或测试,确保服务不暴露给外部设备。
  • 0.0.0.0:通配地址,绑定所有网络接口。
    • 用于外部访问,可接收来自局域网或公网的请求(取决于网络配置)。

  • vite.config.js/webpack.config.js
devServer: {
host: '0.0.0.0', // 允许外部访问
port: 8080,      // 自定义端口
}
  • Flask:

app.run(host='0.0.0.0', port=5000)

The --host option is used to specify the network interface on which the Flask development server should listen for incoming requests.

  • Spring Boot: application.properties:
server.address=0.0.0.0
server.port=8080

网络协议/测试
  • Ping 测试只要求服务器在线并连接到网络,不需要应用程序监听。(ICMP)
  • Curl 测试需要服务器上有应用程序在指定端口监听,并且能处理 HTTP 请求。
  • SSH 是用于 远程登录 和 安全命令行管理 的协议

    ssh -i ./be_key.pem ec2-user@3.27.205.207

    ssh user@msra-dki-02 //msra-dki-02 会被解析成一个 IP 地址或对应的主机名

    scp -i ./be_key.pem ./app.py ec2-user@3.27.205.207:/home/ec2-user/app.py

IP

1. 私有IP地址(Private IP)

用于局域网,不能在互联网中直接路由:

  • 10.0.0.0 - 10.255.255.255(A类,掩码:255.0.0.0)
  • 172.16.0.0 - 172.31.255.255(B类,掩码:255.240.0.0)
  • 192.168.0.0 - 192.168.255.255(C类,掩码:255.255.0.0)

2. 本地环回地址(Loopback Address)

  • 127.0.0.0 - 127.255.255.255
    • 通常是 127.0.0.1,表示本地计算机自身。
    • 用于测试本地网络栈,不会发送到任何网络设备。

每个网络协议或服务会绑定到一个特定的端口。

Flask实现的功能:

最简单的Flask例子:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, World!"

@app.route('/api/data', methods=['GET'])
def get_data():
    return jsonify({"message": "This is your data!"})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Flask 本身不处理并发。Flask 的 app.py 只加载一次,多个请求被 Web 服务器调度分发给不同的 worker 处理。不是每次请求都重启服务。


Nginx

前端后端
devnpm start
入口文件在开发服务器。
python app.py / flask run
服务运行在开发服务器。
prodNginx, CDN
Nginx直接从disk取文件返回,不再需要运行服务器。
Nginx
使用Gunicorn持续运行。

Nginx:Web服务器。主要作用是转发80和443的请求给服务端口/文件目录。

# nginx.conf
server {
    listen 80; # HTTP
    server_name example.com;

    # 前端静态资源
    location / {
        root /var/www/frontend/build;
        index index.html;
        try_files $uri /index.html;
    }

    # 后端 API 请求转发
    location /api/ { # 最长匹配
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}


Docker+Nginx 部署服务

一个Docker一般打包一个服务。

Nginx作为一个单独的服务运行在一个docker中。

docker端口映射:把宿主机的一个端口的流量转发到docker的一个端口

# docker-compose.yml
version: '3'

services:
  flask-app:
    build: ./flask
    ports:
      - "5000:5000"

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - flask-app

Docker+Nginx 部署服务的流程:

  1. flask 打包进 docker 0
  1. nginx 打包进 docker 1
  1. 运行 docker 0,flask在 docker 0: 5000 持续监听请求
  1. 运行 docker 1,nginx 持续监听 http 请求并转发给 docker 0: 5000

请求的路径:宿主机: 80 → docker 1: 80 → docker 0: 5000