У меня проблема, не описанная в сети. Я использую VPS Debian 8 Nginx + PHP7.0-FPM. Мой сервер предоставляет php-файлы в исходном коде и не компилирует их, когда я настраиваю Nginx и PHP7.0-FPM для использования сокеты unix (Я делаю это, потому что читал, что он работает быстрее, чем TCP-соединения).
Так что я на самом деле делаю, а это не работает:
#fastcgi_pass 127.0.0.1:9000;
все мои хосты включают этот файл, поэтому мне нужно настроить собственный сокет в каждом файле хоста. Я так делаю:
location ~ '\.php$|^/update.php' { fastcgi_split_path_info ^(.+?\.php)(|/.*)$; fastcgi_pass unix:/var/run/php/example.com.php7.0-fpm.conf; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT /var/www/example.com/www; fastcgi_param PHP_ADMIN_VALUE upload_tmp_dir=/var/www/example.com/tmp/upload; fastcgi_param PHP_ADMIN_VALUE session.save_path=/var/www/example.com/tmp/sessions; }
отредактируйте основной файл пула php7.0-fpm /etc/php/7.0/fpm/pool.d/www.conf для прослушивания сокета (но теперь я не могу понять, зачем мне это здесь):
слушайте = /var/run/php/php7.0-fpm.sock
отредактируйте файл пула моего сайта /etc/php/7.0/fpm/pool.d/example.com.conf, чтобы настроить его собственный сокет (так что здесь это необходимо, я думаю):
слушайте = /var/run/php/example.com.php7.0-fpm.sock
перезапустить службы:
перезапуск службы nginx && перезапуск службы php7.0-fpm
так что мой index.php загружается, как когда я захожу на любую страницу сайта.
Но если я использую TCP-сокет fastcgi_pass 127.0.0.1:9000;
работает нормально.
Что происходит с чрезмерно сложным location
?
location ~ '\.php$|^/update.php' {
Я ожидаю, что ваши запросы действительно не соответствуют этому.
Все, что вам действительно нужно, это:
location ~ \.php$ {
Похоже, у вас неправильное имя файла для fastcgi_pass
так должно быть:
fastcgi_pass unix:/var/run/php/example.com.php7.0-fpm.sock;
Убедитесь, что php-fpm запущен и что файл сокета существует и имеет правильные разрешения для nginx на доступ к файлу. Если у вас установлен и применяется selinux, вам также может потребоваться проверить его журналы, чтобы узнать, не блокирует ли он доступ nginx к файлу.
На стороне php-fpm каждый из этих файлов конфигурации в pool.d
представляет собой отдельный пул исполняемых файлов PHP, и каждому нужен свой сокет. www.conf
не является «основным» файлом конфигурации, это полностью отдельный пул процессов, и его следует отключить / удалить, если вы его не используете. Поскольку оба пула настроены на использование одного и того же сокета, здесь определенно возникает конфликт.
У сокетов Unix есть разрешения
Сокет, соединяющий php и nginx, создается сервисом php7.2-fpm в соответствии с конфигом
sudo nano /etc/php/7.2/fpm/pool.d/www.conf
в этом файле есть
listen = /run/php/php7.2-fpm.sock
listen.owner = www-data
listen.group = www-data
как только вы запустите / перезапустите эту службу
sudo systemctl restart php7.2-fpm.service
он создает файл, представляющий сокет с указанным владельцем и группой
ls -la /run/php
НО Nginx по умолчанию использует другого пользователя, вы можете проверить его в
sudo nano /etc/nginx/nginx.conf
пользователь nginx;
Теперь вам решать, как настроить разрешения. Либо предоставьте больше разрешений для файла сокета, либо измените пользователя для прослушивания, либо измените пользователя nginx ... вы выбираете свой ответ.