如何从主机操作系统上的 nginx 访问 lxc-container 内的文件?

如何从主机操作系统上的 nginx 访问 lxc-container 内的文件?

我有 Ubuntu 14.04 和 lxc-container。主机操作系统和容器都安装了 nginx 1.4.6。

容器的 IP 地址为 10.0.3.100,位于 /home/romka/.local/share/lxc/php55/rootfs/(它是一个非特权容器)。

主机操作系统中的 Nginx 具有以下配置:

上游 php55 {
        服务器 10.0.3.100;
}

服务器 {
        # 一些不重要的指令被跳过

        # 处理非静态请求
        地点 / {
            代理密码 http://php55/;
            proxy_set_header X-真实IP $remote_addr;
            proxy_set_header 远程地址 $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header 主机 $host;
        }

        # 处理静态请求
        位置 ~* ^.+\.(ico|jpg|jpeg|gif|png|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|swf|flv|htc|js|css)$ {
            根/home/romka/.local/share/lxc/php55/rootfs/var/www/do.kece.ru/;
        }

        # 一些不重要的指令被跳过
}

此配置意味着对 php 脚本的请求将传递给容器内的 nginx。对静态文件的请求应由主机操作系统中的 nginx 处理。

对 php 文件的请求正确传递到容器,但对静态文件的请求返回错误“403 Forbidden”,并且在主机操作系统的日志文件中我看到以下行:

2014/12/06 15:56:40 [错误] 966#0:*9 open()“/home/romka/.local/share/lxc/php55/rootfs/var/www/do.kece.ru/1.txt”失败(13:权限被拒绝),客户端:84.23.63.51,服务器:do.kece.ru,请求:“GET /1.txt HTTP/1.1”,主机:“do.kece.ru”

在容器内部,nginx 代表用户和组 www-data:www-data 工作,uid:gid 为 - 33:33;在主机操作系统内部,nginx 代表同一用户工作,uid:gid 为 - 100033:100033。在容器配置中,我有几行:

lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536
lxc.rootfs = /home/romka/.local/share/lxc/php55/rootfs

当我运行 2 个命令:“ps uax | grep nginx”和“lxc-attach -n php55 -- ps uax | grep nginx”时,我发现 nginx 的两个实例具有相同的 uid。

romka@kece:~/.local/share/lxc/php55$ ps uax | grep nginx
root 965 0.0 0.1 85872 1364 ? Ss 15:29 0:00 nginx: 主进程 /usr/sbin/nginx
www-data 966 0.0 0.2 86512 2804 ? S 15:29 0:00 nginx: 工作进程
www-data 967 0.0 0.2 86164 2036 ? S 15:29 0:00 nginx: 工作进程
www-data 968 0.0 0.2 86164 2036 ? S 15:29 0:00 nginx: 工作进程
www-data 969 0.0 0.1 86164 1784 ? S 15:29 0:00 nginx: 工作进程
100000 2763 0.0 0.1 85868 1388 ? Ss 16:21 0:00 nginx: 主进程 /usr/sbin/nginx
www-data 2767 0.0 0.1 86256 1812 ? S 16:21 0:00 nginx: 工作进程
www-data 2768 0.0 0.2 86256 2320 ? S 16:21 0:00 nginx: 工作进程
www-data 2769 0.0 0.1 86256 1812 ? S 16:21 0:00 nginx: 工作进程
www-data 2770 0.0 0.1 86256 1812 ? S 16:21 0:00 nginx:工作进程
romka 2917 0.0 0.0 11748 916 pts/8 S+ 16:24 0:00 grep --color=auto nginx

romka@kece:~/.local/share/lxc/php55$ lxc-attach -n php55 -- ps uax | grep nginx
root 409 0.0 0.1 85868 1388 ? Ss 13:21 0:00 nginx: 主进程 /usr/sbin/nginx
www-data 413 0.0 0.1 86256 1812 ? S 13:21 0:00 nginx: 工作进程
www-data 414 0.0 0.2 86256 2320 ? S 13:21 0:00 nginx: 工作进程
www-data 415 0.0 0.1 86256 1812 ? S 13:21 0:00 nginx: 工作进程
www-data 416 0.0 0.1 86256 1812 ? S 13:21 0:00 nginx: 工作进程

文件具有正确的 chmod 和所有者:

ls -lh /home/romka/.local/share/lxc/php55/rootfs/var/www/do.kece.ru/
总计 8.0K
-rw-r--r-- 1 www-data www-data 6 十二月 5 23:37 1.txt
-rw-r--r-- 1 www-data www-data 17 十二月 5 23:48 index.php

为什么主机操作系统的 nginx 无法访问容器中的文件?我该怎么做才能解决这个问题?

答案1

我认为问题在于父目录阻止了对 LXC rootfs 的权限。因此,您应该将容器中的 /var/www 目录移动到主机中的 /var/local/www/,然后将其绑定安装到容器中,并更改主机 nginx 配置以指向该新位置。

在主机运行:

install -m 750 -o 100000 -g www-data -d /var/local/www/
cp -R /home/romka/.local/share/lxc/php55/rootfs/var/www/ /var/local/www
rm -rf /home/romka/.local/share/lxc/php55/rootfs/var/www/

然后编辑容器配置以添加行

lxc.mount.entry=/var/local/www /home/romka/.local/share/lxc/php55/rootfs/var/www none bind 0 0

然后最后将您的 nginx 配置更改为指向 /var/local/www 以获取静态内容。

相关内容