Nginx не выбирает правильный php-стек в месте

ОБНОВЛЕНИЕ 28.02.2019

Проблема заключается в следующей части моего серверного блока:

        # Don't use `$uri` here, see https://github.com/yandex/gixy/issues/77
        rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
        rewrite ^(/[^/]+)?(/wp-.*) $2 last;
        rewrite ^(/[^/]+)?(/.*\.php) $2 last;
    }

Без нее все, наконец, работает, как задумано. Проблема в том, что этот необходим для запуска установки Wordpress-Multisite. Без него невозможно использовать wp-admin.

После обнаружения проблемы - есть ли у кого-нибудь идея, как ее решить? (помимо обычной установки Wordpress и разделения форума через прокси, как предложено ниже)

TL; dr

Я создал блок местоположения (/ de / forum /) вне корневой папки nginx, но php отправляется компилятору php внутри корня, поэтому существует несоответствие каталога. Он не принимает определенный стек php внутри нового блока местоположения. Помогите!

Блок локации / de / forum / работает, но только для файлов, а не для php. С php я получаю сообщение «Файл не найден», потому что он использует основную корневую папку в качестве основы, а не новый псевдоним.

И я не могу понять, как заставить nginx использовать более конкретный php с правильным «fastcgi_param SCRIPT_FILENAME $». request_filename; ".

.

Следующая ситуация:

Стек LEMP с php7.2-fpm

Многосайтовая установка Wordpress на domain.com - настроена для использования подкаталогов. Для этого домена их два: domain.com/de/ и domain.com/en/. Как вы, наверное, догадались, для разных языковых версий блога. Пример страницы - domain.com/en/contact-us, а сообщение в блоге - domain.com/en/this-is-a-blog-1451

. Итак, у нас есть:

domain.com/de/
domain.com/en/
domain.com/en/contact-us
domain.com/en/this-is-a-blog-1451

Мы хотим добавить:

domain.com/de/forums/
domain.com/en/forums/

А вот как выглядит структура папок:

/var/www/domain.com/
/var/www/domain.com/html/
/var/www/domain.com/html/index.php #(Wordpress)
/var/www/domain.com/forum-de/index.php #(Xenforo)
/var/www/domain.com/forum-en/index.php #(Xenforo)
/var/www/domain.com/logs/
/var/www/domain.com/ssl/
/var/www/domain.com/wp-config.php

Итак, нам нужно создать блог местоположения для папок форума. Теоретически более конкретный блок местоположения (/ de / forum /) должен иметь прецедент над общим /, поэтому блок всегда должен указывать на форум, а не на Wordpress.

Вот мой полный блок сервера - с комментариями для вас :

server {

listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name domain.com;

root /var/www/domain.com/html;
error_log /var/www/domain.com/logs/error.log warn;
access_log /var/www/domain.com/logs/access.log;
index index.php;

location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
    expires max;
    log_not_found off;
}
# denies all hidden files
location ~ /\. {
    deny all;
}
# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";



    location / {
            # This is cool because no php is touched for static content.
            # include the "?$args" part so non-default permalinks doesn't break when using query string
            try_files $uri $uri/ /index.php?$args;
    }

    if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;  
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;                     
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;                   
    }




# indicate locations of SSL key files.
ssl_certificate /var/www/domain.com/ssl/ssl.crt;
ssl_certificate_key /var/www/domain.com/ssl/ssl.key;

# Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
# see https://hstspreload.org/
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_ecdh_curve X25519:P-256:P-384:P-224:P-521;

ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';


# generate by "openssl dhparam -outform PEM -out dhparam2048.pem 2048"
ssl_dhparam /etc/nginx/ssl/dhparam2048.pem;
#ssl_ecdh_curve secp384r1; SEEMS NOT TO WORK WITH CLOUDFLARE
ssl_prefer_server_ciphers on;

# Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
# see https://hstspreload.org/
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

# DO NOT USE!!!!
# DO NOT USEadd_header Public-Key-Pins 'pin-sha256="AKTUELLER-KEY-HASH"; pin-sha256="BACKUP-KEY-HASH"; max-age=31536000; includeSubDomains';
# DO NOT USE!!!!


ssl_session_cache shared:SSL:30m;
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets on;
# generate with "head -c 48 /dev/urandom > /etc/nginx/ssl/nginx_ticketkey"
ssl_session_ticket_key /etc/nginx/ssl/nginx_ticketkey;
ssl_session_timeout 41m;


# resolver conf
resolver 8.8.8.8 8.8.4.4 valid=1200s;
resolver_timeout 5s;



    location ~* \.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso)$ {
        # gzip_static off;
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        access_log off;
        expires 30d;
        break;
    }

    location ~* \.(js)$ {
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        access_log off;
        expires 30d;
        break;
    }

    location ~* \.(css)$ {
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        access_log off;
        expires 30d;
        break;
    }

    location ~* \.(html|htm|txt)$ {
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        access_log off;
        expires 1d;
        break;
    }

    location ~* \.(eot|svg|ttf|woff|woff2)$ {
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        access_log off;
        expires 30d;
        break;
    }   




    location ^~ /de/forums/ {
        alias /var/www/domain.com/forum-de/;
        #also tried root
        index index.php index.html index.htm;
        try_files $uri $uri/ /de/forums/index.php?$uri&$args;
          #also tried just /index.php?$uri&$args;


    }

location ~  ^/de/forums/(.+\.php)$ { 
    alias var/www/domain.com/forum-de/; 
     #also tried root    
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    include fastcgi.conf;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $request_filename;
    #also tried using the full path here
}   


#cloudflare stuff - cut out for shortness sake
set_real_ip_from 103.21.244.0/22;
#many more here

# use any of the following two
real_ip_header CF-Connecting-IP;
#real_ip_header X-Forwarded-For;



    location ~ [^/]\.php(/|$)  {
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        include fastcgi.conf;
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;

        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 512k;
        fastcgi_buffers 512 16k;
        fastcgi_busy_buffers_size 1m;
        fastcgi_temp_file_write_size 4m;
        fastcgi_max_temp_file_size 4m;
        fastcgi_intercept_errors off;


}

}

.

Я пробовал:

  • Использование местоположения php в качестве дополнительного местоположения в / de / forum /
  • Использование root вместо псевдонима (что не так, но я уже отчаялся)
  • Not using fastcgi .conf ссылка
  • Использование $ request_filename или /var/www/domain.com/html/forum-de/$fastcgi_script_name также / var / www / domain.
    • удаление блока / php, по-прежнему не использовалось конкретное местоположение / de / forum /

Единственное, что работало, это создание реальной папки, например /var/www/domain.com/html /de/forums/index.php. Но затем я получаю 404 с помощью wordpress, если я хочу получить доступ к / de / и всем страницам там из-за try_files. Я, вероятно, мог бы работать с if, но, насколько я читал, это не рекомендуется.

Также я могу получить доступ к файлам с помощью блога местоположения (например, jpgs) - поэтому блок местоположения работает, но не php.

Сообщение об ошибке: Файл не найден. Таким образом, phps форума отправляется компилятору php, но есть - я считаю - несоответствие адреса общему корню и новому корню местоположения. Я даже не мог получить доступ к файлу phpinfo.

Пожалуйста, помогите!

Дополнительная литература: (иначе, я нашел здесь полезный материал, но не решил свою проблему)

Как большинство из них предложили, fastcgi_param SCRIPT_FILENAME $ request_filename; должен исправить мою проблему. НО ... nginx просто не использует мое местоположение php с правильно установленным SCRIPT_FILENAME - он продолжает использовать «основное» местоположение php /

1
задан 28 February 2019 в 20:54
1 ответ

Похоже, это просто комбинация неправильных значений корневого и местоположения .

  1. измените это:

     местоположение ^ ~ / de /  форумы / {
      псевдоним /var/www/domain.com/forum-de/;
      # также пробовал root
      index index.php index.html index.htm;
      try_files $ uri $ uri / /de/forums/index.php?$uri&$args;
      # также пробовал просто /index.php?$uri&$args;
    
    
     }
     

    на это:

     location / de / forum / {
      root /var/www/domain.com/forum-de/;
      index index.php index.html index.htm;
      try_files $ uri $ uri / /de/forum/index.php?$args;
     }
     
  2. и измените это:

     location ~ ^ / de / forum / (. + \. Php) $ {
      псевдоним var / www / domain.com / forum-de /;
      # также пробовал root
      fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;
      включить fastcgi.conf;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $ request_filename;
      # также пробовал использовать здесь полный путь
     }
     

    на это:

     location ~ ^ / de / forum / (. + \. Php) $ {
      fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;
      включить fastcgi.conf;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
      fastcgi_param PATH_INFO $ fastcgi_path_info;
      fastcgi_param HTTPS включен;
     }
     
  3. Если вышеупомянутое решение работает для / de / forum / duplicate и адаптируется к / en / forum /.

Дополнительная подсказка:

Если есть еще sever конкретная конфигурация, которая должна работать по-разному для каждого приложения, подумайте о создании решения, в котором форум находится за обратным прокси-сервером, чтобы он мог иметь свой собственный файл vhost.

Логика этого решения заключалась бы в создании отдельного файла vhost для форума, прослушивая 127.0 .0.1: 8001 (например), а затем в исходном файле vhost добавьте proxy_pass для местоположения / de / forum в http://127.0.0.1:8001 .

Таким образом, вы можете получить отдельная конфигурация vhost для форума.

1
ответ дан 3 December 2019 в 23:20

Теги

Похожие вопросы