NGINX无法访问应用程序文件以及php fpm和docker时的NGINX配置

NGINX无法访问应用程序文件以及php fpm和docker时的NGINX配置,php,docker,nginx,fpm,Php,Docker,Nginx,Fpm,因此,我的docker设置如下:我有一个接受HTTP请求的Nginx容器,还有另一个容器(我的自定义容器),其中有php fpm和我的应用程序代码。应用程序代码不在主机上,只在web容器中 我想将Nginx配置为一个代理,以获取请求并将它们路由到phpfpm 我的nginx确认如下(我删除了一些不重要的部分): 我的docker配置(同样,我删除了一些不重要的部分) 通过这种配置,我得到了以下Nginx错误:“open()”/app/web“failed(2:没有这样的文件或目录)”,因为Ngi

因此,我的docker设置如下:我有一个接受HTTP请求的Nginx容器,还有另一个容器(我的自定义容器),其中有php fpm和我的应用程序代码。应用程序代码不在主机上,只在web容器中

我想将Nginx配置为一个代理,以获取请求并将它们路由到phpfpm

我的nginx确认如下(我删除了一些不重要的部分):

我的docker配置(同样,我删除了一些不重要的部分)

通过这种配置,我得到了以下Nginx错误:“open()”/app/web“failed(2:没有这样的文件或目录)”,因为Nginx没有访问该文件夹的权限(该文件夹位于php fpm所在的web容器中)

有没有办法配置Nginx来路由HTTP请求,即使它没有访问应用程序代码的权限


我知道解决这个问题的方法之一是将应用程序代码装载到Nginx容器中,但如果可能的话,我希望避免这样做。原因是,在swarm模式下,如果两个容器不共享一个主机,这将不起作用。

我设法解决了这个问题,因此我为有类似问题的人发布了我自己的解决方案

解决方案是在nginx配置中使用“alias”指令,而不是使用“root”指令(我删除了一些不重要的部分):

现在,请求被正确地路由到端口9000上的phpserver,并在那里由php fpm处理。Php fpm通过查看“alias”指令知道要执行哪个脚本

现在的问题是如何为静态文件提供服务。一种解决方案是也通过php fpm为它们提供服务,但从我在线阅读的内容来看,这并不推荐,因为开销会更大。因此,我的解决方案是与nginx docker容器共享所有静态文件,以便ngnix能够访问这些文件并直接为其服务。如果有人对如何在这种情况下提供静态文件有更好的解决方案,请让我知道

# Cache Control for Static Files
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    #access_log        on;
    #log_not_found     off;
    expires           360d;
}

您将
/app/web
指定为web根目录-此文件夹必须可由web服务器访问。*即使它是假的/空的。是的,我理解。有没有一种方法可以让我拥有相同的配置,而不用在nginx配置中指定根文件夹?
nginx:
  ports:
  - 443:443/tcp
  - 80:80/tcp
  image: nginx
  links:
  - web:web

web:
  image: custom_image
  container_name: web
upstream phpserver {
  server web:9000;
}

server {
    listen 443 http2;
    ssl on;
    server_name app;

    ssl_certificate       /ssl.crt;
    ssl_certificate_key  /ssl.key;

    location ~ ^/index\.php(/|$) {
        alias /app/web;

        fastcgi_pass phpserver;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_index index.php;
        include fastcgi_params;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;

        internal;
        http2_push_preload on;
    }
}
# Cache Control for Static Files
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    #access_log        on;
    #log_not_found     off;
    expires           360d;
}