如何在Docker中为Google Cloud Run配置PHP FPM?

soat7uwm  于 2023-05-27  发布在  PHP
关注(0)|答案(1)|浏览(192)

我试图让一个PHP FPM应用程序在Google Cloud Run(Docker)上运行,但我不确定如何将其设置为使用FPM而不是Apache运行?我到处都找过了,但没有看到任何明确的指示。
我遵循了Google PHP Quickstart教程,所以我有这个工作的Dockerfile:

# Use the official PHP image.
# https://hub.docker.com/_/php
FROM php:apache

# Configure PHP for Cloud Run.
# Precompile PHP code with opcache.
RUN docker-php-ext-install -j "$(nproc)" opcache
RUN set -ex; \
  { \
    echo "; Cloud Run enforces memory & timeouts"; \
    echo "memory_limit = -1"; \
    echo "max_execution_time = 0"; \
    echo "; File upload at Cloud Run network limit"; \
    echo "upload_max_filesize = 32M"; \
    echo "post_max_size = 32M"; \
    echo "; Configure Opcache for Containers"; \
    echo "opcache.enable = On"; \
    echo "opcache.validate_timestamps = Off"; \
    echo "; Configure Opcache Memory (Application-specific)"; \
    echo "opcache.memory_consumption = 32"; \
  } > "$PHP_INI_DIR/conf.d/cloud-run.ini"

# Copy in custom code from the host machine.
WORKDIR /var/www/html
COPY . ./

# Use the PORT environment variable in Apache configuration files.
# https://cloud.google.com/run/docs/reference/container-contract#port
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

# Configure PHP for development.
# Switch to the production php.ini for production operations.
# RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# https://github.com/docker-library/docs/blob/master/php/README.md#configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

有什么想法可以让它与PHP FPM一起工作吗?非常感谢!
我尝试将FROM php:apache更改为FROM php:fpm,但不起作用;我相信这一定是由于它仍然使用Apache的事实?抱歉,我对Docker有点陌生。

zynd9foi

zynd9foi1#

Apache和FPM是两个不同的东西。
简而言之:

  • Apache是处理Web请求的HTTP服务器。世界其他地方将通过HTTP协议与它交谈。
  • FPM是一个FastCGI进程管理器,它“在幕后”管理PHP进程,HTTP服务器将通过FCGI协议与它对话。

因此,您不能将Apache从等式中删除,除非您计划用其他HTTP服务器替换它。
也就是说,php:apache使用mod_php Apache模块来运行PHP,并且您 * 可以 * 在后台运行FPM的容器,但是:

  1. Dockerhub的PHP库镜像目前没有这样的镜像,所以你要么选择一个第三方镜像,要么自己制作。
    1.在一个容器中运行两个不同的守护进程总是有点烦人。[这可能是没有库映像的一个因素]
    1.在最好的情况下,最终结果在功能上与仅按原样使用php:apache图像没有区别。
    正如我在评论中向@John-Hanley建议的那样,如果Cloud Run的代理可以说FCGI,则可能直接连接到FPM容器,但我认为情况不太可能如此,因为FCGI通常不是一个协议,即使是远程公开。更不用说你需要在你的应用程序和/或配置中做出特殊的调整来提供静态文件之类的东西[例如:images,css],通常由HTTP服务器直接处理。
    简而言之:除非您准备投入大量的跑腿工作,否则即使有也不会有明显的差异,那么就按照建议使用股票php:apache图像。

相关问题