Nginx를 처음 사용했지만 Apache 및 Linux에 익숙합니다. 기존 프로젝트를 사용하고 있는데 index.php를 보려고 할 때 404 파일을 찾을 수 없습니다.
access.log 항목은 다음과 같습니다.
2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.ordercloud.lh"
다음은 사이트에서 사용 가능한 파일입니다.
server {
set $host_path "/home/willem/git/console/www";
access_log /www/logs/console-access.log main;
server_name console.ordercloud;
root $host_path/htdocs;
set $yii_bootstrap "index.php";
charset utf-8;
location / {
index index.html $yii_bootstrap;
try_files $uri $uri/ /$yii_bootstrap?$args;
}
location ~ ^/(protected|framework|themes/\w+/views) {
deny all;
}
#avoid processing of calls to unexisting static files by yii
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)(.*)$;
#let yii catch the calls to unexising PHP files
set $fsn /$yii_bootstrap;
if (-f $document_root$fastcgi_script_name){
set $fsn $fastcgi_script_name;
}
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fsn;
#PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fsn;
}
location ~ /\.ht {
deny all;
}
}
내 / home / willem / git / console은 www-data : www-data (PHP 등을 실행하는 웹 사용자)가 소유하고 있으며 좌절로부터 777 권한을 부여했습니다 …
가장 좋은 추측은 구성에 문제가 있다고 생각하지만 알아낼 수는 없습니다 …
업데이트
그래서 나는 그것을 /var/www/
더 기본 구성으로 옮기고 사용했습니다.
server {
#listen 80; ## listen for ipv4; this line is default and implied
#listen [::]:80 default ipv6only=on; ## listen for ipv6
root /var/www/;
index index.html index.htm;
# Make site accessible from http://localhost/
server_name console.ordercloud;
location / {
root /var/www/console/frontend/www/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www;
include fastcgi_params;
}
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
deny all;
}
}
또한 전화 localhost/console/frontend/www/index.php
하면 500 PHP를 얻습니다. 그냥 콘솔에서 제공되지 않습니다.
답변
“기본 스크립트를 알 수 없음”오류 메시지는 거의 항상SCRIPT_FILENAME
nginx fastcgi_param
지시문 에 잘못 설정된 것과 관련이 있습니다 (또는 잘못된 권한은 다른 답변 참조).
if
먼저 게시 한 구성에서를 사용하고 있습니다. 잘하면 지금 은 악 하고 종종 문제를 일으킨다 는 사실을 잘 알고 있어야합니다 .
root
위치 블록 내 에서 지시문을 설정하는 것은 좋지 않습니다. 물론 작동합니다.
다음과 같은 것을 시도해 볼 수 있습니다.
server {
location / {
location ~* \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
try_files $uri @yii =404;
}
}
location @yii {
fastcgi_param SCRIPT_FILENAME $document_root$yii_bootstrap;
}
}
위 구성은 테스트되지 않았습니다. nginx -t
nginx가 즉시 감지 할 수있는 문제를 확인하기 위해 적용하기 전에 실행해야합니다 .
답변
그것은 아니다 항상 (가) 있다는 SCRIPT_FILENAME
잘못된 것입니다. PHP가 잘못된 user / group으로 실행 중일
수도 있습니다 .
이 예에 특정 맥 OS X 내 경험에 설정에 가장 골칫거리 (데비안은 비교가 쉽다) – 난 그냥 사용, 7.0 PHP 5.6에서 업그레이드 한 사제 와 우수한 josegonzalez 패키지를.
문제는 구성 파일의 새 사본이 작성되었다는 것입니다.
기본 구성 파일은입니다 /usr/local/etc/php/7.0/php-fpm.conf
. 그러나 전체 하위 디렉토리가 포함 된 끝에있는 수영장 정의 섹션을 참고하십시오 .
include=/usr/local/etc/php/7.0/php-fpm.d/*.conf
에서 php-fpm.d
있다 www.conf
파일. 기본적으로 이것은 다음과 같습니다.
user = _www
group = _www
OS X에서는 다음과 같이 변경해야 할 수도 있습니다.
user = [your username]
group = staff
(이것은 ls -lh
document_root 와 일치 해야합니다)
불행히도이 변경 없이는 올바른 위치에서 파일을 찾더라도 Nginx 오류 로그에 여전히 표시 됩니다 .
"Primary script unknown" while reading response header from upstream
현재 실행중인 것을 확인하십시오.
ps aux | grep 'php-fpm'
또는 더 깨끗하게 :
ps aux | grep -v root | grep php-fpm | cut -d\ -f1 | sort | uniq
스크립트 파일 이름이 올바른지 확인하는 방법 :
(다른 답변에서 igorsantos07에서 도난당한)
http
메인 블록에 추가 /usr/local/etc/nginx/nginx.conf
:
log_format scripts '$document_root$fastcgi_script_name > $request';
(첫 번째 비트는 현재 사용중인 것이어야하므로 올바른지 확인할 수 있습니다.)
그리고 사이트 server
블록 에서 방금 정의한 로그를 사용하려면 다음을 수행하십시오 .
access_log /var/log/nginx/scripts.log scripts;
올바른 경우 example.com/phpinfo.php를 요청하면 다음과 같은 결과가 나타납니다.
/path/to/docroot/phpinfo.php > GET /phpinfo.php
기존 구성을 단순화 할 수 있습니까?
location ~ \.php {
인터넷 어딘가에서 복사 / 붙여 넣기 한 블록 을 사용하고 있습니까? 대부분의 패키지를 사용하면 더 빠르고 깨끗하게 할 수 있습니다. 예를 들어 OS X에서는 이제 다음이 필요합니다.
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
include snippets/fastcgi-php.conf;
# any site specific settings, e.g. environment variables
}
fastcgi_split_path_info, try_files 및 fastcgi_index (기본값은 index.php)와 같은 것들이 /usr/local/etc/nginx/snippets/fastcgi-php.conf
있습니다.
즉 차례로 포함 /usr/local/etc/nginx/fastcgi.conf
목록 인 fastcgi_param
중요한 SCRIPT_FILENAME을 포함하여 설정.
root
PHP 위치 블록에서 절대 복제하지 마십시오 .
답변
그래, 고군분투 한 하루 후에 내가 찾은 3 가지
- 어떤 이유로 든 포트 9000에서 이미 실행 중이므로 9001로 변경했습니다.
- 내 기본 사이트가 새 사이트를 가로 채고 있었는데 다시 한 번 왜 안되는지 이해가되지 않지만 링크를 해제했습니다.
- Nginx는 사이트에서 사용 가능한 사이트에 대해 sym 링크를 자동으로 수행하지 않습니다.
이것이 누군가에게 어려움을 덜어주기를 바랍니다!
답변
최신 nginx (v1.8)와 동일한 문제가 있습니다. 최신 버전 snippets/fastcgi-php.conf;
대신을 사용 하는 것이 좋습니다 fastcgi.conf
. 따라서 include fastcgi.conf
자습서에서 복사 / 붙여 넣기 를 Primary script unknown
하면 로그에 오류 가 발생할 수 있습니다 .
답변
“기본 스크립트를 알 수 없음” 은 SELinux 보안 컨텍스트로 인해 발생합니다 .
클라이언트는 응답을 얻을
파일을 찾을 수 없습니다.
nginx error.log에는 다음과 같은 오류 메시지가 있습니다
* 19 FastCGI가 stderr로 전송 : 업스트림에서 응답 헤더를 읽는 동안 “기본 스크립트를 알 수 없음”
따라서 웹 루트 폴더의 보안 컨텍스트 유형을 httpd_sys_content_t로 변경하십시오.
chcon -R -t httpd_sys_content_t /var/www/show
nginx / php-fpm 설정을위한 3 명의 사용자가 있습니다
/etc/nginx/nginx.conf
user nobody nobody; ### `user-1`, this is the user run nginx woker process
...
include servers/*.conf;
/etc/nginx/conf.d/www.conf
location ~ \.php$ {
# fastcgi_pass 127.0.0.1:9000; # tcp socket
fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock; # unix socket
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
/etc/php-fpm.d/www.conf
[www]
user = apache ### `user-2`, this is the user run php-fpm pool process
group = apache
;listen = 127.0.0.1:9000 # tcp socket
listen = /var/run/php-fpm/fpm-www.sock # unix socket
listen.onwer = nobody ### `user-3`, this is the user for unix socket, like /var/run/php-fpm/fpm-www.sock
listen.group = nobody # for tcp socket, these lines can be commented
listen.mode = 0660
user-1과 user-2가 같을 필요는 없습니다.
유닉스 소켓의 경우,
nginx fastcgi_pass가 유닉스 소켓에 대한 읽기 / 쓰기 권한을 가져야 하므로 user-1은 user-3과 동일 해야합니다.
그렇지 않으면 nginx에 502 Bad Gateway 가 표시되고 nginx error.log에 다음 오류 메시지가 표시됩니다.
* 36 유닉스에 연결하는 동안 unix : /var/run/php-fpm/fpm-www.sock에 connect () 실패 (13 : 권한 거부)
웹 루트 폴더의 사용자 / 그룹 (/ var / www / show)은이 3 명의 사용자와 같을 필요는 없습니다.
답변
나는 또한이 문제를 가지고 있었고, 나는 선을 교환하여 해결 include fastcgi_params
하고 fastcgi_param SCRIPT_FILENAME ...
.
실제로 nginx는 각 FastCGI 매개 변수의 마지막 값을 설정하므로 fastcgi_params에 포함 된 기본값 뒤에 값을 넣어야합니다.
답변
CentOS7.3 시스템에서 SELINUX를 닫아서이 문제를 해결했습니다.
단계 :
- exec
setenforce 0
- U는 또한 설정 파일을 수정해야합니다
vim /etc/selinux/config set SELINUX to disabled