Jump to content
  • entries
    4
  • comments
    68
  • views
    3,107

Настройка NGINX в режиме PHP-FPM для работы OpenCart


mpn2005

8,964 views

Веб сервер nginx позволяет работать в разных режимах, как с использованием интерпретатора php, так и без.
Для работы OpenCart лучше выбирать оптимальный режим работы php-fpm. Многих данный режим пугает тем, что в данном случае
файл htaccess напрочь игнорируется и все необходимые настройки нужно вносить в конфиг nginx.
Но в этом нет ничего сверх сложного. Конфигурационный файл - это обычный текстовый файл на сервере, который 
подчиняется определённым правилам. И по данному поводу можно найти много готовых описаний и инструкций.


Данная статья не претендует на уникальность, а просто представляет краткую выжимку по настройкам, учитывая особенности 
работы с движком OpenCart и сборками на его основе.

 

Для удобства будут приводится примеры настройки с использованием панели ISPmanager.
Основные настройки будут касаться секции location, и зависимость описания от используемой панели будет минимальной.

 

Для начала переведём nginx в режим работы php-fpm. Для этого в панели сделаем следующие настройки разделе WWW-домены для 
нужного сайта:

1. Выбираем в списке нужный сайт, если их несколько, и жмём кнопку "Изменить".
2. Находим настройки PHP и настраиваем следующим образом:
diy003_001.png

Обратите внимание, что версия php у вас может отличаться. При необходимости, можно эту версию изменить на нужную, но этот вопрос выходит за рамки данной статьи.

После сохранения настроек будет работать почти всё, что и раньше. Если в настройках OpenCart отключены ЧПУ ссылки, то всё будет работать, как
и работало до переключения режима работы.
Теперь можно приступать к непосредственной настройке самого конфигурационного файла nginx для текущего сайта.
Для этого в списке www доменов находим нужный нам и нажимаем справа на иконку с тремя точками. В выпадающем меню выбираем
пункт "Конфиг":

Спойлер

diy003_002.png

 

Вот примерный конфигурационный файл, который будет создан у вас по умолчанию:

Спойлер
server {
    server_name test.ru www.test.ru;
    charset off;
    index index.php index.html;
    disable_symlinks if_not_owner from=$root_path;
    include /etc/nginx/vhosts-includes/*.conf;
    include /etc/nginx/vhosts-resources/test.ru/*.conf;
    access_log /var/www/httpd-logs/test.ru.access.log;
    error_log /var/www/httpd-logs/test.ru.error.log notice;
    ssi on;
    set $root_path /var/www/myoc/data/www/test.ru;
    root $root_path;
    location / {
        location ~ [^/]\.ph(p\d*|tml)$ {
            try_files /does_not_exists @php;
        }
        location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
            expires 365d;
        }
    }
    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@test.ru";
        fastcgi_pass unix:/var/www/php-fpm/myoc.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
    listen 8.8.8.8:80;
}
server {
    server_name test.ru www.test.ru;
    ssl_certificate "/var/www/httpd-cert/myoc/test.ru.crt";
    ssl_certificate_key "/var/www/httpd-cert/myoc/test.ru.key";
    ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    add_header Strict-Transport-Security "max-age=31536000;";
    ssl_dhparam /etc/ssl/certs/dhparam4096.pem;
    charset off;
    index index.php index.html;
    disable_symlinks if_not_owner from=$root_path;
    include /etc/nginx/vhosts-includes/*.conf;
    include /etc/nginx/vhosts-resources/test.ru/*.conf;
    access_log /var/www/httpd-logs/test.ru.access.log;
    error_log /var/www/httpd-logs/test.ru.error.log notice;
    ssi on;
    set $root_path /var/www/myoc/data/www/test.ru;
    root $root_path;
    listen 8.8.8.8:443 ssl http2;
    location / {
        location ~ [^/]\.ph(p\d*|tml)$ {
            try_files /does_not_exists @php;
        }
        location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
            expires 365d;
        }
    }
    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@test.ru";
        fastcgi_pass unix:/var/www/php-fpm/myoc.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
}


В конфигурации у вас будет две секции server, если у вас включено защищённое соединение SSL (и оно должно быть обязательно включено).
Если у вас включен принудительный редирект с http на https, то можно редактировать только секцию server для https.
Определить её легко: в самом начале есть параметр с указанием сертификата ssl_certificate. Также в этой секции указан параметр listen с указанием порта 443:
 

listen 8.8.8.8:443 ssl

Но лучше делать настройки сразу в двух секциях server, чтобы не допустить механической ошибки.
На данный момент нас интересует вот эта часть конфигурационного файла:

location / {
    location ~ [^/]\.ph(p\d*|tml)$ {
        try_files /does_not_exists @php;
    }
    location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
        expires 365d;
    }
}


Все дальнейшие изменения мы будем вносить внутри этой секции "location /".

В первую очередь нам не хватает вот такой директивы:

if (!-e $request_filename){
    rewrite ^/(.+)$ /index.php?_route_=$1 last;
}


Данное условие очень простое: если сервер не может найти файл по указанному в запросе пути, то запрос будет переписан на вызов index.php, а в параметр _route_ будет передан запрашиваемый путь. Именно это и позволит корректно отрабатывать всем ЧПУ ссылкам движка.
Это правило является аналогом записи в файле htaccess:

RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]


На этом можно было бы и закончить, но стоит внести ещё некоторые изменения для улучшения безопасности.

Рассмотрим более внимательно вот эту секцию:

location ~ [^/]\.ph(p\d*|tml)$ {


Тут отбираются все все подходящие динамические файлы с типами .php (в том числе с числами в окончании) и .phtml
Но у движка OpenCart в штатном режиме есть всего две точки входа для вызова php файлов через web окружение - это index.php и admin/index.php
Есть ещё install/index.php, но она используется только при установке движка.
Учитывая данные обстоятельства, логично запретить прямое выполнение всех остальных php скриптов через web окружение, кроме указанных администратором.
Сделать это можно следующим образом:

location ~ ^/(index|admin/index|install/index)\.php {
    try_files /does_not_exists @php;
}


В скобках через разделитель "|" указываем все php скрипты, которые можно выполнять. После завершения установки можно будет сократить это список 
до такого: (index|admin/index)

ВНИМАНИЕ!!! Очень важный момент! После того, как убрали вызов интерпретатора php для всех файлов, кроме указанных, при попытке запроса любого другого php файла он будет отдан как обычный текстовый файл.
И при запросе https://test.ru/config.php любой желающий сможет получить содержимое вашего конфигурационного файла, где содержится доступ к БД.
Поэтому нам обязательно нужно запретить доступ для всех остальных файлов с расширением php. Ну и заодно к другим типам файлов, которые не
стоит отдавать по запросу извне. Сделать это можно простым правилом:

location ~* \.(php|log|tpl|txt|twig|xml|ini)$ {
    deny all;
}


В скобках через разделитель "|" указываем все расширения файлов, которые мы хотим запретить.
Но у нас есть несколько важных файлов, которые пока попали под запрет, например: robots.txt и sitemap.xml. Этот вопрос мы решим чуть позже.
А сейчас ещё немного запретов. Запретим открывать файлы, которые начинаются с точки, а также все файлы в папке system:

location ~ /\. {
    deny all;
}
location ~ ^/system/ {
    deny all;
}


Этих запретов вполне достаточно, чтобы сделать невозможным выполнение каких-либо несанкционированных скриптов. А также просмотр логов, текстовых и xml файлов.

 

Теперь нам необходимо открыть доступ к файлу robots.txt, для этого нам нужно такое правило:

location = /robots.txt {
    allow all;
}

 

Также пропишем разрешение на открытие sitemap.xml и rewrite правило:

location = /sitemap.xml {
    allow all;
    rewrite ^/(.*)$ /index.php?route=extension/feed/google_sitemap last;
}


Если вы используете сторонний модуль сайтмапа, то нужно указать соответствующий route для данного модуля.
Если у вас несколько файлов sitemap или вы используете фиды для выгрузки данных, то просто пропишите для них права по аналогии.

В итоге мы должны получить вот такую секцию location:

Спойлер
location / {
    if (!-e $request_filename){
        rewrite ^/(.+)$ /index.php?_route_=$1 last;
    }

    location ~ ^/(index|admin/index)\.php {
        try_files /does_not_exists @php;
    }

    location = /sitemap.xml {
        allow all;
        rewrite ^/(.*)$ /index.php?route=extension/feed/google_sitemap last;
    }
    location = /robots.txt {
        allow all;
    }

    location ~ /\. {
        deny all;
    }
    location ~ ^/system/ {
        deny all;
    }
    location ~* \.(php|log|tpl|txt|twig|xml|ini)$ {
        deny all;
    }

    location ~* ^.+\.(jpg|jpeg|gif|png|svg|webp|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
        expires 365d;
    }
}


Этих настроек достаточно для корректной работы движка OpenCart. И при этом данная конфигурация является безопасной с точки зрения выполнения 
несанкционированных скриптов php через web окружение.

После всех настроек обязательно проверьте правильность работы, сделав запросы по указанному чек-листу (test.ru замените на адрес вашего сайта):

https://test.ru/config.php
https://test.ru/admin/config.php
https://test.ru/admin/1.php
https://test.ru/admin/1.txt
https://test.ru/admin/1.log
https://test.ru/admin/1.xml
https://test.ru/system/modification.xml


Для всех этих ссылок вы должны получить ошибку "403 Forbidden", вне зависимости от того, есть файл по указанному пути на сервере, или нет.

Также проверяем белый список:

https://test.ru/robots.txt
https://test.ru/sitemap.xml


Эти файлы не должны вызывать ошибок и вы должны корректно получать их содержимое.
Дополнительно стоит проверить все ваши дополнительные сайтмапы или фиды, если вы их добавляли.

 

Ещё раз повторюсь, что данная настройка является базовой, с небольшими правилами для улучшения безопасности.
Но даже уже при такой настройке вы в среднем получите выигрыш 100-200ms для параметра TTFB, по сравнению с остальными режимами работы.

49 Comments


Recommended Comments



Не хватает очень важной настройки.

Да и в принципе не раскрыта тема настройки конфига для самого php-fpm, а его настройка по-умолчанию оставляет желать лучшего.

Как известно, режим nginx+ php-fpm чреват "сюрпризами" в виде утечки памяти. Это в конце концов приводит к тому, что спустя несколько дней память будет использована под 100%, а сервер, соответственно, ляжет.

 

Поиск через поисковики показывает, что проблема эта глобальная и давняя. Т.е. это не единичные случаи, это повальная проблема. Разрастаются в потреблении памяти дочерние процессы php-fpm.

 

Проявляется не на всех версиях php, в частности на 5.6 я этой проблемы не наблюдал, но на 7.* - это будет почти всегда.

 

поэтому к конфигурации  самого php-fpm нужно подходить не менее тщательно, чем к конфигурации nginx.

 

Я неоднократно писал об этой проблеме на разных форумах. И неоднократно же ко мне обращались за решением данной проблемы.

 

pm.max_requests = 1500

 

Слишком малое значение не стоит устанавливать. Это значение зависит от доступного объема памяти сервера. Конечное значение подбирается опытным путем.

Это максимальное количество запросов max_requests до перезапуска процессов FPM.

 

На остальные параметры также обратите внимание. На скриншоте файл конфигурации, редактируемый через панель управления aapanel, но сама панель управления не имеет значения, т.к. принципы едины.

 

sitecreator_ru_ingycEOcfV.png

Edited by sitecreator
Link to comment
В 06.05.2022 в 19:35, sitecreator сказал:

Да и в принципе не раскрыта тема настройки конфига для самого php-fpm, а его настройка по-умолчанию оставляет желать лучшего.

Да. Тут даже и не весь конфиг описан по настройки самого nginx.

Цель была сделать упор именно на особенность настройки для OpenCart.

 

В 06.05.2022 в 19:35, sitecreator сказал:

Как известно, режим nginx+ php-fpm чреват "сюрпризами" в виде утечки памяти. Это в конце концов приводит к тому, что спустя несколько дней память будет использована под 100%, а сервер, соответственно, ляжет.

Кстати уже не на первом проекте замечаю, что такая беда уже имеет не такой повальный характер как раньше. Прогресс всё же не стоит на месте.

И уже не везде встречается пила по потреблению памяти. В последнее время сервера попадались Debian и Ubuntu (для справки).

 

В 06.05.2022 в 19:35, sitecreator сказал:

Слишком малое значение не стоит устанавливать. Это значение зависит от доступного объема памяти сервера. Конечное значение подбирается опытным путем.

Настройке параметров процессов можно отдельную статью посвятить.

Но там уже не всё так просто, т.к. зависит от ресурсов сервера. Да и от посещаемости тоже зависит.

Link to comment
В 06.05.2022 в 21:26, mpn2005 сказал:

Настройке параметров процессов можно отдельную статью посвятить.

Но там уже не всё так просто, т.к. зависит от ресурсов сервера. Да и от посещаемости тоже зависит.

 

разумеется, что все имеет значение.

минимально, что стоит сделать - это подстраховаться от утечек памяти.

т.е. это нужно прописывать обязательно.

Даже можно немножко пожертвовать производительностью, но увеличить стабильность.

 

Просто для тех, кто решил перейти на php-fpm, утечка памяти - это самая распространенная неожиданность. Крайне неприятная неожиданность.

И это не зависит от самого веб-сервера, это может быть Апачи или Nginx, в данном случае не имеет значения, т.к. корень проблемы кроется именно в процессах php-fpm, которые в принципе могут быть вообще и без веб-сервера.

 

Тонкую настройку можно сделать после, но подстраховку от утечек нужно делать сразу. Это чтобы не перезапускать весь сервер пару раз в неделю после очередного зависания.

 

 

Link to comment

 

В 06.05.2022 в 19:35, sitecreator сказал:

Я неоднократно писал об этой проблеме на разных форумах. И неоднократно же ко мне обращались за решением данной проблемы.

 

pm.max_requests = 1500

 

Слишком малое значение не стоит устанавливать. Это значение зависит от доступного объема памяти сервера. Конечное значение подбирается опытным путем.

Это максимальное количество запросов max_requests до перезапуска процессов FPM.


Все правильно написано, чуть дополню...

Универсальных настроек конечно не существует, каждый сервер настраивается под определенный проект. 

request_terminate_timeout - переменная отвечающая за максимальное время выполнения процесса прежде чем он будет уничтожен. 
pm.max_requests - в данной переменной выставляется максимальное количество запросов, после чего произойдет сброс процесса  и память не будет переполняться. Маленькое значение плохо, так как приведет к частым перезапускам процессов и следовательно к уменьшению производительности.

Узнать потребление памяти Active и Inactive можно командами по SHH:
free -h (в гигабайтах)
free -m (в мегабайтах)
или cat /proc/meminfo
---------------------------
Очистка cashe памяти, три варианта без прерывания каких-либо процессов или служб. 
1. Clear PageCache only.
sync; echo 1 > /proc/sys/vm/drop_caches (очистка кеш страниц PageCache) 
2. Clear dentries and inodes.
sync; echo 2 > /proc/sys/vm/drop_caches

3.Clear PageCache, dentries and inodes.(очистка сразу всего, не рекомендуется сразу)
sync; echo 3 > /proc/sys/vm/drop_caches
---------------------------
Что потребляет больше всего оперативной памяти? Команды:
top
Сортировка по объёму памяти:
shift+M
Сортировка по времени
shift+T
Cортировка в одну или в другую сторону (использовать, чтобы больший параметр был вверху)
shift+R
Клавиша «Q» — выйти из команды Top.

Link to comment

Спасибо за статью. Очень хорошая статья, у меня все получилось настроить но при такой настройке не работают ссылки /ru/index.php?route=common/currency/currency выдает ошибку 403

У меня на сайте 2 языка и добавлена приставка ru и en для разных языков.

Если убираю приставку то все работает. Помогите пожалуйста

Link to comment
В 15.12.2022 в 15:11, UovoU сказал:

Спасибо за статью. Очень хорошая статья, у меня все получилось настроить но при такой настройке не работают ссылки /ru/index.php?route=common/currency/currency выдает ошибку 403

У меня на сайте 2 языка и добавлена приставка ru и en для разных языков.

Если убираю приставку то все работает. Помогите пожалуйста

Догадаетесь куда вставлять?

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


Вставлять в секцию 
server { 
Конфигурационный файл nginx
Должны после этого открываться.

Link to comment

Я пробовал вставлять строчку:

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

 

Вместо нее у меня код как описано в статье выше:

location ~ ^/(index|admin/index|install/index)\.php {try_files /does_not_exists @php;}

 

Моя проблема в том что у меня на сайте 2 языка и добавлена приставка ru и en для разных языков.

Из-за этого такие ссылки не открываются и выдают ошибку 404 если с вашем кодом или 403 если с кодом как в статье:

domain.ru/ru/index.php?route=common/currency/currency

domain.ru/en/index.php?route=common/currency/currency

 

Если убираю приставку ru и en то все работает.

domain.ru/index.php?route=common/currency/currency - такая ссылка открывается.

 

Еще пример:

domain.ru/ru/index.php?route=information/information&information_id=4 - не открывается, выдает ошибку 404

Если убираю приставку ru то domain.ru/index.php?route=information/information&information_id=4 открывается

 

Вот полный код:

server {
	server_name domain.ru www.domain.ru;
	charset off;
	index index.php index.html;
	disable_symlinks if_not_owner from=$root_path;
	include /etc/nginx/vhosts-includes/*.conf;
	include /etc/nginx/vhosts-resources/domain.ru/*.conf;
	access_log /var/www/httpd-logs/domain.ru.access.log;
	error_log /var/www/httpd-logs/domain.ru.error.log notice;
	set $root_path /var/www/user/data/www/domain.ru;
	root $root_path;	
	
	location / {
	
	if ($http_host ~ "^domain.ru"){rewrite ^(.*)$ https://www.domain.ru$1 redirect;}

	if (!-e $request_filename){rewrite ^/(.+)$ /index.php?_route_=$1 last;}

	location ~ ^/(index|admin/index|install/index)\.php {try_files /does_not_exists @php;}

	location ~* \.(php|log|tpl|txt|twig|xml|ini)$ {deny all;}

	location ~ /\. {deny all;}
	location ~ ^/system/ {deny all;}
	location = /robots.txt {allow all;}
	location = /sitemap.xml {allow all; rewrite ^/(.*)$ /index.php?route=extension/feed/google_sitemap last;}

	location ~* ^.+\.(jpg|jpeg|gif|png|svg|ico|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {expires 365d;}
	if ($query_string ~ "^(.*)&?page=1$"){rewrite ^/(.*)/?$ /$1?%1%2 redirect;}

	}
	
	location @php {
		fastcgi_index index.php;
		fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f admin@domain.ru";
		fastcgi_pass unix:/var/www/php-fpm/3.sock;
		fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
		try_files $uri =404;
		include fastcgi_params;
	}
	return 301 https://$host:443$request_uri;
	listen 185.197.160.88:80;
}
server {
	server_name domain.ru www.domain.ru;
	ssl_certificate "/var/www/httpd-cert/user/domain.ru_le1.crtca";
	ssl_certificate_key "/var/www/httpd-cert/user/domain.ru_le1.key";
	ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4;
	ssl_prefer_server_ciphers on;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
	ssl_dhparam /etc/ssl/certs/dhparam4096.pem;
	charset off;
	index index.php index.html;
	disable_symlinks if_not_owner from=$root_path;
	include /etc/nginx/vhosts-includes/*.conf;
	include /etc/nginx/vhosts-resources/domain.ru/*.conf;
	access_log /var/www/httpd-logs/domain.ru.access.log;
	error_log /var/www/httpd-logs/domain.ru.error.log notice;
	set $root_path /var/www/user/data/www/domain.ru;
	root $root_path;
	
	location / {
	
	if ($http_host ~ "^domain.ru"){rewrite ^(.*)$ https://www.domain.ru$1 redirect;}

	if (!-e $request_filename){rewrite ^/(.+)$ /index.php?_route_=$1 last;}

	location ~ ^/(index|admin/index|install/index)\.php {try_files /does_not_exists @php;}

	location ~* \.(php|log|tpl|txt|twig|xml|ini)$ {deny all;}

	location ~ /\. {deny all;}
	location ~ ^/system/ {deny all;}
	location = /robots.txt {allow all;}
	location = /sitemap.xml {allow all; rewrite ^/(.*)$ /index.php?route=extension/feed/google_sitemap last;}

	location ~* ^.+\.(jpg|jpeg|gif|png|svg|ico|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {expires 365d;}
	if ($query_string ~ "^(.*)&?page=1$"){rewrite ^/(.*)/?$ /$1?%1%2 redirect;}

	}
	
	location @php {
		fastcgi_index index.php;
		fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f admin@domain.ru";
		fastcgi_pass unix:/var/www/php-fpm/3.sock;
		fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
		try_files $uri =404;
		include fastcgi_params;
	}
	listen 185.197.160.88:443 ssl;
}

 

Link to comment

Убрал в своем конфиге и все заработало

 

	location / {
	
................

	}

 

Получается в статье ошибка, не нужно все параметры ставить в location / {.........}

Все параметры должны быть в server {.........}

Link to comment

Но теперь фаилы которые есть на сервере, выдают ошибку 403

https://test.ru/config.php
https://test.ru/admin/config.php

https://test.ru/system/modification.xml

 

А фаилы которых нет выдают в OpenCart "Запрашиваемая страница не найдена!"
https://test.ru/admin/1.php
https://test.ru/admin/1.txt
https://test.ru/admin/1.log
https://test.ru/admin/1.xml

В статье написано что все страницы должны выдавать ошибку "403 Forbidden", вне зависимости от того, есть файл по указанному пути на сервере, или нет.

Edited by UovoU
Link to comment
14 часов назад, UovoU сказал:

Моя проблема в том что у меня на сайте 2 языка и добавлена приставка ru и en для разных языков.

Из-за этого такие ссылки не открываются и выдают ошибку 404 если с вашем кодом или 403 если с кодом как в статье:

domain.ru/ru/index.php?route=common/currency/currency

domain.ru/en/index.php?route=common/currency/currency

в локейшн обработки php добавьте одну строчку. и всё.

 

	location @php {
		if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?_route_=$1 last; }
		...
	}

 

 

Link to comment
2 часа назад, 100napb сказал:

в локейшн обработки php добавьте одну строчку. и всё.

 

	location @php {
		if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?_route_=$1 last; }
		...
	}

 

 

 

Все равно не работает

Link to comment
# nginx 1.23.3
# nginx.conf

server {
   
   server_name 1111.com.ru www.1111.com.ru;
   return 301 https://1111.com.ru$request_uri;
   root /home/nginx/domains/1111.com.ru/public;
   include /usr/local/nginx/conf/staticfiles.conf;
 }

server {
  listen 443 ssl http2 reuseport;
  server_name 111.com.ru www.1111.com.ru;

  include /usr/local/nginx/conf/ssl/1111.com.ru/1111.com.ru.crt.key.conf;
  include /usr/local/nginx/conf/ssl_include.conf;

    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers   on;
  
  add_header X-Xss-Protection "1; mode=block" always;
  add_header X-Content-Type-Options "nosniff" always;
  ssl_buffer_size 1369;
  ssl_session_tickets on;
  
  resolver 8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 valid=10m;
  resolver_timeout 10s;
  ssl_stapling on;
  ssl_stapling_verify on;


  access_log /home/nginx/domains/1111.com.ru/log/access.log combined buffer=256k flush=5m;
  error_log /home/nginx/domains/1111.com.ru/log/error.log;

  include /usr/local/nginx/conf/autoprotect/1111.com.ru/autoprotect-1111.com.ru.conf;
  root /home/nginx/domains/1111.com.ru/public;
    include /usr/local/nginx/conf/503include-main.conf;

  location / {
  include /usr/local/nginx/conf/503include-only.conf;

# OPENCART
try_files $uri $uri/ @opencart;

  }

  include /usr/local/nginx/conf/php.conf;
  
  include /usr/local/nginx/conf/pre-staticfiles-local-1111.com.ru.conf;
  include /usr/local/nginx/conf/pre-staticfiles-global.conf;
  include /usr/local/nginx/conf/staticfiles.conf;
  include /usr/local/nginx/conf/drop.conf;
  #include /usr/local/nginx/conf/errorpage.conf;
  include /usr/local/nginx/conf/vts_server.conf;
 include /usr/local/nginx/conf/opencart.conf;

}

#autoprotect.conf

location ~* ^/system/storage/session/ { allow 127.0.0.1; deny all; }
location ~* ^/system/ { allow 127.0.0.1; deny all; }
# opencart.conf

location ~* \/\.ht { 		deny all;	}
location ~* (\.tpl|.twig|\.ini|\.log|(?<!robots)\.txt) { 		deny all; 	}
location ~* \/\.git {		deny all;	}
location ~* \/image.+(\.php) {       		deny all;	}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {		expires max;		log_not_found off;	}
location = /sitemap.xml {		rewrite ^(.*)$ /index.php?route=extension/feed/google_sitemap last;	}
location = /googlebase.xml {	    rewrite ^(.*)$ /index.php?route=extension/feed/google_base last;	}
location @opencart { rewrite ^/(.+)$ /index.php?_route_=$1 last; 	}

 

 

конфиги рабочего сервера

Edited by 555
Link to comment
22 часа назад, UovoU сказал:

Моя проблема в том что у меня на сайте 2 языка и добавлена приставка ru и en для разных языков.

Из-за этого такие ссылки не открываются и выдают ошибку 404 если с вашем кодом или 403 если с кодом как в статье:

domain.ru/ru/index.php?route=common/currency/currency

domain.ru/en/index.php?route=common/currency/currency

Тут проблема не в настройке nginx.
Вперемешку - это уже что-то странное получается. Это должен уже учитывать функционал, который добавляет префиксы.

По сути в рерайт уходит только языковой префикс 'ru', 'en'. А всё остальное идёт в GET параметры.

И вот это должен обработать функционал, который добавляет эти префиксы. 

Тут сервер не виноват.

 

Ну и ссылки по хорошему должны формироваться вот так:

domain.ru/ru/?route=common/currency/currency
domain.ru/en/?route=common/currency/currency

 

У у вас там лишний index.php

domain.ru/ru/index.php?route=common/currency/currency
domain.ru/en/index.php?route=common/currency/currency

Тут в рерайт будет уходить вот такое: ru/index.php и en/index.php
Как там уже с этим будет работать функционал префиксов не совсем понятно.

Link to comment

Ещё как вариант - это не добавлять языковые префиксы к не ЧПУ ссылками.

Загрузили страницу, язык сохранился в сессии.

Все AJAX запросы с не ЧПУ ссылками идут без префикса. А язык уже берётся из активной сессии.

Но это опять вопросы к функционалу этих самых языковых префиксов.

Link to comment

Разработчик модуля говорит что это не верная настройка config nginx.
Если ставлю обработчик PHP CGI 7.3 то все работает так что дело не в модуле.

В том то и дело что мне нужно именно с префиксами.

Link to comment
11 часов назад, UovoU сказал:

Все равно не работает

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

...
    location / {
        try_files $uri $uri/ @opencart;
        location ~ [^/]\.ph(p\d*|tml)$ {
               
if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?_route_=$1 last; }
                try_files /does_not_exists @php;
        }

        ...
    }

    location @opencart {
        rewrite ^/(.+)$ /index.php?_route_=$1 last;
    }


    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@???";
        fastcgi_pass unix:/var/www/php-fpm/1.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
...
Link to comment
В 17.12.2022 в 00:09, 100napb сказал:
   location / {
        try_files $uri $uri/ @opencart;
        location ~ [^/]\.ph(p\d*|tml)$ {
                if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?_route_=$1 last; }
                try_files /does_not_exists @php;
        }
        ...
    }

    location @opencart {
        rewrite ^/(.+)$ /index.php?_route_=$1 last;
    }

 

100napb, попробовал ваш вариант, вроде все работает без ошибок, если найду ошибки то отпишусь в теме. Большое вам спасибо!

Edited by UovoU
Link to comment
    location ~ ^/(index|admin/index)\.php {
        try_files /does_not_exists @php;
    }

Данное правило вызывает у меня ошибку 500 на сервере. Панель управления aaPanel

В логе текст ошибки такой:

[error] 18138#0: *901 could not find named location "@php", client: 192.168.65.1, server: cart.loc, request: "GET / HTTP/1.1", host: "cart.loc"

Если я правило удаляю, то получаю ошибку 403.
 

[error] 20789#0: *20 access forbidden by rule, client: 192.168.65.1, server: cart.loc, request: "GET /index.php HTTP/1.1", host: "cart.loc"

А чтобы сайт заработал, то приходится удалить ещё и правило:
 

    location ~* \.(php|log|tpl|txt|twig|xml|ini)$ {
        deny all;
    }

Но после этого некоторые файлы php открываются как текстовые в браузере, а я хотел бы это исключить.

Edited by zondar
Link to comment
18 часов назад, zondar сказал:

Данное правило вызывает у меня ошибку 500 на сервере. Панель управления aaPanel

В конфиге nginx должно присутствовать правило примерно вот такого вида:

    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@???";
        fastcgi_pass unix:/var/www/php-fpm/1.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }

Оно может отличаться по параметрам в зависимости от настроек окружения.

Именно на него и идёт ссылка "@php"
Если его не будет, то это и приведёт к ошибке.

Link to comment
В 30.01.2023 в 20:37, mpn2005 сказал:

В конфиге nginx должно присутствовать правило примерно вот такого вида:

    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@???";
        fastcgi_pass unix:/var/www/php-fpm/1.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }

Оно может отличаться по параметрам в зависимости от настроек окружения.

Именно на него и идёт ссылка "@php"
Если его не будет, то это и приведёт к ошибке.

 

Если вставить данное правило как есть, то ошибка сохраняется. Ниже содержимое конфига Nginx. Возможно надо изменить пути, только бы знать на какие.

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

stream {
    log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';
  
    access_log /www/wwwlogs/tcp-access.log tcp_format;
    error_log /www/wwwlogs/tcp-error.log;
    include /www/server/panel/vhost/nginx/tcp/*.conf;
}

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

http
    {
#AAPANEL_FASTCGI_CONF_BEGIN
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_path /dev/shm/nginx-cache/wp levels=1:2 keys_zone=WORDPRESS:100m inactive=60m max_size=1g;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
#AAPANEL_FASTCGI_CONF_END

        include       mime.types;
        #include luawaf.conf;

        include proxy.conf;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length 1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 6;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;

server
    {
        listen 888;
        server_name phpmyadmin;
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;
            location ~ /tmp/ {
                return 403;
            }

        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /www/wwwlogs/access.log;
    }
include /www/server/panel/vhost/nginx/*.conf;
}

 

Link to comment
2 часа назад, zondar сказал:

Если вставить данное правило как есть, то ошибка сохраняется.

Данную запись нельзя вставлять как есть. Она очень зависит от настроек окружения.

 

Создайте в панели новый сайт и приведите конфиг в чистом виде, который создаёт панель.

Домен можете указать любой при создании. Например: site.ru

Link to comment
1 час назад, mpn2005 сказал:

Данную запись нельзя вставлять как есть. Она очень зависит от настроек окружения.

 

Создайте в панели новый сайт и приведите конфиг в чистом виде, который создаёт панель.

Домен можете указать любой при создании. Например: site.ru

Конфиг домена ниже.

server
{
    listen 80;
    server_name cart.loc;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/cart.loc/;

    #SSL-START SSL related configuration, do NOT delete or modify the next line of commented-out 404 rules
    #error_page 404/404.html;
    #SSL-END

    #ERROR-PAGE-START  Error page configuration, allowed to be commented, deleted or modified
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
    #BEGIN_DENY_luxshop
    location ~* ^/http://cart.loc/.*.(php|jsp)$ {
        deny all;
    }
    #END_DENY_luxshop


    #PHP-INFO-START  PHP reference configuration, allowed to be commented, deleted or modified
    include enable-php-71.conf;
    #PHP-INFO-END

    #REWRITE-START URL rewrite rule reference, any modification will invalidate the rewrite rules set by the panel
    include /www/server/panel/vhost/rewrite/cart.loc.conf;
    #REWRITE-END

    # Forbidden files or directories
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    # Directory verification related settings for one-click application for SSL certificate
    location ~ \.well-known{
        allow all;
    }

	access_log  /www/wwwlogs/cart.loc.log;
    error_log  /www/wwwlogs/cart.loc.error.log;
}

 

 

Link to comment
20 минут назад, zondar сказал:

Конфиг домена ниже.

Всё что касается php у вас вот в этом конфиге

include enable-php-71.conf;

Покажите что в нём.

Link to comment
16 минут назад, mpn2005 сказал:

Всё что касается php у вас вот в этом конфиге

include enable-php-71.conf;

Покажите что в нём.

Только один файл с данным именем нашелся на сервере. Адрес /www/server/nginx/conf/

    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi-71.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
        include pathinfo.conf;
    }

 

Link to comment

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...