РЕАЛЬНАЯ СИТУАЦИЯ
Я занимаюсь переносом статического веб-сервера в контейнер.
ПРОБЛЕМА ОБНАРУЖЕНА
Когда я пытаюсь подключиться к своему серверу, я получаю сообщение «Файл не найден» с:
- команда curl: curl —insecure -v -H «Хост: » https://127.0.0.1:443
- Браузер: https://
Вот сообщение об ошибке в журнале контейнера NGINX для сайта:
04.07.2023 13:25:38 [error] 8#8: *1 FastCGI отправлено в stderr: «Первичный сценарий неизвестен» при чтении заголовка ответа от восходящего потока, клиент: xxxx, сервер: сайт, запрос: «GET / HTTP/1.1», восходящий поток: «fastcgi://172.22. 0.2:9000″, хост: «сайт»
Вот ошибка 404 в журнале контейнера php:
172.22.0.3 — 04 июля 2023:13:25:38 +0000 «GET /php/index.php» 404
ВЕРСИИ
Вот мои все используемые версии:
- Сервер OS Docker: Red Hat Enterprise Linux Server, выпуск 7.6
- Докер: версия Докера 24.0.2.
- Docker compose : Docker Compose версии v2.18.1
На контейнерах:
- php-fpm: PHP 8.2.0 (fpm-fcgi) / Zend Engine v4.2.0 / Zend OPcache v8.2.0
- ОС для контейнера php: Debian 11.5
- нгинкс: нгинкс/1.23.1
- openssl : OpenSSL 1.1.1n
- ОС для контейнера nginx: Debian 11.5
ФАЙЛЫ КОНФИГУРАЦИЯ
Контейнер PHP-FPM (я никогда не модифицировал файл, я удалил строки «;» для лучшего понимания):
/usr/local/etc/php-fpm.conf
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
include=/usr/local/etc/php-fpm.d/*.conf
;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;
[global]
pid = /usr/local/var/run/php-fpm.pid
error_log = /proc/self/fd/2
log_level = notice
daemonize = no
Контейнер NGINX:
/etc/nginx/conf.d/site1.conf
server {
listen 80;
return 301 https://<site_name>$request_uri; }
server {
listen 443 ssl;
server_name <site_name>;
root /webservers/site1;
# Self-signed with openssl
ssl_certificate /etc/nginx/ssl/testapp1/testapp1.crt;
ssl_certificate_key /etc/nginx/ssl/testapp1/testapp1.key;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index /webservers/oca/php/index.php;
#include fastcgi_params;
#fastcgi_param SCRIPT_FILENAME /usr/local/var/run/$fastcgi_script_name;
include fastcgi.conf;
}
location ~ \.(css|js|gif|ico|jpeg|jpg|png)(.*)$ {
expires max;
}
access_log /var/log/site1.info.access.log;
error_log /var/log/site1.info.error.log;
}
/etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
index php/index.php index.html index.htm;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
ls -a /etc/nginx/
conf.d
fastcgi.conf
fastcgi.conf.bak
fastcgi_params
mime.types
modules
nginx.conf
scgi_params
ssl
uwsgi_params
ls -a /веб-серверы/сайт1
css
js
lifecycle_policy.sh
php
files
ls -a /веб-серверы/сайт1/php
index.php
докер-compose.yml
version: "3.8"
services:
web:
image: nginx:0.1
ports:
- "80:80"
- "443:443"
command:
- service nginx restart
depends_on:
- "php-fpm"
links:
- "php-fpm"
php-fpm:
image: php-fpm:0.1
ports:
- ":9000"
ЧТО Я ПЫТАЮСЬ РЕШИТЬ
Я пробовал много настроек, которые указаны на форумах, но это не сработало.
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
к
fastcgi_param SCRIPT_FILENAME $request_filename;
Перезапустите NGINX
и еще тесты…
ЧТО РАБОТАЕТ
Он работает без fastcgi_param :
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index php/index.php;
}
Но у меня пустая страница…
Он работает с fastcgi_param :
Непосредственно устанавливается на ВМ с NGINX/OPENSSL/PHP-FPM (RedHat 8.7)
ВОПРОС
Я знаю, что на форумах есть много ответов на эту проблему, но я не нашел хорошего решения. У вас есть предложения?
1 ответ
Я наконец решил свою проблему:
Я не понял, что файл .php должен быть в контейнере PHP-FPM. Я создаю свой собственный образ php-fpm и передаю файлы сайта:
FROM repo/php-fpm AS builder
LABEL maintainer="x" description="NGINX PHP"
RUN mkdir /webservers
COPY --chown=root:root site1.tar /webservers
RUN cd /webservers \
&& tar xvf site1.tar \
&& chown -R root:root site1/* \
&& chmod -R 755 site1/*
EXPOSE 9000
ENTRYPOINT ["php-fpm"]
сборка образа докера -t php-fpm:0.1 .
пользователь 20893268
