Laravel (Nginx) в Docker, запросы на субдомены отдает 404?
Уже голову сломал не могу понять в чем причина.
Есть основной домен api.domain.test, тот что указывется в APP_URL отрабатывает без ошибок..
Другие субдомены cabinet.domain.test, admin.domain.test отдают: 404. Причем 404 отдает сам nginx а не Laravel
docker logs backend.fpm:
172.20.0.6 - 17/Dec/2023:11:26:38 +0000 "GET /index.php" 200 // api.domain.test 172.20.0.6 - 17/Dec/2023:11:26:41 +0000 "GET /index.php" 404 // cabinet.domain.test 172.20.0.6 - 17/Dec/2023:11:26:42 +0000 "GET /index.php" 404 // admin.domain.test |
172.20.0.6 - 17/Dec/2023:11:26:38 +0000 "GET /index.php" 200 // api.domain.test 172.20.0.6 - 17/Dec/2023:11:26:41 +0000 "GET /index.php" 404 // cabinet.domain.test 172.20.0.6 - 17/Dec/2023:11:26:42 +0000 "GET /index.php" 404 // admin.domain.test
docker logs backend.web:
172.18.0.2 - - [17/Dec/2023:11:26:38 +0000] "GET / HTTP/1.1" 200 44 "-" // api.domain.test 172.18.0.2 - - [17/Dec/2023:11:26:42 +0000] "GET / HTTP/1.1" 404 555 "-" // cabinet.domain.test 172.18.0.2 - - [17/Dec/2023:11:26:44 +0000] "GET / HTTP/1.1" 404 555 "-" // admin.domain.test |
172.18.0.2 - - [17/Dec/2023:11:26:38 +0000] "GET / HTTP/1.1" 200 44 "-" // api.domain.test 172.18.0.2 - - [17/Dec/2023:11:26:42 +0000] "GET / HTTP/1.1" 404 555 "-" // cabinet.domain.test 172.18.0.2 - - [17/Dec/2023:11:26:44 +0000] "GET / HTTP/1.1" 404 555 "-" // admin.domain.test
docker exec -it backend.fpm php artisan route:list:
GET|HEAD cabinet.domain.test/ ...................................................cabinet.index GET|HEAD admin.domain.test/..................................................... platform.index |
GET|HEAD cabinet.domain.test/ ...................................................cabinet.index GET|HEAD admin.domain.test/..................................................... platform.index
docker-compose.yml:
version: '3.7' services: nginx-proxy: container_name: proxy image: nginxproxy/nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro networks: - reverse-proxy frontend: container_name: frontend image: nuxt3 expose: - 80 environment: API_URL: http://api.domain.test API_REFERRER: http://new.domain.test VIRTUAL_HOST: new.domain.test VIRTUAL_PORT: 80 NITRO_PORT: 80 PORT: 80 networks: - backend - reverse-proxy backend.web: build: context: ${BACKEND_SRC_DIR} target: fpm_server container_name: backend.web expose: - 80 restart: always environment: FPM_HOST: "backend.fpm:9000" VIRTUAL_HOST: api.domain.test,cabinet.domain.test,admin.domain.test VIRTUAL_PORT: 80 PORT: 80 networks: - backend - reverse-proxy depends_on: - "backend.fpm" backend.fpm: context: ${BACKEND_SRC_DIR} target: fpm_server container_name: backend.fpm environment: APP_NAME: "Laravel" APP_DEBUG: "true" APP_URL: http://api.domain.test APP_DOMAIN: api.domain.test CABINET_DOMAIN: cabinet.domain.test DASHBOARD_DOMAIN: admin.domain.test restart: always networks: - backend |
version: '3.7' services: nginx-proxy: container_name: proxy image: nginxproxy/nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro networks: - reverse-proxy frontend: container_name: frontend image: nuxt3 expose: - 80 environment: API_URL: http://api.domain.test API_REFERRER: http://new.domain.test VIRTUAL_HOST: new.domain.test VIRTUAL_PORT: 80 NITRO_PORT: 80 PORT: 80 networks: - backend - reverse-proxy backend.web: build: context: ${BACKEND_SRC_DIR} target: fpm_server container_name: backend.web expose: - 80 restart: always environment: FPM_HOST: "backend.fpm:9000" VIRTUAL_HOST: api.domain.test,cabinet.domain.test,admin.domain.test VIRTUAL_PORT: 80 PORT: 80 networks: - backend - reverse-proxy depends_on: - "backend.fpm" backend.fpm: context: ${BACKEND_SRC_DIR} target: fpm_server container_name: backend.fpm environment: APP_NAME: "Laravel" APP_DEBUG: "true" APP_URL: http://api.domain.test APP_DOMAIN: api.domain.test CABINET_DOMAIN: cabinet.domain.test DASHBOARD_DOMAIN: admin.domain.test restart: always networks: - backend
nginx.conf.template:
server { listen 80 default_server; listen [::]:80 default_server; root /opt/apps/app-source/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff"; index index.php; server_name _; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ .php$ { include fastcgi_params; fastcgi_intercept_errors on; fastcgi_pass ${FPM_HOST}; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; } location ~ /.ht { deny all; } location ~ /.(?!well-known).* { deny all; } } |
server { listen 80 default_server; listen [::]:80 default_server; root /opt/apps/app-source/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff"; index index.php; server_name _; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ .php$ { include fastcgi_params; fastcgi_intercept_errors on; fastcgi_pass ${FPM_HOST}; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; } location ~ /.ht { deny all; } location ~ /.(?!well-known).* { deny all; } }
Dockerfile:
FROM php:8.2.6-fpm-alpine as fpm_server ARG PHP_EXTS ARG PHP_PECL_EXTS ARG PHP_EXT_DEPS ARG PHP_EXT_CONF WORKDIR /opt/apps/app-source RUN apk add --no-cache ${PHP_EXT_DEPS} RUN apk add --virtual build-dependencies --no-cache ${PHPIZE_DEPS} ${PHP_EXT_DEPS} openssl ca-certificates libxml2-dev oniguruma-dev && docker-php-ext-configure ${PHP_EXT_CONF} && docker-php-ext-install -j$(nproc) ${PHP_EXTS} && pecl install ${PHP_PECL_EXTS} && docker-php-ext-enable ${PHP_PECL_EXTS} ${PHP_EXT_ENABLE} && apk del build-dependencies USER www-data COPY --from=composer_base --chown=www-data /opt/apps/app-source /opt/apps/app-source COPY --from=frontend --chown=www-data /opt/apps/app-source/public /opt/apps/app-source/public RUN php artisan event:cache && php artisan route:cache && php artisan view:cache FROM nginx:1.20-alpine as web_server WORKDIR /opt/apps/app-source COPY docker/nginx.conf.template /etc/nginx/templates/default.conf.template COPY --from=frontend /opt/apps/app-source/public /opt/apps/app-source/public |
FROM php:8.2.6-fpm-alpine as fpm_server ARG PHP_EXTS ARG PHP_PECL_EXTS ARG PHP_EXT_DEPS ARG PHP_EXT_CONF WORKDIR /opt/apps/app-source RUN apk add --no-cache ${PHP_EXT_DEPS} RUN apk add --virtual build-dependencies --no-cache ${PHPIZE_DEPS} ${PHP_EXT_DEPS} openssl ca-certificates libxml2-dev oniguruma-dev && docker-php-ext-configure ${PHP_EXT_CONF} && docker-php-ext-install -j$(nproc) ${PHP_EXTS} && pecl install ${PHP_PECL_EXTS} && docker-php-ext-enable ${PHP_PECL_EXTS} ${PHP_EXT_ENABLE} && apk del build-dependencies USER www-data COPY --from=composer_base --chown=www-data /opt/apps/app-source /opt/apps/app-source COPY --from=frontend --chown=www-data /opt/apps/app-source/public /opt/apps/app-source/public RUN php artisan event:cache && php artisan route:cache && php artisan view:cache FROM nginx:1.20-alpine as web_server WORKDIR /opt/apps/app-source COPY docker/nginx.conf.template /etc/nginx/templates/default.conf.template COPY --from=frontend /opt/apps/app-source/public /opt/apps/app-source/public
Дополнительно:
В общем была ошибка: Untrusted Host "cabinet.site.test" из symfony/http-foundation/Request:1172.
Видимо на нее нарваться можно только в том случае, если основное приложение находится на субдомене (APP_ENV=api.site.test), и есть роуты с других субдоменов (в моем случае cabinet.site.test), указание этих субдоменов в middleware TrustHosts, решило проблему
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы настроить Laravel (Nginx) в Docker так, чтобы запросы на субдомены не возвращали ошибку 404, следует выполнить следующие шаги:
1. Проверьте конфигурацию Nginx. Убедитесь, что в конфигурационном файле Nginx есть правильные настройки для обработки запросов на субдомены. Вам может потребоваться добавить директивы server_name для каждого субдомена.
2. Проверьте файл hosts на вашем компьютере. Убедитесь, что у вас правильно настроены записи для каждого субдомена, которые вы используете. Это позволит вашему компьютеру правильно разрешать имена доменов.
3. Проверьте настройки DNS. Убедитесь, что у вас правильно настроены записи DNS для каждого субдомена. Это позволит вашему серверу правильно обрабатывать запросы на эти субдомены.
4. Перезапустите контейнеры Docker. Иногда проблемы могут возникать из-за неправильной конфигурации или некорректной загрузки контейнеров. Попробуйте перезапустить все контейнеры и проверьте, решается ли проблема.
Приведенные выше шаги помогут вам настроить Laravel (Nginx) в Docker так, чтобы запросы на субдомены больше не возвращали ошибку 404. Не забудьте сохранить и применить изменения после внесения правок в конфигурацию.