centos ssh apache php fcgi

其他类别 2025-08-17

标签和各自的Dockerfile链接

  • 2.2.3centos-7 (Centos-7/dockerfile)
  • 1.13.3centos-6 (Centos-6/dockerfile)

概述

Apache PHP(FastCGI)Web服务器,默认情况下仅加载一组最小的Apache模块。

该构建使用基本图像jdeathe/centos-ssh,因此继承了其功能,但默认情况下已禁用sshd 。当运行基于此图像的Docker容器时,主管用于启动Apache httpd守护程序。

图像变体

  • Apache 2.4,PHP-CGI 5.4(FastCGI),PHP MEMCACH 2.2,PHP REDIS 2.2,ZEND OPCACHE 7.0-CENTOS-7
  • Apache 2.2,PHP-CGI 5.3(FastCGI),PHP MEMCACHED 1.0,PHP REDIS 2.2,PHP APC 3.1-CENTOS-6

快速开始

为了生产使用,建议选择一个特定的发布标签,如示例所示。

从Docker Image jdeathe/centos-ssh-apache-php-fcgi上运行一个名为apache-php.1的容器。

 $ docker run -d 
  --name apache-php.1 
  -p 8080:80 
  -e "APACHE_SERVER_NAME=app-1.local" 
  jdeathe/centos-ssh-apache-php-fcgi:2.2.3

请访问http://{{dock*e*r-*host}}:8080使用浏览器{{docker-host}}是您的Docker Server的主机名称,如果一切顺利,您都应该看到“ Hello,World!”页。

为了能够使用“ app-1.local”域名访问服务器,您需要在本地添加主机文件条目;因此,Docker主机的IP地址可以解决到名称“ App-1.local”。另外,您可以使用安装在容器中的elinks浏览器。

请注意,由于您正在使用来自标准端口80的站点的容器中的浏览器。

 $ docker exec -it apache-php.1 
  elinks http://app-1.*lo*ca*l

验证指定的容器的过程状态和健康。

 $ docker ps -a 
  -f "name=apache-php.1"

验证命名容器的成功初始化。

 $ docker logs apache-php.1

在第一次运行时,如果DocumentRoot Directory为空,则将使用示例应用程序脚本和App特定配置文件填充它。

apachectl命令可以如下访问。

 $ docker exec -it apache-php.1 
  apachectl -h

指示

跑步

要从此图像运行A Docker容器,您可以使用标准Docker命令,如下示例所示。另外,还有一个Docker-Compose示例。

为了生产使用,建议选择一个特定的发布标签,如示例所示。

使用环境变量

 $ docker stop apache-php.1 && 
  docker rm apache-php.1; 
  docker run -d 
  --name apache-php.1 
  --publish 8080:80 
  --publish 9443:443 
  --env "APACHE_CUSTOM_LOG_LOCATION=/dev/stdout" 
  --env "APACHE_ERROR_LOG_LOCATION=/dev/stderr" 
  --env "APACHE_EXTENDED_STATUS_ENABLED=true" 
  --env "APACHE_LOAD_MODULES=env_module rewrite_module" 
  --env "APACHE_MOD_SSL_ENABLED=true" 
  --env "APACHE_SERVER_NAME=app-1.local" 
  --env "APACHE_SSL_PROTOCOL=All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1" 
  --env "PHP_OPTIONS_DATE_TIMEZONE=Europe/London" 
  jdeathe/centos-ssh-apache-php-fcgi:2.2.3

环境变量

有可用的环境变量,允许操作员自定义运行容器。

enable_httpd_bootstrap&enable_httpd_wrapper

可能需要防止httpd-bootstrap和/或httpd-wrapper脚本的启动。例如,当使用从该Dockerfile构建的图像作为另一个Dockerfile的源时,您可以通过将ENABLE_HTTPD_WRAPPER设置为false通过将启动服务禁用。这样做的好处是减少最终容器中的运行过程数量。这是另一个用途是使用图像中安装的软件包,例如abcurlelinksphp-cli等。

apache_content_root

Apache DocumentRoot的服务用户和父目录的主目录默认为/var/www/app但在必要时可以使用APACHE_CONTENT_ROOT环境变量进行更改。

 ...
  --env "APACHE_CONTENT_ROOT=/var/www/app-1" 
...
apache_custom_log_location&apache_custom_log_format

可以使用APACHE_CUSTOM_LOG_LOCATION定义Apache CustomLog,以设置文件(或管道),位置和APACHE_CUSTOM_LOG_FORMAT以指定所需的LogFormat昵称。

 ...
  --env "APACHE_CUSTOM_LOG_LOCATION=/var/log/httpd/access_log" 
  --env "APACHE_CUSTOM_LOG_FORMAT=common" 
...

要设置相对于APACHE_CONTENT_ROOT文件路径,路径值应排除领先/

 ...
  --env "APACHE_CUSTOM_LOG_LOCATION=var/log/httpd_access_log" 
...
apache_error_log_location&apache_error_log_level

可以使用APACHE_ERROR_LOG_LOCATION定义Apache Errorlog来设置文件(或管道),位置和APACHE_ERROR_LOG_LEVEL以指定所需的loglevel值。

 ...
  --env "APACHE_ERROR_LOG_LOCATION=/var/log/httpd/error_log" 
  --env "APACHE_ERROR_LOG_LEVEL=error" 
...

要设置相对于APACHE_CONTENT_ROOT文件路径,路径值应排除领先/

 ...
  --env "APACHE_ERROR_LOG_LOCATION=var/log/httpd_error_log" 
...
apache_extended_status_enabled

变量APACHE_EXTENDED_STATUS_ENABLED允许您打开ExtendedStatus。默认情况下它会关闭,因为它对服务器的性能有影响,但是启用了它,您可以收集更多的统计信息。

 ...
  --env "APACHE_EXTENDED_STATUS_ENABLED=true" 
...

您可以使用来自容器上的elinks浏览器或使用watchcurl来监视状态随着时间的推移来查看Apache Server status的输出。以下命令显示了“ App-1.local”的APACHE_SERVER_NAMEAPACHE_SERVER_ALIAS ,以1秒的间隔显示了服务器端口。

 $ docker exec -it apache-php.1 
  env TERM=xterm 
  watch -n 1 
  -d "curl -s 
    -H 'Host: app-1.local' 
    http://127.**0*.0.1/server-status?auto"
apache_header_x_service_uid

APACHE_HEADER_X_SERVICE_UID环境变量用于设置名为X-Service-UID的响应标头,该标题可让您识别服务于内容的容器。当您使用不同端口在单个主机上运行的许多容器,或者您正在运行群集并且需要识别内容所提供的宿主时,这很有用。如果该值包含占位符{{HOSTNAME}}则将其替换为系统hostname值。默认情况下,这是容器ID,但是可以使用--hostname docker create | run参数修改主机名。

 ...
  --env "APACHE_HEADER_X_SERVICE_UID={{HOSTNAME}}" 
...
apache_load_modules

默认情况下,图像加载了最小必需的Apache模块。为了加载其他模块,可以使用APACHE_LOAD_MODULES 。要加载mod_envmod_rewrite apache模块,请使用相应的模块标识符。 IE env_modulerewrite_module

 ...
  --env "APACHE_LOAD_MODULES=env_module rewrite_module"
...
apache_mod_ssl_enabled

默认情况下,SSL支持被禁用,但第二个端口(映射到8443)可用于通过上游SSL终止(SSL卸载)的流量。如果您希望容器直接支持SSL,请设置APACHE_MOD_SSL_ENABLED=true这将生成一个自签名证书,并将更新Apache以接受端口443上的流量。

 $ docker stop apache-php.1 && 
  docker rm apache-php.1; 
  docker run -d 
  --name apache-php.1 
  --publish 8080:80 
  --publish 9443:443 
  --env "APACHE_SERVER_ALIAS=app-1" 
  --env "APACHE_SERVER_NAME=app-1.local" 
  --env "APACHE_MOD_SSL_ENABLED=true" 
  jdeathe/centos-ssh-apache-php-fcgi:2.2.3
apache_mpm

使用APACHE_MPM可以设置Apache MPM。默认为FASTCGI图像的worker默认,不应更改此图像。

 ...
  --env "APACHE_MPM=worker" 
...
apache_run_user&apache_run_group

Apache进程由用户和组分别由APACHE_RUN_USERAPACHE_RUN_GROUP运行。

 ...
  --env "APACHE_RUN_GROUP=www-app" 
  --env "APACHE_RUN_USER=www-app" 
...
apache_public_directory

公共目录是相对于APACHE_CONTENT_ROOT的,它们共同构成了Apache DocumentRoot路径。默认值是public_html ,除非对应用程序的来源进行更改以包括替代公共目录,例如webpublic ,否则不应更改。

 ...
  --env "APACHE_PUBLIC_DIRECTORY=web" 
...
apache_server_alias&apache_server_name

APACHE_SERVER_NAMEAPACHE_SERVER_ALIAS环境变量分别用于设置VirtualHost ServerNameServerAlias值。如果该值包含占位符{{HOSTNAME}}则将其替换为系统hostname值。默认情况下,这是容器ID,但是可以使用--hostname docker create | run参数修改主机名。

在下面的示例中,运行容器将响应主机名app-1.localapp-1

 ...
  --env "APACHE_SERVER_ALIAS=app-1" 
  --env "APACHE_SERVER_NAME=app-1.local" 
...
apache_ssl_certificate

APACHE_SSL_CERTIFICATE环境变量用于定义PEM编码的证书捆绑包。要制作兼容的证书捆绑包,请使用cat命令将证书文件组合在一起。

 $ cat /usr/share/private/server-key.pem 
    /usr/share/certs/server-certificate.pem 
    /usr/share/certs/intermediate-certificate.pem 
  > /usr/share/certs/server-bundle.pem

如果不使用文件路径方法,建议使用PEM文件内容的base64编码。

注意: MAC OSX上的base64命令将默认情况下编码一个无需线路断路的文件,但是如果使用Linux上的命令,则需要使用-w选项,以防止80个字符的包装行。 IE base64 -w 0 -i {{certificate-path}}

 ...
  --env "APACHE_SSL_CERTIFICATE=$(
    base64 -i "/usr/share/certs/server-bundle.pem"
  )" 
...

如果设置为有效的容器文件路径,则将从文件中读取值 - 这允许在与编排功能(例如Docker swarm Secrets)结合使用时将值牢固地设置。

 ...
  --env "APACHE_SSL_CERTIFICATE=/run/secrets/apache_ssl_certificate" 
...
apache_ssl_cipher_suite

使用APACHE_SSL_CIPHER_SUITE环境变量来定义适当的密码套件。默认的“中间”选择应适用于大多数使用对宽范围浏览器的支持。

参考:

  • OpenSSL密码文档。
  • Mozilla安全/服务器端TLS指南。

注意:值表是使用空间分离值以允许文档中的可读性;这是有效的语法,但是使用结肠分离器是建议的形式。

 ...
  --env "APACHE_SSL_CIPHER_SUITE=ECDHE-ECDSA-AES256-GCM-SHA384 
ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-CHACHA20-POLY1305 
ECDHE-RSA-CHACHA20-POLY1305 ECDHE-ECDSA-AES128-GCM-SHA256 
ECDHE-RSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-SHA384 
ECDHE-RSA-AES256-SHA384 ECDHE-ECDSA-AES128-SHA256 
ECDHE-RSA-AES128-SHA256" 
...
apache_ssl_protocol

使用APACHE_SSL_PROTOCOL环境变量来定义支持的协议。默认协议适用于大多数“中间”用例,但是您可能需要限制例如TLS版本支持。

 ...
  --env "APACHE_SSL_PROTOCOL=All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1" 
...
apache_system_user

使用APACHE_SYSTEM_USER环境变量来定义自定义服务用户名。

 ...
  --env "APACHE_SYSTEM_USER=app-1" 
...
php_options_date_timezone

容器和PHP应用程序的默认时区是UTC,但是操作员可以使用PHP_OPTIONS_DATE_TIMEZONE变量设置合适的时区。价值应该是时区标识符,例如UTC或欧洲/伦敦。有效标识符列表可在受支持时区的PHP列表中找到。

为了为英国设置时区并说明英国夏季时间:您将使用:

 ...
  --env "PHP_OPTIONS_DATE_TIMEZONE=Europe/London" 
...
php_options_session_name,php_options_session_save_handler&php_options_session_sever_save_path

使用PHP_OPTIONS_SESSION_SAVE_HANDLERPHP_OPTIONS_SESSION_SAVE_PATH一起配置php以使用替代session.save_handlersession.save_path 。例如,如果您在默认端口6379上的主机redis-server上运行的redis服务器,以下配置将允许将会话数据存储在REDIS中,从而可以在多个PHP容器之间共享会话数据。

使用PHP_OPTIONS_SESSION_NAME可以定义会话名 - 否则使用默认名称“ phpsessid”。

 ...
  --env "PHP_OPTIONS_SESSION_NAME=APPSESSID" 
  --env "PHP_OPTIONS_SESSION_SAVE_HANDLER=redis" 
  --env "PHP_OPTIONS_SESSION_SAVE_PATH=redis-server:6379" 
...

如果使用文件处理程序,则要设置相对于APACHE_CONTENT_ROOT保存路径,路径值应排除领先/

 ...
  --env "PHP_OPTIONS_SESSION_SAVE_HANDLER=files" 
  --env "PHP_OPTIONS_SESSION_SAVE_PATH=var/session" 
...
下载源码

通过命令行克隆项目:

git clone https://github.com/jdeathe/centos-ssh-apache-php-fcgi.git