【问题标题】:nginx return file not found with nginx-proxy and doesn't load static files使用 nginx-proxy 找不到 nginx 返回文件并且不加载静态文件
【发布时间】:2021-06-25 18:36:56
【问题描述】:

我正在使用 nginx-proxy-automation 运行我的 php 应用程序,该应用程序是使用 CodeIgniter 4 编写的,应用程序结构如下:

php-application
   docker
       php-fpm
            config
                php.ini
           Dockerfile
   src
       node_modules
       app
       public
       tests
       vendor
       writable
       .env
       composer.json
       package.json
       spark
   docker-comopse.yml

index.php 文件位于public 文件夹中。 php-applicationdocker-compose.yml 包含以下内容:

nginx
    nginx-proxy
       docker-compose.yml
    php-application
       docker-compose.yml

php-application/docker-compose.yml 里面我有这个:

version: '3.7'

services:
  php-fpm:
    container_name: boilerplate_app
    restart: always
    build:
      context: .
      dockerfile: ./docker/php-fpm/Dockerfile
    volumes:
      - ./src:/var/www/html
    environment:
      # NGINX-PROXY ENVIRONMENT VARIABLES: UPDATE ME
      - VIRTUAL_HOST=mysite.com
      - VIRTUAL_ROOT=/var/www/html/public
      - VIRTUAL_PORT=9000
      - VIRTUAL_PROTO=fastcgi
      - LETSENCRYPT_HOST=mysite.com
      - LETSENCRYPT_EMAIL=info@mysite.com
      - NETWORK=proxy
      # /END NGINX-PROXY ENVIRONMENT VARIABLES
    ports:
      - '9000:80'
    expose:
      - 9000
    networks:
      - proxy

  database:
    container_name: boilerplate_db
    restart: always
    build:
      context: ./docker/database
    environment:
      - MYSQL_DATABASE=boilerplate
      - MYSQL_USER=user
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=secret
    volumes:
      - ./docker/database/data.sql:/docker-entrypoint-initdb.d/data.sql

  phpmyadmin:
    container_name: boilerplate_phpmyadmin
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - 8088:80
    environment:
      - PMA_HOST=database
      - MYSQL_USER=user
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=secret
    depends_on:
      - database

networks:
  proxy:
    external:
      name: proxy

基本上我有三个服务:

  • php-fpm:将应用程序文件挂载到/var/www/html 文件夹中,在environment 部分,我将VIRTUAL_PORT 指定为9000,因为php-fpm 运行在fastcgi 之上。然后我链接了proxy 网络,这是您的图像的网络。
  • 数据库:在应用网络中运行
  • phpmyadmin:在应用网络中运行

php-fpmDockerfile 内容包含以下内容:

FROM php:8.0.2-fpm-alpine
WORKDIR /var/www/html

RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install mysqli
RUN apk add icu-dev

# Install intl
RUN docker-php-ext-configure intl && docker-php-ext-install intl

# Install curl
RUN apk add --update libzip-dev curl-dev &&\
    docker-php-ext-install curl && \
    apk del gcc g++ &&\
    rm -rf /var/cache/apk/*

COPY docker/php-fpm/config/php.ini /usr/local/etc/php/

# Install composer
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer

# Install nodejs
RUN apk add --update nodejs nodejs-npm
RUN npm install gulp-cli -g
RUN npm install

COPY src src/

CMD ["php-fpm"]

EXPOSE 9000

当我使用docker-compose up --build -d 启动容器时,当我访问mysite.com 时收到此消息(我已隐藏真实域以保护隐私):

找不到文件。

使用sudo docker logs -f nginx 检查nginx 日志我得到:

[error] 30#30: *39 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 2.38.140.109, server: mysite.com, request: "GET / HTTP/2.0", upstream: "fastcgi://172.28.0.7:9000", host: "mysite.com"
mysite.com 2.38.140.109 - - [29/Mar/2021:17:52:31 +0000] "GET / HTTP/2.0" 404 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63"

为了解决这个问题,我将nginx.tmpl 更新为this 一个。

现在的问题是,当我加载我的网站时,所有静态文件(如 js/image/css)都返回 404。

我能做些什么来解决这个问题?

【问题讨论】:

  • php-application/docker-compose.yml 环境部分是VIRTUAL_ROOT=/var/www/html,但你说它是/var/www/html/public。你确定你的php-application/docker-compose.yml 吗?如果你让nginx/var/www/html/ 执行一个index.html 看看它是否工作正常呢?
  • 执行容器,然后tail /var/log/nginx/error.log查看错误。之前,运行ls -l /var/log/nginx/error.log。如果它指向stderr,请删除此文件并运行nginx -s reload 并再次运行您的站点,然后运行tail -f ... 以查看错误
  • 检查/etc/resolve.conf。好像有解决问题。检查您的主机和容器。
  • 查看此链接:community.letsencrypt.org/t/…,如果它解决了您的问题,请告诉我
  • 您也可以在您的主机中使用这一行nameserver 8.8.8.8创建/etc/resolve.conf,然后重新启动您的主机的网络并再次尝试您的任务.

标签: php docker nginx docker-compose jwilder-nginx-proxy


【解决方案1】:

为了使用 nginx 代理从容器中提供静态文件,nginx 代理必须能够静态访问文件...它不会“代理”而是“读取”并提供文件...这意味着您必须将应用文件挂载到代理中...

我建议您在 nginx 代理后面安装一个新的、轻便且干净的 nginx 以及您的 php-fpm 服务,这样您就可以全面管理您的路线/位置,

首先,我在我的应用中创建了一个docker-compose.yml,其中包含以下内容:

version: '3.9'

services:

php-fpm:
    container_name: boilerplate_app
    restart: always
    build:
    context: .
    dockerfile: ./docker/php-fpm/Dockerfile
    volumes:
    - ./src:/var/www/html

nginx:
    image: nginx:stable-alpine
    container_name: boilerplate_nginx
    restart: always
    volumes:
    - ./src:/var/www/html
    - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
    - ./docker/nginx/sites/:/etc/nginx/sites-available
    - ./docker/nginx/conf.d/:/etc/nginx/conf.d
    depends_on:
    - php-fpm
    environment:
    VIRTUAL_HOST: example.com
    LETSENCRYPT_HOST: example.com
    LETSENCRYPT_EMAIL: info@example.com
    
database:
    container_name: boilerplate_db
    restart: always
    build:
    context: ./docker/database
    environment:
    - MYSQL_DATABASE=boilerplate
    - MYSQL_USER=user
    - MYSQL_PASSWORD=secret
    - MYSQL_ROOT_PASSWORD=secret
    volumes:
    - ./docker/database/data.sql:/docker-entrypoint-initdb.d/data.sql

phpmyadmin:
    container_name: boilerplate_phpmyadmin
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
    - 8088:80
    environment:
    - PMA_HOST=database
    - MYSQL_USER=user
    - MYSQL_PASSWORD=secret
    - MYSQL_ROOT_PASSWORD=secret
    depends_on:
    - database
    
networks:
default:
    external:
    name: proxy

然后,在我的 app 目录中,我创建了 nginx 配置结构:

app
   docker
       nginx
           conf.d
              default.conf
           sites
              default.conf
        nginx.conf

我有conf.d

upstream php-upstream {
    server php-fpm:9000;
}

那我有sites:

server {
    root   /var/www/html/public;
    index index.php;

    location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO       $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

    fastcgi_pass   php-upstream;
    fastcgi_index  index.php;
    }
}

nginx.conf:

user  nginx;
worker_processes  4;

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

events {
    worker_connections  1024;
}

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

    access_log  /var/log/nginx/access.log;
    # Switch logging to console out to view via Docker
    #access_log /dev/stdout;
    #error_log /dev/stderr;

    sendfile        on;
    keepalive_timeout  65;
    
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-available/*.conf;
}

网站正在加载,但存在一些问题:

  1. 性能问题:我们这里有两个 nginx 层,加载时间增加了很多
  2. 如果我浏览一些像 example.com/admin 这样的 url,我会从 nginx 得到 404,我猜这是我自己的配置问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2019-07-01
    • 2019-05-22
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多