2016-11-02 3 views
0

Мои статические файлы приложения PHP всегда работают при запуске Apache, но им запрещается доступ при запуске Nginx, хотя оба HTTP-сервера используют моего собственного пользователя (тот, который я вхожу в систему на своем Linux-машине,) в качестве своего пользователя.Статические файлы, обслуживаемые Apache, но не Nginx

Поэтому проблема заключается в конфигурации Nginx или php-fpm.

Вот некоторые из nginx.conf содержания:

user stephane; 
worker_processes 1; 
http { 
    include  mime.types; 
    default_type application/octet-stream; 
    sendfile  on; 
    keepalive_timeout 65; 
    gzip on; 
    gzip_disable "msie6"; 
    gzip_vary on; 
    gzip_proxied any; 
    gzip_comp_level 6; 
    gzip_buffers 16 8k; 
    gzip_http_version 1.1; 
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
    upstream php5-fpm-sock { 
    server unix:/home/stephane/programs/install/php5-fpm.sock; 
    } 
    server { 
    listen  80; 
    server_name localhost; 
    charset utf-8; 
    location/{ 
     root html; 
     index index.html index.htm; 
    } 
    location ~ \.php$ { 
     try_files $uri = 404; 
     fastcgi_index index.php; 
     fastcgi_pass php5-fpm-sock; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
    location ~ /\. { 
     access_log off; 
     log_not_found off; 
     deny all; 
    } 
    } 
    include conf.d/*.conf; 
    include sites-enabled/*; 
} 

Вот Nginx виртуальной конфигурации хоста:

server { 
    listen 443; 
    server_name dev.extrapack.group.com; 
    root /home/stephane/dev/php/projects/Extrapack-Mon/public; 

    ssl on; 
    ssl_certificate /home/stephane/programs/install/nginx/conf/sites-available/extrapack.group.com.crt; 
    ssl_certificate_key /home/stephane/programs/install/nginx/conf/sites-available/extrapack.group.com.key; 

    location /simplesaml { 
    index index.php; 
    alias /usr/share/simplesaml/www; 
    location ~ ^/simplesaml/(module\.php)(/.+)$ { 
     include fastcgi_params; 
     fastcgi_pass php5-fpm-sock; 
     fastcgi_split_path_info ^/simplesaml/(module\.php)(/.+)$; 
     fastcgi_param SCRIPT_FILENAME /usr/share/simplesaml/www/$fastcgi_script_name; 
     fastcgi_param PATH_INFO $fastcgi_path_info; 
     fastcgi_index index.php; 
    } 
    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass php5-fpm-sock; 
    } 
    } 

    location/{ 
    include fastcgi_params; 
    fastcgi_pass php5-fpm-sock; 
    fastcgi_split_path_info ^(.+\.php)(.*)$; 
    try_files $uri /index.php?$args; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param HTTPS 'on'; # Make PHP-FPM aware that this vhost is HTTPs enabled 
    fastcgi_param APPLICATION_ENV development; 
    fastcgi_index index.php; 
    } 
} 

и конфигурации виртуального хоста Apache (который прекрасно работает доступ ко всем статические ресурсы) :

<VirtualHost *:443> 
ServerName dev.extrapack.group.com 
DocumentRoot "/home/stephane/dev/php/projects/Extrapack-Mon/public" 
<Directory "/home/stephane/dev/php/projects/Extrapack-Mon/public"> 
Options Indexes FollowSymLinks Includes 
AllowOverride All   
Require all granted     
</Directory>        
</VirtualHost> 
+0

Есть несколько вещей, которые вы хотите изменить в своей конфигурации, в частности, 'location/{' block. Здесь у вас не должно быть директивы 'fastcgi_pass', потому что у вас есть директива' try_files'. Если он не может найти его, он передает его в php-блок. В любом случае измените свою директиву 'try_files' следующим образом:' try_files $ uri $ uri//index.php$args; 'Наличие второго' $ uri/'сообщает ему, чтобы он перезаписывал любую директорию, которая вычисляет. Поэтому, если ваши активы находятся в подпапках, NGINX может их найти. Если это не указано, оно будет искать в 'root' для файла, а не вложенных папок. –

+0

Я заменил 'try_files $ uri /index.php? $ Args;' на 'try_files $ uri $ uri//index.php$args;' в блоке 'location /' и перезапустил сервер Nginx, но мой пользователь все еще запретил доступ к статическим файлам. Удаление «fastcgi_pass php5-fpm-sock;» сделало файлы php неповторимыми и предлагаемыми для загрузки. – Stephane

ответ

1

Заменить location / с этими двумя местоположениями:

location/{ 
    try_files $uri /index.php?$args; 
} 

location ~ [^/]\.php(/|$) { 
    fastcgi_split_path_info ^(.+?\.php)(/.*)$; 
    if (!-f $document_root$fastcgi_script_name) { 
    return 404; 
    } 
    include fastcgi_params; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass php5-fpm-sock; 
    fastcgi_param HTTPS 'on'; # Make PHP-FPM aware that this vhost is HTTPs enabled 
    fastcgi_param APPLICATION_ENV development; 
    fastcgi_index index.php; 
} 

Первое местоположение обрабатывает статические файлы.

Второе расположение: .php. Поскольку это regexp-location (с ~), он имеет приоритет над первым местоположением, если он совпадает, поэтому .php -files выполняется.

+0

Я сделал, как вы сказали, и действительно статические файлы теперь доступны. Но при запросе корня приложения я получаю «502 Bad Gateway», и журнал ошибок показывает: «[ошибка] 7601 # 0: * 6 connect() не удалось (111: соединение отказано) при подключении к восходящему потоку, клиент: 127.0.0.1 , сервер: dev.extrapack.group.com, запрос: «GET/HTTP/1.1», вверх по течению: «fastcgi: //127.0.0.1: 9000», хост: «dev.extrapack.group.com» ' – Stephane

+0

Я тогда использовал мою собственную конфигурацию, но сохранил ваш шаблон ' location ~ [^ /] \. php (/ | $) {', и теперь он отлично работает. Приложение отображается со статическими файлами. Интересно, что в вашем блоке конфигурации было в пути. Но вы решили проблему. – Stephane

+0

Я перепутал 'include' и' fastcgi_pass', исправил это. Рад, что он работает на вас. – Digitalkapitaen

Смежные вопросы