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