Webasyst + Nginx + Plesk Есть решение

Сограждане! Захотелось попробовать поднять связку Webasyst + Nginx + Plesk. Сервер поднят, Plesk установлен, тестовая установка (копия боевой)  Webasyst развернута. Но открывается только первая страница. Переход по любой ссылке отдает 404. В логах при этом записи вида

14277#0: *36 "/var/.../httpdocs/license/index.html" is not found (2: No such file or directory)

где /license/ - это собственно ссылка.  Как видно, какого-то рожна подставляется index.html. 

В интерфейсе Plesk в разделе Дополнительные директивы nginx добавлен штатный конфиг (см. ниже)

В /etc/nginx/fastcgi_params необходимые значения добавлены.

Собственно вопрос: в чем я ошибся и как победить?

Спасибо.

try_files $uri $uri/ /index.php?$query_string;

# for install only
location /install.php {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
}

location /api.php {
    fastcgi_split_path_info  ^(.+\.php)(.*)$;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
}

location ~ /(oauth.php|link.php|payments.php) {
    try_files $uri $uri/ /index.php?$query_string;
}

location ^~ /wa-data/protected/ {
    internal;
}

location ~ /wa-content {
    allow all;
}

location ^~ /(wa-apps|wa-plugins|wa-system|wa-widgets)/.*/(lib|locale|templates)/ {
    deny all;
}

location ~* ^/wa-(cache|config|installer|log|system)/ {
    return 403;
}

location ~* ^/wa-data/public/contacts/photos/[0-9]+/ {
    root /var/www/vhosts/xxx/httpdocs;
    access_log off;
    expires  30d;
    error_page   404  =  @contacts_thumb;
}

location @contacts_thumb {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_param  SCRIPT_NAME  /wa-data/public/contacts/photos/thumb.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/wa-data/public/contacts/photos/thumb.php;
}

# photos app
location ~* ^/wa-data/public/photos/[0-9]+/ {
    access_log   off;
    expires      30d;
    error_page   404  =  @photos_thumb;
}

location @photos_thumb {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_param  SCRIPT_NAME  /wa-data/public/photos/thumb.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/wa-data/public/photos/thumb.php;
}
# end photos app

# shop app
location ~* ^/wa-data/public/shop/products/[0-9]+/ {
    access_log   off;
    expires      30d;
    error_page   404  =  @shop_thumb;
}
location @shop_thumb {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_param  SCRIPT_NAME  /wa-data/public/shop/products/thumb.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/wa-data/public/shop/products/thumb.php;
}

location ~* ^/wa-data/public/shop/promos/[0-9]+ {
    access_log   off;
    expires      30d;
    error_page   404  =  @shop_promo;
}
location @shop_promo {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_param  SCRIPT_NAME  /wa-data/public/shop/promos/thumb.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/wa-data/public/shop/promos/thumb.php;
}
# end shop app

# mailer app
location ~* ^/wa-data/public/mailer/files/[0-9]+/ {
    access_log   off;
    error_page   404  =  @mailer_file;
}
location @mailer_file {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_param  SCRIPT_NAME  /wa-data/public/mailer/files/file.php;
    fastcgi_param  SCRIPT_FILENAME $document_root/wa-data/public/mailer/files/file.php;
}
# end mailer app

location ~* ^.+\.(jpg|jpeg|gif|png|js|css)$ {
    access_log   off;
    expires      30d;
}

1 ответ

  • 2
    Максим Webasyst 29 апреля 2020 10:26 # Решение

    Похоже, что вы добавляете эти директивы как дополнительные, но они включаются в основой конфиг, где выше или ниже будет что-то вроде дефолтного 

    location / {
      location ~ [^/]\.ph(p\d*|tml)$ {
       try_files /does_not_exists @php;
      }
     }
    

    или похожего на это ненужное значение, что срабатывает раньше остальных. 

    • +1

      Максим, спасибо за ответ.

      Все верно, в соответствии с логикой данной панельки это добавляется в дополнительные директивы. Вот основной конфиг для создаваемых хостов (см.ниже). include в конце каждого блока server - это собственно подключение дополнительных директив. Закомментированная часть в нем - уже моих рук дело, после чего был рестартован nginx, но делу это не помогло. Все осталось так же: 404 везде кроме первой. Кроме этого, в конфиге от WA был заменен fastcgi_pass на unix socket. 

      И да... Если это имеет какое-то значение, то не работает только в варианте с "чистым" nginx. Если использовать apache, или nginx использовать для проксирования запросов к apache, то все работает нормально. Но если снять галку проксирования - 404.

      #ATTENTION!
      #
      #DO NOT MODIFY THIS FILE BECAUSE IT WAS GENERATED AUTOMATICALLY,
      #SO ALL YOUR CHANGES WILL BE LOST THE NEXT TIME THE FILE IS GENERATED.
      server {
              listen ***.***.***.***:443 ssl http2;
      
              server_name xxxx.ru;
              server_name www.xxxx.ru;
              server_name ipv4.xxxx.ru;
      
              ssl_certificate             /opt/psa/var/certificates/scfKScDXS;
              ssl_certificate_key         /opt/psa/var/certificates/scfKScDXS;
      
              client_max_body_size 128m;
      
              root "/var/www/vhosts/xxxx.ru/xxxx.ru";
              access_log "/var/www/vhosts/system/xxxx.ru/logs/proxy_access_ssl_log";
              error_log "/var/www/vhosts/system/xxxx.ru/logs/proxy_error_log";
      
              if ($host ~* ^www\.xxxx\.ru$) {
                      rewrite ^(.*)$ https://xxxx.ru$1 permanent;
              }
      
              #extension letsencrypt begin
              location ^~ /.well-known/acme-challenge/ {
                      root /var/www/vhosts/default/htdocs;
      
                      types { }
                      default_type text/plain;
      
                      satisfy any;
                      auth_basic off;
                      allow all;
      
                      location ~ ^/\.well-known/acme-challenge.*/\. {
                              deny all;
                      }
              }
              #extension letsencrypt end
              #extension sslit begin
              #extension sslit end
      
              location ~ /\.ht {
                      deny all;
              }
      
              location @fallback {
                      return 404;
              }
      
              location ~ ^/(.*\.(ac3|avi|bmp|bz2|css|cue|dat|doc|docx|dts|eot|exe|flv|gif|gz|htm|html|ico|img|iso|jpeg|jpg|js|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|png|ppt|pptx|qt|rar|rm|svg|swf|tar|tgz|ttf|txt|wav|woff|$
                      try_files $uri @fallback;
              }
              location ~ ^/~(.+?)(/.*?\.php)(/.*)?$ {
                      alias /var/www/vhosts/xxxx.ru/web_users/$1/$2;
                      fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
                      fastcgi_param PATH_INFO $fastcgi_path_info;
                      fastcgi_pass "unix:///var/www/vhosts/system/xxxx.ru/php-fpm.sock";
                      include /etc/nginx/fastcgi.conf;
              }
      
      #       location ~ \.php(/.*)?$ {
      #               fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
      #               fastcgi_param PATH_INFO $fastcgi_path_info;
      #               fastcgi_pass "unix:///var/www/vhosts/system/xxxx.ru/php-fpm.sock";
      #               include /etc/nginx/fastcgi.conf;
      #       }
      
              location ~ /$ {
                      index "index.html" "index.cgi" "index.pl" "index.php" "index.xhtml" "index.htm" "index.shtml";
              }
      
              add_header X-Powered-By PleskLin;
      
              include "/var/www/vhosts/system/xxxx.ru/conf/vhost_nginx.conf";
      }
      
      server {
              listen ***.***.***.***:80;
      
              server_name xxxx.ru;
              server_name www.xxxx.ru;
              server_name ipv4.xxxx.ru;
      
              client_max_body_size 128m;
      
              if ($host ~* ^www\.xxxx\.ru$) {
                      rewrite ^(.*)$ https://xxxx.ru$1 permanent;
              }
      
              location / {
                      return 301 https://$host$request_uri;
              }
      }
      

      • +1
        Максим Максим Webasyst 29 апреля 2020 12:41 #

        Я бы посоветовал попробовать в первую очередь оставить просто вот так и проверить работу в этом случае:

        server {
                listen ***.***.***.***:443 ssl http2;
        
                server_name xxxx.ru;
                server_name www.xxxx.ru;
                server_name ipv4.xxxx.ru;
        
                ssl_certificate             /opt/psa/var/certificates/scfKScDXS;
                ssl_certificate_key         /opt/psa/var/certificates/scfKScDXS;
        
                client_max_body_size 128m;
        
                root "/var/www/vhosts/xxxx.ru/xxxx.ru";
                access_log "/var/www/vhosts/system/xxxx.ru/logs/proxy_access_ssl_log";
                error_log "/var/www/vhosts/system/xxxx.ru/logs/proxy_error_log";
        
                if ($host ~* ^www\.xxxx\.ru$) {
                        rewrite ^(.*)$ https://xxxx.ru$1 permanent;
                }
        
                #extension letsencrypt begin
                location ^~ /.well-known/acme-challenge/ {
                        root /var/www/vhosts/default/htdocs;
        
                        types { }
                        default_type text/plain;
        
                        satisfy any;
                        auth_basic off;
                        allow all;
        
                        location ~ ^/\.well-known/acme-challenge.*/\. {
                                deny all;
                        }
                }
                #extension letsencrypt end
                #extension sslit begin
                #extension sslit end
        
                add_header X-Powered-By PleskLin;
        
                include "/var/www/vhosts/system/xxxx.ru/conf/vhost_nginx.conf";
        }

        • +1

          Максим, спасибо большое!

          Если вратце, то чтобы запустить эту всю эту петрушку в в режиме чистого nginx пришлось сделать следующее:

          1. Было выявлено что благополучному старту мешает штатная директива

          location ~ /$ {
                          index "index.html" "index.cgi" "index.pl" "index.php" "index.xhtml" "index.htm" "index.shtml";
          }

          Но проблема в том, что она автоматом добавляется при внесении любых изменений в настройки Nginx|Apache.  Поэтому...

          2. В Plesk все штатные шаблоны конфигов лежат в 

          /usr/local/psa/admin/conf/templates/default/

          Но предусмотрена возможность замены штатных конфигов. Для этого надо создать папку

          /usr/local/psa/admin/conf/templates/custom

          и соблюдая последующую иерархию каталогов поместить туда измененные конфиги.

          Если говорить про данный конкретный случай, то потребовалось создать каталог

          /usr/local/psa/admin/conf/templates/custom/domain/

          и скопировать туда файл nginxDomainVirtualHost.php из каталога

          /usr/local/psa/admin/conf/templates/default/domain

          а затем внести в него правки, удалив следующие строки

          <?php if ($VAR->domain->physicalHosting->directoryIndex && !$VAR->domain->physicalHosting->proxySettings['nginxProxyMode']): ?>
              location ~ /$ {
                  index <?=$VAR->quote($VAR->domain->physicalHosting->directoryIndex)?>;
              }
          <?php endif ?>

          3. В Plesk в настройках Nginx в поле дополнительные директивы добавить необходимые элементы из штатного конфига от WA.

          4. Вуаля! Все работает "на ура".

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите