在Docker中通过Nginx实现PHP的多个版本

时间:2017-04-26 21:40:16

标签: php docker fastcgi

我为PHP5.6运行了两个docker容器:

docker run --name php5 \
    -v /html1:/var/www/html/site1 \
    -d -p 9001:9000 php:5.6-fpm

对于PHP7:

docker run --name php7 \
  -v /html2:/var/www/html/site2 \
  -d -p 9000:9000 php:7-fpm

我用Nginx运行Docker容器:

docker run --name nginx-cache \
  -v /nginx.conf:/etc/nginx/nginx.conf \
  -v /nginx/html1:/var/www/html/site1 \
  -v /nginx/html2:/var/www/html/site2 \
  -v /sites-enabled:/etc/nginx/sites-enabled/ \
  --link php5 --link php7 -d -p 9999:80 nginx

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    sendfile on;

    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/atom+xml;
    gzip_disable      "msie6";


    ##
    # Basic Settings
    ##

    server_names_hash_bucket_size 64;

    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_body_buffer_size 128k;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

}

使用site1 config:

server {
        listen 80 default_server;

        server_name site1;

        root /var/www/html/site1/;
        index index.php index.html index.htm default.html default.htm;

        fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;
        fastcgi_read_timeout 180;

        location ~ \.php$ {
            fastcgi_pass  php5:9001;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SERVER_NAME $server_name;
        }
}

和site2 config:

server {
        listen 80;

        server_name site2;

        root /var/www/html/site2/;
        index index.php index.html index.htm default.html default.htm;

        fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;
        fastcgi_read_timeout 180;

        location ~ \.php$ {
            fastcgi_pass  php7:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SERVER_NAME $server_name;
        }
}

对site2的请求是200 OK,并且有正确的响应:

curl -X GET \
  http://localhost:9999/index.php \
  -H 'host: site2'

对于site1的请求:

curl -X GET \
  http://localhost:9999/index.php \
  -H 'host: site1'

在Nginx容器日志中,我总是看到:

  

2017/04/26 21:18:27 [错误] 7#7:* 1 connect()失败(111:连接   拒绝)连接上游时,客户端:172.17.0.1,服务器:   site1,request:" GET /index.php HTTP / 1.1",上游:   " fastcgi://172.17.0.3:9001",主持人:" site1"

任何想法如何解决这个问题将非常感激。

1 个答案:

答案 0 :(得分:4)

好的我解决了,非常错误。出于某种原因,我假设如果我像这样暴露端口9001:

docker run --name php5 \
    -v /html1:/var/www/html/site1 \
    -d -p 9001:9000 php:5.6-fpm

然后此端口9001应该在连接到另一个php5容器的Nginx容器中使用。这是错误的,因为暴露的网络连接与链接的网络连接不同。

所以正确的site1配置应该是这样的(端口也是9000):

server {
        listen 80 default_server;

        server_name site1;

        root /var/www/html/site1/;
        index index.php index.html index.htm default.html default.htm;

        fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;
        fastcgi_read_timeout 180;

        location ~ \.php$ {
            fastcgi_pass  php5:9000; # <-- BOOOM!
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SERVER_NAME $server_name;
        }
}