PHP的运行模式:Apache 2.0 Handler 到 FPM

长久以来,我们一直使用Apache作为Web服务器,用Apache2.0 Handler 方式来运行PHP, 也就是mod_php, 把PHP中作为Apache的一个module的来运行。当时算是比较快的配置方式。不过这都是10多年前的配置了。

现在常用的搭配是nginx + PHP-FPM. 这种配置在目前docker时代显得比较合适。web server选用nginx 运行在一个容器内. php 作为一个单独的容器运行,通常打开9000端口来和nginx通讯。

在PHP端的dockerfile配置

选择 php:fpm-alpine 的镜像。记得最后要expose 9000端口。

在 Nginx 段的配置

/etc/nginx/cond.d/default.conf

upstream php-upstream {
    server php:9000
}

这样配置,通过phpfinfo查看, Server API就是 FPM/FastCGI 了。

附录 1: php的dockerfile如下

# newest PHP version
FROM php:fpm-alpine

# Add git
RUN apk --update --no-cache add git

# PostgreSQL
RUN set -ex && apk --no-cache add postgresql-dev
RUN docker-php-ext-install pdo_mysql

COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN rm -rf /var/cache/apk/* && rm -rf /tmp/*

WORKDIR /var/www

CMD composer -V; php-fpm

EXPOSE 9000

注意,需要手动的启动 php-fpm

附录2:nginx的Dockerfile:

FROM nginx:alpine

WORKDIR /var/www

ADD nginx.conf /etc/nginx
ADD sites /etc/nginx/sites-available
ADD conf.d /etc/nginx/conf.d

CMD ["nginx"]

EXPOSE 80 443

附录3: Docker-compose.yml

version: '3'

services:

  php:
    build: ./docker/php
    image: base-php:latest
    volumes:
      - ./app:/var/www:cached

  nginx:
    build: ./docker/nginx
    image: base-nginx:latest
    volumes:
      - ./app:/var/www:cached
      - ./logs/nginx:/var/log/nginx:cached
    ports: [80:80, 443:443]