如何在Docker容器中为PHP安装mod_rewrite模块?

时间:2019-07-27 02:39:20

标签: php apache docker

docker-compose.yml

version: "3.7"
services:

  php:
    build: './php/'
    volumes:
      - ./public_html/www/:/var/www/html/

  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    ports:
      - "8080:80"
    volumes:
      - ./public_html/www/:/var/www/html/
      #- ./log:/var/log/apache2

  mysql:
    image: mysql:5.6.40
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=el-cigarette
      - MYSQL_ROOT_PASSWORD=root

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - '8081:80'



php/Dockerfile

FROM php:7.0-apache
MAINTAINER Webgriffe Srl <support@webgriffe.com>
RUN docker-php-ext-install mysqli && a2enmod rewrite

apache/demo.apache.conf

ServerName localhost

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so



<VirtualHost *:80>
    # Proxy .php requests to port 9000 of the php-fpm container
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    DocumentRoot /var/www/html/

    DirectoryIndex index.php

    <Directory /var/www/html/>
        Options All
            AllowOverride All
        Order allow,deny
        Allow from all
            Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /var/www/1 common
    ErrorLog /var/www/2
</VirtualHost>

我输入了下一个命令 docker-compose构建 docker-compose up -d

我得到那个输出     创建docker-local2_mysql_1 ...完成     创建docker-local2_php_1 ...完成     创建docker-local2_phpmyadmin_1 ...完成     创建docker-local2_apache_1 ...完成

Farther I write this
docker exec -it docker-local2_php_1 sh
# php -m

But I didn't see mod_rewrite module
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

我的.htaccess文件不起作用 我哪里做错了?而我需要做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:2)

如评论中所述,mod_rewrite不是PHP模块,而是apache模块。您已经在以下位置的php / Dockerfile中启用了它:

a2enmod rewrite

不需要其他软件包安装。 通过运行apachectl -M列出所有已启用的模块来验证该模块已启用,您应该看到类似以下内容的

...
rewrite_module (shared)
...

关于您的docker compose文件,看来您使用的是两个单独的容器来运行Web服务,实际上您实际上只需要一个(除非您使用第二个apache容器将对PHP的请求反向代理) -apache容器)。在简单的情况下,已经将PHP和apache预先配置为可以在php:<version>-apache映像中一起工作(例如,预先安装了mod_php),而您只需要复制demo.apache.conf作为php构建的一部分,即可例如:

version: "3.7"
services:
  php:
    build: './php/'
    volumes:
      - ./public_html/www/:/var/www/html/
      - ./apache/demo.apache.conf:/etc/apache2/sites-enabled/demo.conf
  mysql:
    image: mysql:5.6.40
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=el-cigarette
      - MYSQL_ROOT_PASSWORD=root
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - '8081:80'

最后一点,请避免使用links关键字they are deprecated。 Docker compose默认情况下会为您创建一个网络,所有容器都可以使用服务名作为主机名相互解析。

答案 1 :(得分:0)

对我没有帮助 像这样的命令 $ httpd -M $ apachectl -M 他们返回了错误 我进入模块文件夹中,有模块mod_rewrite 但是我仍然不知道如何在Docker容器中运行此模块!