php - nginx 不为 ingress-nginx 后面的 PHP 应用程序提供 JS、CSS 文件
问题描述
似乎无法使这项工作正常进行,并且需要有关我哪里出错的帮助。
有一个旧的 PHP 应用程序在/admin
. ingress-nginx
将其流量转发到nginx
Pod 中运行的服务器。我已经验证我可以执行以下操作并且它可以正确地为资产提供服务:
kubectl port-forward <admin-pod> 4000:4000
skaffold dev --port-forward
docker run -p 4000:4000 <image>
但是,当我尝试通过浏览器连接访问它时minikube ip
,192.168.64.5/admin
例如,我只得到以下信息:
它显示 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
推荐阅读
- c - 你知道为什么有些 C 指令可以被完全忽略吗?
- php - Laravel - 如何正确地将按钮路由到控制器功能?
- javascript - 检查控件中的古腾堡媒体上传
- php - 单击更新帖子按钮后,我收到 MethodNotAllowedHttpException 错误
- python - 使用 Folium geo_json 读取 JSON 文件时出错
- python - 如何在 python 中通过 SSH 注入命令?
- excel - VBA InsertRow 问题
- ajax - 我怎样才能等到变量可用?
- python - 使用列标题和行值创建新列
- cs50 - 每个 if 公式的输出,CS50 问题集学分