Opened 2 years ago

Closed 2 years ago

Last modified 2 years ago

#1574 closed defect (invalid)

Использование alias и php-fpm

Reported by: BadWings@… Owned by:
Priority: trivial Milestone:
Component: nginx-module Version: 1.15.x
Keywords: Cc: badwings@…
uname -a: Linux 4.15.0-22-generic #24-Ubuntu SMP Wed May 16 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
nginx -V: nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.0g 2 Nov 2017
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-mcUg8N/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

Description (last modified by Maxim Dounin)

Конфиг

server {
	listen 80;
	listen [::]:80;

	root /var/www/html;
	server_name localhost;
	
	
	location / {
		index index.php index.html index.htm;
                
                try_files $uri $uri/ =404;
			
       	}

	location ~ \/wordpress\/(.*\..*) {
		alias /var/www/123/$1;
	}
	
	
	
	location ~ ^((?!(wordpress)).)*\.php$ {
	include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
	}
	
	
}

Очень странный при этом document_root, равен /var/www/123/$1, а script_name = $uri.

Тогда не проходит проверка, в /snippets/fastcgi-php.conf :
try_files $fastcgi_script_name =404; Очевидно что по реальному uri, файла не будет, для этого и используется alias.

Если же пропустить этот шаг. Тогда неправильно формируется SCRIPT_FILENAME по $document_root$fastcgi_script_name.

alias так и должен работать?

Change History (3)

comment:1 by Maxim Dounin, 2 years ago

Description: modified (diff)
Resolution: invalid
Status: newclosed

При использовании директивы alias в переменной $document_root отражается значение alias. В данном случае - это полный путь файла, так как директива alias используется в location'е, заданном регулярным выражением.

При этом переменная $fastcgi_script_name формируется из URI запроса на основании fastcgi_split_path_info.

Соответственно при использовании директивы alias - использовать $document_root$fastcgi_script_name в качестве SCRIPT_FILENAME нельзя. Следует задать SCRIPT_FILENAME явно, либо использовать переменную $request_filename.

Что до использования $fastcgi_script_name в try_files (что вообще-то неправильно, так как использование try_files меняет URI запроса и соответственно $fastcgi_script_name, подробности в тикете #321), то оно тут не будет работать, равно как и try_files $uri ..., так как используется location, заданный регулярным выражением, и в этом случае ведёт себя специально не только директива alias (которая ожидает полный путь к файлу), но и директива try_files - она ожидает "дополнение" к URI запроса. О том, что такое поведение плохо и нелогично - см. в тикете #97.

Отмечу также, что в общем и целом кажется, что в обсуждаемом конфиге нет никакого смысла пытаться героически побеждать все эти сложности. Куда проще будет сделать обычный префиксный location /wordpress/, в котором задать префиксный же alias:

location /wordpress/ {
    alias /var/www/123/;

    location ~ \.php$ {
        try_files $uri ...
        fastcgi_pass ...
        fastcgi_param SCRIPT_FILENAME $request_filename;
        inclue fastcgi_param;
    }
}

В таком виде try_files будет работать ожидаемо из коробки, останется лишь задать SCRIPT_FILENAME.

comment:2 by BadWings@…, 2 years ago

Спасибо за ответ, задачка просто учебная, производственной необходимости побеждать это действительно нет. В общем разобрался, но было бы неплохо если бы эти "нюасны" были бы отражены в официальной документации, учитывая, что рекомендация использовать

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}

идет вместе с конфигом из пакета nginx-common.

comment:3 by Maxim Dounin, 2 years ago

Пакет nginx-common, как и файл snippets/fastcgi-php.conf - целиком на совести мейнтейнеров пакета nginx в вашей операционной системе. В официальных примерах конфигов и в документации - никаких try_files нет, а SCRIPT_FILENAME ставится явно.

Note: See TracTickets for help on using tickets.