Thank you for reading this post, don't forget to subscribe!
Ошибка FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream в Nginx возникает при использовании модуля php-fpm.
Она говорит о том, что веб-сервер не может найти указанный в файле конфигурации nginx.conf скрипт:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
server { listen 80; server_name xxx.xxx.xxx.xxx; root var/www/; access_log /var/log/nginx_access.log; error_log /var/log/nginx_error.log; location ~ .*\.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } |
[/codesyntax]
$document_root говорит о том, что скрипт лежит в корневом каталоге
Главная рекомендация — проверьте все пути и убедитесь, что все нужные файлы существуют и лежат на своих местах.
Если вы не можете разобраться, в каком каталоге Nginx ищет нужный скрипт, то поможет консоль:
1 |
tcpdump port 9000 -A | strings |
fastcgi_pass по умолчанию установлен на 9000 порт
Вывод покажет всю нужную информацию, в том числе путь к скрипту.
Защита файлов
Учтите, что нужно дополнительно настроить веб-сервер, чтобы он мог выдержать атаки злоумышленников и огромное количество запросов к несуществующим файлам, которые сами по себе способны положить сайт.
Для начала можно заблокировать доступ к файлам, которых не существует, но к которым может быть повышенный интерес:
[codesyntax lang="php"]
1 2 3 |
location /admin.php { deny all; } |
[/codesyntax]
Запрещает доступ к файлу admin.php
Но в Nginx есть и более изящный способ защиты от запросов к несуществующим файлам:
[codesyntax lang="php"]
1 2 3 |
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { try_files $uri =404; } |
[/codesyntax]
Если запрашиваемого файла заданного формата не существует, то выводит страницу 404
А для защиты от флуда можно использовать директиву limit_req:
[codesyntax lang="php"]
1 2 3 4 5 6 7 |
location ~ .*\.php$ { limit_req zone=flood; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } |
[/codesyntax]
Директив limit_req может быть несколько
Limit_req также можно размещать в секциях http и server:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 |
http { limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; server { limit_conn conn_limit_per_ip 10; limit_req zone=req_limit_per_ip burst=10 nodelay; } } |
[/codesyntax]
Ограничивает количество подключений с одного ip и количество запросов в секунду
При использовании модуля FastCGI можно ограничить доступ к файлам из интернета, возвращая страницу ошибки при запросе:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
server { listen 80; server_name xxx.xxx.xxx.xxx; root var/www/; access_log /var/log/nginx_access.log; error_log /var/log/nginx_error.log; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/www; } fastcgi_intercept_errors on; location ~ .*\.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } |
[/codesyntax]
Все ошибки перенаправляются на error_page