【发布时间】:2020-08-25 20:52:38
【问题描述】:
所以我的 docker 设置如下:我有一个接受 HTTP 请求的 Nginx 容器,我有另一个容器(我的自定义容器),其中有 php-fpm 和我的应用程序代码。应用程序代码不在宿主机上,只在 Web 容器中。
我想将 Nginx 配置为代理,以获取请求并将它们路由到 php-fpm。
我的 nginx 确认如下(我已经删除了一些在这里不重要的部分):
upstream phpserver {
server web:9000;
}
server {
listen 443 ssl http2;
server_name app;
root /app/web;
ssl_certificate /ssl.crt;
ssl_certificate_key /ssl.key;
location ~ ^/index\.php(/|$) {
fastcgi_pass phpserver;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_read_timeout 160;
internal;
http2_push_preload on;
}
}
还有我的 docker 配置(同样,我已经删除了一些不重要的部分)
nginx:
ports:
- 443:443/tcp
- 80:80/tcp
image: nginx
links:
- web:web
web:
image: custom_image
container_name: web
使用此配置,我收到以下 Nginx 错误:“open()”/app/web“失败(2:没有此类文件或目录)”,因为 Nginx 无权访问该文件夹(该文件夹位于web 容器是 php-fpm 的)。
有没有一种方法可以配置 Nginx 来路由 HTTP 请求,即使它无法访问应用程序代码?
我了解解决此问题的方法之一是将应用程序代码挂载到 Nginx 容器,但我想尽可能避免这种情况。这样做的原因是,在 swarm 模式下,如果两个容器不共享主机,那将无法正常工作。
【问题讨论】:
-
您将
/app/web指定为 web-root - 此文件夹必须可供网络服务器访问。 -
*即使是假的/空的。
-
是的,我明白这一点。有没有一种方法可以让我在 nginx 配置中不指定根文件夹的情况下拥有相同的配置?