Nginx 转发 Docker:使用 Nginx 和 Docker 构建简易的反向代理

在现代应用架构中,反向代理服务器是常见的组件之一。Nginx 是一个高性能的 web 服务器和反向代理服务器,被广泛用于处理高并发和负载均衡。而 Docker 则为应用提供了容器化技术,使得应用的部署和扩展变得更加灵活。本文将介绍如何使用 Nginx 转发 Docker 中的请求,并提供代码示例及相关图示来说明搭建过程。

什么是反向代理?

反向代理是一种代理服务器,其工作原理是将用户的请求转发到一个或多个内部服务器上。相较于普通的代理服务器,反向代理对外显得像是直接处理请求的服务器,用户并不需要知道请求实际上是被内部的哪个服务器处理的。

系统架构

在本文中,我们的系统架构将包括以下几部分:

  1. Nginx 服务器:作为反向代理服务器,处理外部请求并转发给 Docker 中的应用。
  2. Docker 容器:运行具体的应用或服务。
  3. 用户终端:发送请求的用户接口。

我们将通过以下状态机图来描述系统的状态变化:

stateDiagram
    [*] --> UserRequest
    UserRequest --> NginxReceived
    NginxReceived --> DockerForwarded
    DockerForwarded --> ApplicationResponse
    ApplicationResponse --> NginxResponse
    NginxResponse --> [*]

环境准备

在开始之前,请确保你已具备以下环境:

  • 安装 Docker 和 Docker Compose
  • 安装 Nginx

接下来,我们将通过 Docker Compose 把 Nginx 和一个简单的应用服务连接起来。

编写 Docker Compose 文件

首先,创建一个名为 docker-compose.yml 的文件,定义 Nginx 和一个简单的 Python Flask 应用。

version: '3'

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

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

Flask 应用

接下来,我们创建一个简单的 Flask 应用。在项目根目录下创建一个 app 文件夹,并在其中新建 app.py 文件:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello from the Flask application!", 200

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

同时,在 app 目录下新建一个 Dockerfile 文件,用于构建 Docker 镜像:

# 使用 Python 官方镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 拷贝应用代码
COPY app.py .

# 安装 Flask
RUN pip install flask

# 启动 Flask 应用
CMD ["python", "app.py"]

Nginx 配置

创建一个 Nginx 配置文件 nginx.conf,使 Nginx 能够将请求转发给 Flask 应用。

server {
    listen 80;

    location / {
        proxy_pass http://web: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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

启动服务

在项目根目录下打开终端,执行以下命令启动 Docker Compose:

docker-compose up --build

此时,Nginx 会运行在 80 端口,Flask 应用在 5000 端口。你可以通过访问 http://localhost/ 来查看结果。

测试

打开浏览器,在地址栏输入 http://localhost/,你应该能看到以下信息:

Hello from the Flask application!

这表示你的请求已经成功从 Nginx 转发到 Flask 应用并返回了响应。

总结

在本篇文章中,我们介绍了如何使用 Nginx 作为反向代理,将请求转发到 Docker 中的 Flask 应用。通过本例可见,借助 Nginx 与 Docker 的组合,构建可扩展的应用架构变得非常简单。反向代理不仅降低了请求处理的复杂性,还能提高系统的安全性和稳定性。

后续步骤:你可以尝试将这个架构进一步扩展,例如添加负载均衡或 SSL 支持,以实现更复杂的功能。希望本教程能为你的开发之旅提供一些帮助和启示。