php - nginx 不为 ingress-nginx 后面的 PHP 应用程序提供 JS、CSS 文件

标签 php docker nginx kubernetes nginx-ingress

似乎无法正常工作,需要帮​​助解决我出错的地方。

有一个旧的 PHP 应用程序子路径为 /adminingress-nginx将其流量转发到 nginx服务器在 Pod 中运行。我已经验证我可以执行以下操作并且它可以正确提供 Assets :

  • kubectl port-forward <admin-pod> 4000:4000
  • skaffold dev --port-forward
  • docker run -p 4000:4000 <image>

但是,当我尝试通过浏览器通过 minikube ip 连接访问它时, 192.168.64.5/admin例如,我刚刚得到以下内容:

enter image description here

它显示 HTML,但没有加载任何资源,因为没有找到它们,我不确定为什么。

这是nginx default.conf为 PHP 应用程序提供服务。如果可能的话,我想在这里修复它,而不是在 ingress.yaml 中修复它。因为它们往往会干扰我的其他路线,并且花了我一些时间才能让它们正常工作。

这是我对这些文件的内容:

# default.conf

server {
  listen 4000;
  # rewrite ^([^.]*[^/])$ $1/ permanent;
  root   /usr/share/nginx/html/src;

  include /etc/nginx/default.d/*.conf;

  index app.php index.php index.html index.htm;

  client_max_body_size 500m;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    # Mitigate https://httpoxy.org/ vulnerabilities
    fastcgi_param HTTP_PROXY "";
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
  }
}
# ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.org/client-max-body-size: "500m"
  name: ingress-service-dev
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /adminv2/
            backend:
              serviceName: admin-new-cluster-ip-service-dev
              servicePort: 4001
          - path: /admin/
            backend:
              serviceName: admin-old-cluster-ip-service-dev
              servicePort: 4000  
          - path: /api/
            backend:
              serviceName: api-cluster-ip-service-dev
              servicePort: 5000
          - path: /
            backend:
              serviceName: client-cluster-ip-service-dev
              servicePort: 3000
# Dockerfile

FROM php:7.3-fpm

# PHP_CPPFLAGS are used by the docker-php-ext-* scripts
ENV PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++11"

RUN apt-get update \
    && apt-get install -y nginx \ 
    && apt-get install -y libpq-dev zlib1g-dev libzip-dev \
    && docker-php-ext-install pgsql zip mbstring opcache 
RUN { \
        echo 'opcache.memory_consumption=128'; \
        echo 'opcache.interned_strings_buffer=8'; \
        echo 'opcache.max_accelerated_files=4000'; \
        echo 'opcache.revalidate_freq=2'; \
        echo 'opcache.fast_shutdown=1'; \
        echo 'opcache.enable_cli=1'; \
    } > /usr/local/etc/php/conf.d/php-opocache-cfg.ini

COPY . /usr/share/nginx/html
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
COPY ./conf/default.conf /etc/nginx/conf.d/default.conf
COPY ./conf/entrypoint.sh /etc/entrypoint.sh

WORKDIR /usr/share/nginx/html/src

RUN composer install
# COPY --chown=www-data:www-data . /app/src

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
RUN mv "/usr/share/nginx/html/conf/file_size.ini" "$PHP_INI_DIR/conf.d/"

# EXPOSE 4000

ENTRYPOINT ["sh", "/etc/entrypoint.sh"]
# project structure

app-root/
  admin-new/
  admin-old/
    conf/
      company.conf
    src/
      css/
      js/
      Templates/
        index.tbs
      index.php
    Dockerfile.dev
  api/
  client/
  manifests/
# docker structure

/app
  conf/
    company.conf
  src/
    css/
    js/
    Templates/
      index.tbs
    index.php
  Dockerfile.dev

感谢您的帮助。

最佳答案

通过将此路径移动到单独的入口配置,设法使所有路由正常工作。可能不太理想,但我只需要它能正常工作,直到 6 个月内更换为止。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.org/client-max-body-size: "500m"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^(/admin)$ $1/ permanent;
  name: ingress-service-dev-admin
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /admin/?(.*)
            backend:
              serviceName: admin-old-cluster-ip-service-dev
              servicePort: 4000  
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^(/new-admin)$ $1/ permanent;
  name: ingress-service-dev
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /new-admin/
            backend:
              serviceName: admin-new-cluster-ip-service-dev
              servicePort: 4001
          - path: /api/
            backend:
              serviceName: api-cluster-ip-service-dev
              servicePort: 5000
          - path: /
            backend:
              serviceName: client-cluster-ip-service-dev
              servicePort: 3000

关于php - nginx 不为 ingress-nginx 后面的 PHP 应用程序提供 JS、CSS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64163992/

相关文章:

linux - 是否有任何版本的 ModSecurity 可以与受支持的 Nginx 版本配合使用?

php - 使用 ZF2 时重定向到公用文件夹

php - Mantis Bug 跟踪器 API 集成?

php - Laravel 8 没有读取 docker-compose 传递的环境值

Docker Compose : Volume declared as external, 但找不到

nginx - 如何使用 nginx 读取和操作 POST 请求变量?

php检查文件名是否存在,重命名文件

php - 在 Mac OS X Yosemite 上安装 php-cgi

docker - 如何使用标签名称作为正则表达式提取 docker hub 图像

git - GitLab HTTP URL 上的 504 网关超时