У меня есть экземпляр AWS Lightsail (1 ГБ ОЗУ), на котором запущен относительно новый веб-сайт (т.е. практически нет трафика). Он запускает nginx и PHP-FPM 7.3 (также пробовал с 7.2) и MariaDB. Все это под CentOS 7.
На уровне бесплатного пользования AWS все работало нормально. Я запустил экземпляр T2.micro EC2 и экземпляр T2.micro RDS. Lightsail был немного ... более обидчивым. Чтобы Lightsail работал, я переключил PHP-FPM на ondemand
ondemand - при запуске дочерние элементы не создаются. Потомки будут разветвляться при подключении новых запросов.
Мне пришлось это сделать, иначе MariaDB случайно вылетит. Похоже, это не влияет на проблему ниже.
Админка Wordpress перестала нормально работать и все сказали включить CONCATENATE_SCRIPTS
выкл. Это работает ... в основном. Не работает редактор как постов, так и шаблонов. Никто не смог объяснить мне, почему. Осмотревшись, я кое-что нашел сам.
Страницы не работают, загружаются не полностью. С участием CONCATENATE_SCRIPTS
дальше файлы CSS загружаются на одну гигантскую страницу. Поскольку это не может быть полностью обработано, файлы CSS и JS игнорируются браузером. CONCATENATE_SCRIPTS
работает над этим, просто разделяя их на файлы компонентов, которые меньше по размеру и легко загружаются. Но страницу редактирования нельзя разделить, и отладка основной проблемы сводит с ума. Я получаю ответ 200 и некоторые данные
Но отрисовка страницы не завершена. Я бы сказал, что там может быть 80-90% HTML, но отрезано. В разделе, начинающемся здесь (блок JS)
wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( {"\/":{"body":{"name":"S
он просто резко заканчивается, и каждый раз в один и тот же момент. Это как если бы PHP-FPM или nginx только что остановились, но без каких-либо журналов ошибок (и большинство других проблем, связанных с этим типом настройки, относятся к страницам, которые вообще не рисуются). Еще более странно то, что это делается не для небольших страниц, а только для очень длинных. Нет времени украсть top
и экземпляр, похоже, не находится под какой-либо серьезной нагрузкой, поэтому я не уверен, зачем он это делал. Я перезагрузил все файлы и даже создал отдельный сайт WP, чтобы проверить это, и все они это делают.
В комментариях я включил ведение журнала отладки nginx и обнаружил
2019/08/07 02:33:08 [crit] 1461#0: *47 open() "/var/lib/nginx/tmp/fastcgi/3/00/0000000003" failed (13: Permission denied) while reading upstream, client: x.x.x.x, server: example.com, request: "GET /wp-admin/post-new.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000",
Это не имеет никакого смысла, почему он будет делать это ТОЛЬКО на горстке больших файлов. Ни один привод не заполнен или близок к нему. Я читаю этот вопрос но и nginx, и PHP-FPM работают под apache
. Удаление файлов tmp тоже не помогло. Каталоги принадлежат apache:root
, но изменив их на apache:apache
не имеет никакого эффекта. SELinux, похоже, тоже не виноват. Я тоже не использую proxy_cache
.
Прежде всего, отказ связан с Буферизация FastCGI, а не прокси-кеш.
Это очевидно из /var/lib/nginx/tmp/fastcgi...
.
Почему возникает ошибка только на особенно больших страницах: если ваших настроенных буферов FastCGI недостаточно для размещения всего ответа от PHP-FPM в памяти, и это будет происходить чаще с большими откликами, конечно, NGINX попытается записать части ответа во временные файлы.
И, по-видимому, разрешения на каталог для хранения временных файлов FastCGI не позволяют NGINX сохранять файлы в нем, поэтому он не работает точно в определенный момент, когда ответ «слишком велик».
Тропинка /var/lib/nginx/tmp/fastcgi
также указывает на то, что вы не используете официальный дистрибутив NGINX, потому что, если бы вы это сделали, то в итоге получили бы /var/cache/nginx/fastcgi_temp
принадлежит nginx:root
.
Я бы посоветовал использовать стандартный, официальный дистрибутив NGINX.
но и nginx, и PHP-FPM работают под apache
Не по теме, но: В любом случае это неверная настройка. Правильная установка - запуск NGINX от имени одного пользователя (будь то apache
, nginx
или что-нибудь еще), тогда как пул PHP-FPM вашего приложения работает под собственным пользователем, например foo
. Тогда сделай свой nginx
пользователь член foo
группа. Нет оправдания тому, чтобы запускать все под одним пользователем только потому, что у вас есть только одно приложение на данном сервере.
В любом случае относитесь к нему как к типичному chmod
выпуск:
user
директива в вашей конфигурации)Например, ваш рабочий процесс NGINX действительно, как вы сказали, выполняется apache
пользователь и он не может получить доступ /var/lib/nginx/tmp/fastcgi
:
sudo -u apache ls /var/
Это сработало? С разрешениями все в порядке, вы можете перейти в этот каталог через пользователя рабочего процесса NGINX. Важно понимать, что вам нужно иметь возможность перемещаться (как в rx
разрешение) во все верхние каталоги, чтобы иметь возможность читать содержимое любого каталога ниже. То есть для нашего "конечного пункта назначения", который /var/lib/nginx/tmp/fastcgi
, нам нужно уметь читать все /var
, /var/lib
, и т.д..
Если читать /var
не работает (хотя это может указывать на своего рода коррумпированную систему), вам нужно позволить "другим" читать это, например chmod o+rX /var
sudo -u apache ls /var/lib
Это работает? Разрешения для / var / lib в порядке. Если нет, вы должны позволить другим прочитать это: chmod o+rX /var/lib
sudo -u apache ls /var/lib/nginx
Это работает? Если нет, проверьте права собственности и разрешения через stat
. Затем убедитесь, что пользователь NGINX является владельцем каталога. /var/lib/nginx
и что chmod
(на этот раз для "owner") позволяет ему перейти в каталог:
chown apache:root /var/lib/nginx
chmod u+rX /var/lib/nginx
Убедитесь, что тот же (принадлежит пользователю NGINX, может быть прочитан (пройден) им) для /var/lib/nginx/tmp
И наконец для /var/lib/nginx/tmp/fastcgi
вам понадобится пользователь NGINX, чтобы иметь возможность выполнять все операции чтения, выполнения (перехода к) и записи:
chown apache:root /var/lib/nginx/tmp/fastcgi
chmod 0700 /var/lib/nginx/tmp/fastcgi
Так что в основном это промывка, повторение операции, переходя к нужным файлам, пока она не сработает.
Убедитесь, что все настроено правильно, попытавшись просмотреть содержимое каталога и создав в нем файлы:
sudo -u apache ls /var/lib/nginx/tmp/fastcgi
sudo -u apache touch /var/lib/nginx/tmp/fastcgi/test.txt