У меня проблемы с nginx. Я устанавливаю nginx на Raspberry Pi B + (Raspbian Jessie) и PHP с FastCGI. Когда я пытаюсь использовать cURL для получения страниц, он возвращает HTML-код, сгенерированный PHP.
Блок сервера nginx, обслуживающий запросы fastcgi
server {
listen 80 default_server;
listen [::]:80 ipv6only=on default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /usr/share/nginx/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# include snippets/fastcgi-php.conf;
include fastcgi_params;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#
# # With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# deny access to .htaccess files, if Apache's document root
#oncurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
ФАЙЛ PHP
<?php
echo "PHP Test";
?>
Ответ браузера: либо загружает его (Chrome), либо отображает как исходный код (другие браузеры)
cURL:
GET /test_2.php HTTP / 1.1 User-Agent: curl / 7.38.0 Хост: localhost Принять: /
<HTTP / 1.1 200 ОК
nginx access.log
::1 - - [12/May/2017:12:21:20 +0800] "GET /test_2.php HTTP/1.1" 20019 "-" "curl/7.38.0"
192.168.0.132 - - [12/May/2017:12:26:28 +0800] "GET /test_2.php HTTP/1.1" 200 28 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
nginx error.log
2017/05/12 11:50:41 [error] 21715#0: *64 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.0.132, server: ~., request: "GET /favicon.ico HTTP/1.1", host: "192.168.0.113"
2017/05/12 11:53:02 [error] 21715#0: *66 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.0.132, server: ~., request: "GET /favicon.ico HTTP/1.1", host: "192.168.0.113"
2017/05/12 11:54:18 [notice] 21737#0: signal process started
2017/05/12 11:54:22 [notice] 21747#0: signal process started
РЕДАКТИРОВАТЬ: после комментария Тима ниже я запустил curl для принудительного IPv4, и он действительно вернул исходный код.
Думаю, я знаю, почему это так. Мой второй серверный блок, который разрешает все имена с помощью RegEx ~.
настроен на прослушивание порта 80, который является IPv4, и у него нет обработчика CGI. Однако по умолчанию серверный блок настроен на прослушивание порта 80 для IPv6. Поскольку nginx выполняет откат к серверу по умолчанию только после тестирования других серверов, блоку прокси-сервера нечего обрабатывать PHP, поэтому он возвращает его как исходный код. В IPv6 nginx не может использовать блок прокси-сервера для обработки запроса, поэтому он передает его на сервер по умолчанию, на котором работает сервер FastCGI, таким образом, он может вернуть phpinfo()
.
Решение
Я должен поставить location /git/
блок пропуска прокси в блоке сервера по умолчанию.