Nginx & UserDir & PHP
У меня довольно простая установка nginx/1.4.7 (из Debian/unstable), и я пытаюсь заставить PHP-скрипты работать внутри UserDir.
сервер { слушать 8083; имя_сервера sid0.local; index index.php index.html; root /data/www/sid0.local; место нахождения / { try_files $ uri $ uri / = 404; } # PHP-FPM location ~ \.php $ { включить fastcgi_params; fastcgi_pass unix: /var/run/php5-fpm.sock; fastcgi_index index.php; } # UserDir местоположение ~ ^/~(.+?)(/.*)?$ { псевдоним /home/$1/www$2; автоиндекс включен; } }
Доступ к http://sid0.local/~dummy
работает, он перечисляет содержание /home/dummy/www/
и я могу получить доступ к файлам там. Под ~dummy/bar
это файл с именем index.php
- пока нет доступа http://sid0.local/~dummy/bar/
приносит страшный "Файл не найден". ошибка (не 404). error.log
имеет:
2014/04/30 23:07:44 [ошибка] 4237#0: *9 FastCGI отправил в stderr: "Основной сценарий неизвестен" при чтении заголовка ответа из апстрима, клиент: 192.168.0.103, сервер: sid0.local, запрос: "GET /~dummy/bar/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", хост: "sid0.local:8083"
Теперь, кажется, у многих людей есть эта проблема, и некоторые из них даже публикуют решения, например, убедиться, что SCRIPT_FILENAME
установлен в request_filename
- но это уже так (это установлено в fastcgi_params).
Тем не менее, работает strace(1)
по отношению к процессу nginx дает (отредактировано для удобства чтения):
4045 connect (16, {sa_family = AF_FILE, path = "/ var / run / php5-fpm.sock"}, 110) = 0 4045 writev (16, [{"\ 1 \ 1 \ 0 \ 1 \ 0 \ 10 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 4 \ 0 \ 1 \ 3T \ 4 \ 0 \ е \0 QUERY_STRING\16\3 REQUEST_METHODGET\ е \0 CONTENT_TYPE\16\0 CONTENT_LENGTH\0170 SCRIPT_FILENAME/ данные / WWW /sid0.local/~ фиктивная / бар /index.php\v\25 SCRIPT_NAME/~ фиктивная / бар / index.php \ v \ е REQUEST_URI/~ фиктивный / бар / \ х \25 DOCUMENT_URI/~ фиктивная / бар / index.php \ г \33 DOCUMENT_ROOT/ данные / WWW / sid0.local
Как вы видете, SCRIPT_FILENAME
не является request_filename
но вместо этого document_root+fastcgi_script_name
- следовательно, 404, конечно.
Итак, я думаю, мой вопрос: почему мой SCRIPT_FILENAME
покалеченный (я даже установил его fastcgi_script_name
не повезло) и как я могу получить сценарии PHP внутри UserDir
Бег?
2 ответа
Я бы изменил корневой каталог вместо использования псевдонима в местоположении. Это может выглядеть так:
listen 8083;
server_name sid0.local;
index index.php index.html;
# Here is magic
set $root_dir /data/www/sid0.local;
rewrite ^(/~[^/]+)$ $1/ redirect;
rewrite ^/~(?<user>[^/]+)(.+) $2;
if ($user) {
set $root_dir /home/$user/www;
}
root $root_dir;
# PHP-FPM
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
}
Еще одна версия без переписывания:
listen 8083;
server_name sid0.local;
index index.php index.html;
root /data/www/sid0.local;
location ~ ^/~(?<user>[\w-]+)(?<path>/.*)$ {
alias /home/lynn/tmp/site/$user/www$path;
autoindex on;
# PHP-FPM
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
}
}
По какой-то причине alias
с именованными захватами работает, в то время как с числовыми ссылками это не удается. Я предполагаю, что числовые ссылки как-то очищаются во вложенном месте.
Основываясь на ответе Алекси Тен, я поместил следующие файлы конфигурации в /etc/nginx/default.d/
как они включены nginx.conf
в моей установке по умолчанию:
$ cat 00-index.conf
index index.html;
$ cat 50-userdirs.conf
location ~ ^/~(?<user>[\w-]+)(?<path>/?.*)$ {
alias /home/$user/www$path;
autoindex on;
}
Обратите внимание на добавленное ?
символ после /
символ для соответствия hostname/~user
без косой черты. Это исправляет одну ошибку 404.
Если вы получаете 403 ошибки из-за SELinux, вам необходимо обновить правила доступа:
# semanage fcontext -a -t httpd_user_content_t '/home/[^/]*/www/.*'
# for userdir in /home/* ; do restorecon -Rvi "$userdir/www" ; done