【问题标题】:Nginx in docker container and cgi perl in other containerdocker 容器中的 Nginx 和其他容器中的 cgi perl
【发布时间】:2022-01-24 17:13:21
【问题描述】:

我尝试构建 Web 服务器,其中 nginx 在 docker 容器中运行,而我的 Perl 脚本在其他 docker 容器中执行。 我在 perl 容器中使用 fcgiwrap + spawn-fcgi 来运行脚本。 它有效,但在我看来这是单线程的。一次只能执行一个请求。如果我运行 myltiple requests ,所有将等待并且只有 1 运行。

cgi 容器的 Docker 文件看起来像

FROM ff-base

RUN apt update &&\
    apt upgrade -y &&\
    apt-get install -y spawn-fcgi fcgiwrap

EXPOSE 9001

#CMD ["/usr/sbin/fcgiwrap", "-f", "-s", "tcp:0.0.0.0:9001"]
CMD ["/usr/bin/spawn-fcgi", "-n", "-a", "0.0.0.0","-p","9001","--","/usr/sbin/fcgiwrap"]

ff-base 是我的镜像,包含基于 ubuntu 的 perl 安装

我尝试了两条 CMD 行

CMD ["/usr/sbin/fcgiwrap", "-f", "-s", "tcp:0.0.0.0:9001"] 和 CMD ["/usr/bin/spawn-fcgi", "-n", "-a", "0.0.0.0","-p","9001","--","/usr/sbin/fcgiwrap "]

Nginx 配置是

     location ~* ^/cgi-bin/.+\.cgi {
         client_body_timeout  172800s;
         client_max_body_size 0;
         gzip off;
         include fastcgi_params;
         fastcgi_pass   cgi:9001;
         fastcgi_request_buffering off;
         fastcgi_read_timeout 900s;
         fastcgi_send_timeout 900s;
         fastcgi_ignore_client_abort on;
         fastcgi_keep_conn on;
         fastcgi_socket_keepalive on;
        }

这种 cgi 容器的最佳配置是什么?如何使其成为多线程以接受多个请求?也许我应该在容器内使用其他一些 cgi 服务器?

更新

我已经对我的 cgi 容器进行了“实验”,我已将 initialMapRegion 替换为 apache 服务器(在 ubuntu 上的典型安装)。 我看到完全相同的问题

但是当我直接连接到这个 apache(在 docker 内)并在中间不使用 nginx 的情况下进行相同的上传时,它工作得很快。

所以,问题可能是 nginx 如何重新传输输入请求数据。也许它与docker容器之间的网络有关?我使用 docker-compose 来运行容器

【问题讨论】:

    标签: docker perl nginx


    【解决方案1】:

    来自 spawn-fcgi 的文档,

    -F <children>

    要分叉的子节点数,默认为 1。此选项不适用于 -n,如果您想监督同一个套接字上的多个分叉,请查看 multiwatch(1)。

    【讨论】:

    • 我添加了 -n 因为它是在 docker 容器中执行的。据我了解,如果您没有 -n ,则该进程将分叉并退出。因此,docker 容器将停止,因为进程必须运行。但我还没有测试过
    • 如果是这样,那么添加一些东西来防止容器存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2018-01-11
    • 2019-03-14
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多