Docker中的nginx和php-fpm

时间:2015-05-28 15:09:06

标签: php nginx docker boot2docker fig

我正处于 Dockerising 我的网络服务器/ php工作流程中。

但是因为我在Windows上,我需要使用虚拟机。我选择了boot2docker,这是一个在Virtualbox中运行的Tiny Core Linux,适用于Docker。

我选择了三个容器:

在boot2docker中,/www/包含我的网站项目和conf/,其中包含以下树:

conf
│
├───fig
│       fig.yml
│
└───nginx
        nginx.conf
        servers-global.conf
        servers.conf

由于docker-compose不适用于boot2docker,我必须使用fig来自动执行所有操作。这是我的fig.xml

mysql:
 image: mysql
 environment:
  - MYSQL_ROOT_PASSWORD=root
 ports:
  - 3306:3306

php:
 image: jprjr/php-fpm
 links:
  - mysql:mysql
 volumes:
  - /www:/srv/http:ro
 ports:
  - 9000:9000

nginx:
 image: nginx
 links:
  - php:php
 volumes:
  - /www:/www:ro
 ports:
  - 80:80
 command: nginx -c /www/conf/nginx/nginx.conf

这是我的nginx.conf

daemon off;

user  nginx;
worker_processes  1;

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

events {
    worker_connections  1024;
}

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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        off;

    keepalive_timeout  65;

    index    index.php index.html index.htm;

    include /www/conf/nginx/servers.conf;

    autoindex on;
}

servers.conf

server {
    server_name lab.dev;
    root /www/lab/;

    include /www/conf/nginx/servers-global.conf;
}

# Some other servers (vhosts)

servers-global.conf

listen 80;

location ~* \.php$ {
    fastcgi_index   index.php;
    fastcgi_pass    php:9000;
    include         /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME     /srv/http$fastcgi_script_name;
}

现在问题了(抱歉所有配置,我认为需要清楚地解释问题):如果我访问lab.dev,没问题(这表明主机是在Windows中创建的)但是如果我尝试访问lab.dev/test_autoload/,我有一个File not found.。我知道这来自php-fpm无法访问文件,nginx日志确认了这一点:

nginx_1 | 2015/05/28 14:56:02 [error] 5#5: *3 FastCGI sent in stderr:
"Primary script unknown" while reading response header from upstream,
client: 192.168.59.3, server: lab.dev, request: "GET /test_autoload/ HTTP/1.1",
upstream: "fastcgi://172.17.0.120:9000", host: "lab.dev", referrer: "http://lab.dev/"

我知道两个容器中index.php都有lab/test_autoload/,我已经检查过了。在nginx中,它位于/www/lab/test_autoload/index.php中的/srv/http/lab/test_autoload/index.phpphp中。{/ p>

我认为问题来自root和/或fastcgi_param SCRIPT_FILENAME,但我不知道如何解决。

我尝试了很多方面,例如修改root,使用rewrite规则,添加/删除某些/等,但没有任何改变。< / p>

再次,抱歉所有这个配置,但我认为需要描述我所处的环境。

3 个答案:

答案 0 :(得分:2)

我终于找到了答案。

变量$fastcgi_script_name没有考虑根(逻辑,因为它本来包含www/。这意味着全局文件无法工作。例如:

# "generated" vhost
server {
    server_name lab.dev;
    root /www/lab/;

    listen 80;

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    php:9000;
        include         /etc/nginx/fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME     /srv/http$fastcgi_script_name;
        # I need to add /lab after /srv/http because it requests PHP to look at the root of the web files, not in the lab/ folder
        # fastcgi_param   SCRIPT_FILENAME     /srv/http/lab$fastcgi_script_name;
    }
}

这意味着我不能只在一个地方写lab/,我需要在两个不同的地方写(root和fastcgi_param)所以我决定自己编写一个使用{{{ 1}}并将其转换为.json文件。如果有人想看看它,请问,分享它会很愉快。

答案 1 :(得分:1)

这里有一个错误:

fastcgi_param   SCRIPT_FILENAME     /srv/http/$fastcgi_script_name;

好的路线是:

fastcgi_param   SCRIPT_FILENAME     /srv/http$fastcgi_script_name;

这不是一回事。

答案 2 :(得分:0)

你的nginx.conf是完全空的,守护进程在哪里关闭; 用户nginx行,worker_processes等。在运行http之前,nginx需要一些配置文件。

在http conf中,同样的事情是,缺少mime类型,default_type,日志sendfile配置为on for boot2docker。

你的问题显然不是Docker的问题,而是使用nginx配置。在使用无花果之前,您是否在运行docker run时测试了应用程序?它有效吗?