开发者社区 > 云原生 > Serverless > 正文

在docker里面已经运行起来了http服务,但是直接使用handler执行过长(因为http服务一

在docker里面已经运行起来了http服务,但是直接使用handler执行过长(因为http服务一直在等待请求),现在确定当前http服务,不符合WSGI标准。只是提供了http服务,是不是我还需要写个代理,把请求转发给后面的http服务当中?

展开
收起
飘飘斯嘉丽 2023-06-02 09:54:11 213 0
7 条回答
写回答
取消 提交回答
  • 如果当前的http服务不符合WSGI标准,那么它可能无法直接与Web框架集成。为了解决这个问题,你可以考虑使用一个代理服务器来将请求转发给这个http服务。

    具体来说,你可以使用一个支持WSGI标准的Web框架(如Django或Flask)来构建一个代理服务器。这个代理服务器将接收来自Web框架的请求,并将其转发给当前的http服务。为了确保请求被正确地处理和响应,代理服务器需要确保以下几点:

    正确处理请求头:代理服务器需要将自身的信息添加到请求头中,以便当前http服务知道请求来自代理服务器。 保持连接:代理服务器和当前http服务之间的连接必须是长连接,以便加快请求的速度。 确保请求和响应之间的匹配:代理服务器必须确保当前http服务的响应被发送回正确的请求方。 这样做的好处是,你可以继续使用熟悉的Web框架来构建你的应用程序,而不必直接与当前的http服务进行交互。此外,代理服务器还可以为你提供额外的控制和灵活性,以便更好地管理请求和响应。

    2023-06-02 22:50:27
    赞同 展开评论 打赏
  • 是的,如果你的http服务只提供了简单的http服务,并没有按照WSGI标准进行开发,则建议使用WSGI兼容的Web服务器来暴露你的应用程序,确保它可以在符合WSGI规范的环境中运行,而不是使用简单的http服务。可以使用WSGI兼容的Web服务器(如Gunicorn或uWSGI)作为反向代理接收连接,并将请求发送到你的应用程序中,从而有效地解决http服务长时间等待请求的问题,并提高响应速度和稳定性。

    通过使用反向代理,可以将客户端的请求转发给WSGI服务器,然后将响应结果返回给客户端。反向代理服务器通常具有自己的性能优化和缓存策略,可以提高应用程序的响应速度和稳定性。同时,也可以通过使用Docker Compose和Nginx等技术,构建一个具备负载均衡和高可用性的Web服务架构,以满足更高的性能和可靠性要求。

    2023-06-02 21:33:24
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    是的,如果您的 HTTP 服务不符合 WSGI 规范,那么可以考虑使用一个 WSGI 兼容的 Web 服务器作为代理,将请求转发到您的函数计算服务中。这样可以使得 HTTP 请求能够处理更快,同时也提高了可靠性和安全性。

    常用的 WSGI 兼容的 Web 服务器包括 Gunicorn 和 uWSGI 等。这些 Web 服务器具有自动多进程、多线程等功能,可以优化您的应用程序的性能。当然,还有其他一些 Web 服务器和反向代理工具,例如 Nginx、Apache 等,也可以用来作为代理服务器。您可以根据您的实际使用场景来选择适合的 Web 服务器或代理工具。

    在使用代理工具时,您需要在函数计算中编写代码以便在接收到请求时进行响应,并将其发送回代理服务器。具体实现方式会根据您所选择的代理工具而有所不同,但基本思路都是类似的。

    2023-06-02 21:23:45
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    如果您在Docker容器中运行的HTTP服务不符合WSGI标准,您需要编写一个代理来将请求转发给后面的HTTP服务处理。

    WSGI(Web Server Gateway Interface)是Python Web应用程序的标准接口,它定义了Web服务器和Python Web应用程序之间的通信协议。根据WSGI标准,Web服务器需要将请求转发给应用程序的一个可调用对象(如一个函数或一个类的实例),并将响应从应用程序传递回Web服务器,然后再将其发送回客户端。因此,如果您的HTTP服务不符合WSGI标准,您需要编写一个代理来将请求转发给符合WSGI标准的HTTP服务。

    具体来说,您可以编写一个中间件或代理来将请求转发给符合WSGI标准的HTTP服务。这个中间件或代理可以拦截传入的请求,将其转换为符合WSGI标准的请求,并将其转发给后面的HTTP服务处理。然后,该中间件或代理可以将返回的响应转换为符合HTTP协议的响应,并将其发送回客户端。

    需要注意的是,编写代理时需要注意安全性和性能方面的问题。例如,需要考虑如何防止代理成为攻击目标、如何处理大量的并发请求等问题。因此,建议参考相关的安全和性能指南,以确保代理的安全和性能。

    总之,如果您在Docker容器中运行的HTTP服务不符合WSGI标准

    2023-06-02 18:03:21
    赞同 展开评论 打赏
  • 是的,您需要在 Docker 中运行一个 WSGI(Web Server Gateway Interface)服务器,来将请求转发给您的 Python 程序进行处理。由于您的 HTTP 服务不符合 WSGI 标准,不能直接使用函数计算的 Python 触发器作为入口。而 WSGI 服务器是符合标准的,可以将请求转发并提供标准化的接口给应用程序进行处理。 具体而言,您可以使用 Gunicorn (一个基于 Python 的 WSGI HTTP 服务器)来代理您的 Flask 应用程序,并将 Gunicorn 运行在 Docker 容器中。您可以在 Dockerfile 中安装 Gunicorn,并将该应用程序的入口设置为 Gunicorn。下面是一个简单的示例 Dockerfile,其中假设 Flask 应用程序命名为 app.py:

    FROM python:3.9
    
    WORKDIR /app
    
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . /app
    
    EXPOSE 80
    
    CMD ["gunicorn", "--bind", "0.0.0.0:80", "app:app"]
    
    

    其中,通过 CMD 命令指定了 Gunicorn 服务器的入口并指定监听的端口为 80,可以根据您的实际情况进行更改。使用此 Dockerfile 构建 Docker 镜像后,您可以将其上传至镜像仓库并在函数计算中使用该镜像部署 Python 函数。 需要注意的是,若您的 Docker 镜像较大会导致镜像拉取和启动等操作的时间较长,而这可能会导致函数的冷启动时间变长。为此,您可以通过使用命令对 Docker 镜像进行分层或使用函数计算预热等策略,以降低函数的冷启动时间。

    2023-06-02 15:27:22
    赞同 展开评论 打赏
  • 是的,如果您已经在 Docker 容器中启动了一个 HTTP 服务,可以通过代理将请求发送到该服务中。要想将 HTTP 服务部署为一个符合标准的 WSGI 应用程序,需要使用 WSGI 服务器,例如 Gunicorn、uWSGI 等。

    可以按照以下步骤将您的 HTTP 服务代理到 Gunicorn 中:

    1. 在 Docker 容器中启动 HTTP 服务。

    2. 安装 Gunicorn:

    pip install gunicorn
    
    1. 创建一个 Gunicorn 配置文件,例如 gunicorn.conf.py,指定以下信息:
    # 服务监听的 IP 和端口
    bind = '0.0.0.0:8000'
    # 启动的进程数
    workers = 4
    # 每个进程的线程数
    threads = 2
    # 应用程序的模块名和可调用对象
    # 如果您使用的是 Flask,module 名称为 <your_flask_app>:app
    # 如果您使用的是 Django,module 名称为 <your_django_project>.wsgi:application
    # 这里假设您的应用程序文件名为 app.py,应用实例名称为 app
    module = 'app:app'
    
    1. app.py 文件中,导入您的 HTTP 服务并创建一个应用实例:
    from flask import Flask
    
    app = Flask(__name__)
    
    # 接下来添加您的 Flask 路由定义和业务逻辑代码
    # ...
    
    1. 启动 Gunicorn 服务器:
    gunicorn -c gunicorn.conf.py app:app
    

    这样,您的 HTTP 服务就会被代理到 Gunicorn 中,并且可以作为一个符合标准的 WSGI 应用程序运行。当有请求到达时,Gunicorn 会创建多个进程或线程处理这些请求,并将处理结果返回给请求方。请注意,应确保 Gunicorn 服务器暴露的端口已在容器内部开放并对外可见。同时,需要在应用程序的代码中使用正确的 URL 或主机名连接 Gunicorn 服务器,以确保请求被正确路由到该服务器中。

    2023-06-02 11:13:03
    赞同 展开评论 打赏
  • 可以调超时时间,最多可以一天,也可以用 websocket 建连接。不过一般长时间任务建议用异步调用

    此答案来自钉钉群“阿里函数计算官网客户"

    2023-06-02 09:55:46
    赞同 展开评论 打赏
滑动查看更多

快速交付实现商业价值。

相关电子书

更多
像搭积木一样玩转Docker的持续交付 立即下载
阿里巴巴HTTP 2.0实践及无线通信协议的演进之路 立即下载
CDN助力企业网站进入HTTPS时代 立即下载