Nginx는 .php 파일을 실행하는 대신 다운로드로 제공합니다.


151

물방울 (Digital Ocean)에 웹 사이트를 설치하고 있습니다. PHP로 NGINX를 올바르게 설치하는 데 문제가 있습니다. 나는 https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 튜토리얼을 했지만 일부를 실행하려고 할 때 .php 파일 그냥 다운로드 중입니다 ... 예를 들어 ... http://5.101.99.123/info.php작동하지만 ... 메인으로 이동하면 http://5.101.99.123내 index.php를 다운로드합니다 : /

어떤 생각?

-rw-r--r--  1 agitar_user www-data   418 Jul 31 18:27 index.php
-rw-r--r--  1 agitar_user www-data    21 Aug 31 11:20 info.php

내 / etc / nginx / sites-available / default

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /var/www/html;
        index index.html index.htm index.php;

        # Make site accessible from http://localhost/
        server_name agitarycompartir.com;

               location ~ \.php$ {
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #               # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #
    #               # 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;
                    include fastcgi_params;
            }


              location / {

                    try_files $uri $uri/ =404;
                    # Uncomment to enable naxsi on this location
                    # include /etc/nginx/naxsi.rules
            }

... 기타 "위치"는 주석 처리됩니다 (#)


4
예 ... Nginx로 PHP-FPM을 올바르게 설정하지 않았습니다. 전부 그 우리는 당신이 우리에게 보여주지 않았기 때문에 비록 당신이 말할 수 있는 당신의 설정의합니다.
Brad

어떤 파일을보고 싶습니까? 감사합니다 @Brad
Apeiron

어떤 파일 (또는 파일)을 설정하든 관계없이 Nginx 설정에서 PHP-FPM을 설정하는 관련 부분이 있습니다.
Brad

2
한 시간의 인터넷 검색 후이 askubuntu.com/a/601996/89455를 찾았 습니다 -캐시를 삭제하기 전에 구성이 잘못 된 경우 여기에서 작동했습니다!
tm_lv

답변:


131

이 시도:

  1. 편집하다 /etc/nginx/sites-available/default

  2. 포트 80 IPv4 및 IPv6에서 nginx가 청취하도록 두 청취 라인의 주석을 해제하십시오.

    listen   80; ## listen for ipv4; this line is default and implied
    listen   [::]:80 default_server ipv6only=on; ## listen for ipv6
  3. 두고 server_name혼자

    # Make site accessible (...)
    server_name localhost;
  4. 추가 index.php받는 index라인

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
  5. 주석 해제 location ~ \.php$ {}

    # pass the PHP scripts to FastCGI server listening on (...)
    #
    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    
            # 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;
            include fastcgi_params;
    }
  6. 편집 /etc/php5/fpm/php.ini하고 다음 cgi.fix_pathinfo으로 설정되어 있는지 확인하십시오0

  7. nginx 및 php5-fpm을 다시 시작하십시오. sudo service nginx restart && sudo service php5-fpm restart


저는 일주일 전에 리눅스를 사용하기 시작했습니다. 나노 텍스트 편집기를 사용하여 파일을 편집하고 있습니다. apt-get install nano가 없으면 실행하십시오. 그것에 대한 Google은 더 알고 있습니다.


14
service nginx restart && service php5-fpm restart
Duke

8
nginx -s reload
Duke

2
PHP7-fpm 사용으로 : service php7.0-fpm restart
Alex

1
@ 조이, 당신의 제안을 시도했지만 작동하지 않았습니다. fastcgi_pass 유닉스를 사용해야했다 : /run/php/php7.0-fpm.sock;
jdstaerk

1
php7.2의 경우 : unix:/var/run/php5-fpm.sock;로 변환 unix:/var/run/php/php7.2-fpm.sock;(하나 더 중첩 /php)
Oleg Reym

50

Nginx 서버에서 PHP 파일을 실행하려면 이것을 / etc / nginx / sites-enabled / default에 추가해야합니다 :

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

SCRIPT_FILENAME은 무엇입니까?
mp3por

2
PHP 7.0을 사용한다면 다음과 같습니다 :fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox

1
@ AndrewFox- 내 이름이 php7.0-fpm.pid아니라 php7.0-fpm.sock에서 /var/run/php/ 그 의미를 무엇?
vsync

@vsync 사용해보십시오. sudo service php7.0-fpm restart. 양말이 없으면 PHP 프로세스가 실행 중임을 나타냅니다.
zhisme

1
@Pathros - 난 (내 경우)이 워드 프레스 다른 폴더에있는 서버 구성 파일이 발견, 그 편집 할 데 필요한 것들이었다/etc/nginx/conf.d/wordpress_https.conf
수직 동기화

43

브라우저 캐시비워서 비슷한 문제가 발생 했습니다 (다른 브라우저에서도 잘 작동했습니다).


5
다시 시작 및 시크릿 모드가 도움이되었다고 생각합니다. 우리가 할 수있는 멍청함에 대해 대단히 감사합니다.
Swapnil Mhaske

4
고마워 당신은 내 하루를 구했습니다) 시크릿 +1!
Eddie

3
이것은 몇 시간 후에 제안 된 다른 많은 솔루션을 시도한 후에도 나를 위해 만들었습니다.
Kleag

1
mozilla에서 사이트를 실행하는 데 방해가되는 동안 내 사이트가 IE와 크롬에서 작동한다는 것이 이상했습니다. 모질라의 캐시 결함이었다.
빅터 조 라스

3
내 시간을 구했어
Amir Kaftari

12

nginx 설정 / etc / nginx / sites-available / default 또는 설정 파일 업데이트

php7을 사용하는 경우 이것을 사용하십시오

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;      
    }

php5를 사용하는 경우 이것을 사용하십시오

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }

자세한 내용은 여기를 참조하십시오.


나는 이것을 시도하지 않았다, 나는 우분투 14.04와 PHP 7.0을 사용하고 있는데 어떻게이 문제를 해결할 수 있습니까?
Kishore

공유 링크 위의 "완전한 세부 사항"고장
키 쇼어

무슨 뜻 include snippets/fastcgi-php.conf;입니까?
Timo

9

위의 많은 솔루션을 보았고 많은 솔루션이 올바르게 작동했지만 코드를 붙여 넣기, 특히 fastcgi 붙여 넣기가 걱정되었습니다 . 여기 2 센트가 있습니다.

  1. nginx는 웹 서버 ( 응용 프로그램 서버 아님)이므로 정적 페이지 만 제공 할 수 있습니다.
  2. nginx는 .php 파일을 이해할 수 없기 때문에 .php 파일 ( 예 : index.php)을 렌더링 / 반환하려고 할 때마다 무엇을 해야할지 모르겠습니다. 같은 .html 중에서,은 .js 등 정적 파일있는)
  3. 따라서 다른 종류의 파일을 실행하려면 nginx와 응용 프로그램 (여기서는 PHP 응용 프로그램) 사이에있는 것이 필요합니다. 여기에는 CGI (Common Gateway Interface)가 사용됩니다.이 통신을 관리하는 소프트웨어입니다. CGI는 가능한 모든 언어 파이썬 (uWSGI), PHP (FPM) 및 심지어 C로 구현 될 수 있습니다. FastCGI는 기본적으로 CGI보다 훨씬 빠른 업그레이드 된 버전의 CGI입니다.

Apache와 같은 일부 서버의 경우 PHP를 해석하기위한 지원 기능이 내장되어 있으므로 CGI가 필요하지 않습니다.

이 디지털 오션 링크 는 FPM을 설치하는 단계를 잘 설명하고 있으며 다른 답변이 IMHO이기 때문에 렌더링 대신 PHP 파일이 다운로드되는 문제를 해결하는 데 필요한 단계를 작성하지 않았습니다.


좋은 설명자. 감사.
Jon

1
nginx는 브라우저 가 아닌 웹 서버 이므로 수정하십시오.
지오 코드

8

나는 같은 문제를 겪었고 아무런 대답도 문제를 해결하지 못했습니다.

나는 달렸다 :

sudo nginx -t

/ etc / nginx / sites-available / default에서 구성 파일을 테스트합니다.

그것은 나에게 이러한 오류를 주었다 :

nginx: [emerg] unexpected end of file, expecting "}" in /etc/nginx/sites-enabled/default:115
nginx: configuration file /etc/nginx/nginx.conf test failed

그래서 설정 파일로 갔고 마지막 줄에는

#}

주석 처리를 제거하고 테스트 명령을 다시 실행했는데 작동했습니다.


문제를 해결하기위한 조언 외에도 테스트 명령 구문을 포함시키는 것이 좋습니다.
greybeard

7

이것은 나를 위해 일했습니다.

1) MyApp 파일

vi / etc / nginx / sites-available / myApp

server {
  listen 80;
  listen [::]:80;

  root /var/www/myApp;
  index index.php index.html index.htm;

  location ~ \.php$ {
      try_files $uri =404;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/run/php/php7.0-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
      }
}

PHP5 사용자

변화

fastcgi_pass unix:/run/php/php7.0-fpm.sock;

fastcgi_pass unix:/var/run/php5-fpm.sock;

2) cgi.fix_pathinfo 구성

cgi.fix_pathinfo를 0으로 설정하십시오.

위치:

PHP5 /etc/php5/fpm/php.ini

PHP7 /etc/php/7.0/fpm/php.ini


3) 서비스 재시작

FPM

php5 sudo service php5-fpm restart

php7 sudo service php7.0-fpm restart

NGINX

sudo service nginx restart

fastcgi_pass 유닉스 : /run/php/php7.0-fpm.sock; 부정확하다. /var/run/php/php7.0-fpm.sock이어야합니다. 지정한 PHP 버전을 설치 한 내용으로 업데이트해야합니다 (예 : /var/run/php/php7.2-fpm.sock).
VanAlbert

4

나를 위해 ?$query_string/index.php 끝에 다음과 같이 추가하는 데 도움이되었습니다 .

location / {
        try_files $uri $uri/ /index.php?$query_string;
}

3

제안 된 답변 중 하나라도 작동하지 않으면 다음을 시도하십시오.

1. etc / php5 / fpm / pool.d에서 www.conf를 수정하십시오.

listen = 127.0.0.1:9000;(delete all line contain listen= )

usr / local / nginx / conf에서 nginx.conf를 수정하십시오.

remove server block server{} (if exist) in block html{} because we use server{} in default (config file in etc/nginx/site-available) which was included in nginx.conf.

3. etc / nginx / site-available에서 기본 파일 수정

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; }

4. nginx 서비스 재시작

sudo 서비스 nginx 재시작

5. PHP 서비스를 다시 시작하십시오

서비스 php5-fpm 재시작

6. 즐길

/ usr / share / nginx / html에 php 파일을 생성하고 "server_name / file_name.php"에서 실행하십시오 (server_name은 구성에 따라 다르며 normaly는 localhost, file_name.php는 / usr / share / nginx에서 작성된 파일 이름입니다. / html).

우분투 14.04를 사용하고 있습니다


2

위의 답변은 내가 도달 한 솔루션에 대해 너무 많이 언급하는 것처럼 보였습니다. 이것은 내 파일의 모습입니다.

/ etc / nginx / sites-available / default

location ~ \.php$ {
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
# # 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;
include fastcgi_params;
}

이것이 일요일 오후에 좌절하는 사람들에게 도움이되기를 바랍니다 (c :


2
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/html;
    index index.php index.html index.htm;

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

위의 스 니펫은 php7.2의 경우 나를 위해 일했습니다.


1

PHP 7과 동일한 문제가있는 사람은 CentOS 7에서 nginx가 PHP 파일을 올바르게 실행하도록하기 위해 수행 한 것입니다.

  • Digital Ocean 에서이 문서를 단계별로 수행하십시오 .

  • 열기 /etc/nginx/conf.d/default.conf(기본적으로 내가 사이트 사용이나 사이트-가능합니다, 당신은 그에 따라 편집 할 수 없습니다)입니다.

  • location다음과 같이 매개 변수를 편집하십시오 .

default.conf :

location ~ \.php$ {
    try_files $uri =404;
    #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

    #instruct nginx execute php7 files instead download them :D
    fastcgi_pass unix:/var/run/php-fpm/www.sock;

    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
  • 다시 시작 Nginx에와 PHP 서비스 sudo systemctl restart php-fpmsudo systemctl restart nginx.

  • 마지막으로 가장 중요한, 명확한 브라우저 캐시 또는 실행 incognito (Chrome)또는 Private Browsing (Firefox)등 ...

이 도움이되고 행복한 코딩을 바랍니다.


1

내 솔루션은 추가했다

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

예를 들어 내 사용자 정의 구성 파일에 etc/nginx/sites-available/example.com.conf

에 추가하는 /etc/nginx/sites-available/default것이 효과 가 없었습니다.


1

필자 /etc/nginx/sites-available/default가 사용 하지 않는 경우 다른 서버 블록 구성 파일 (예 : example.com)을 사용하고 있었고이 문제를 해결할 수있는 유일한 방법은 기본 서버 블록 구성 파일 기호 링크를 제거하는 것입니다.

$ rm /etc/nginx/sites-enabled/default

그런 다음 Nginx를 다시로드하십시오.

$ sudo systemctl reload nginx

1

이 코드로 문제를 해결했습니다 (IP 변경).

location / {
access_log off;
    log_not_found  off;
    client_max_body_size    2000m;
    client_body_buffer_size 512k;
    proxy_buffering on;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    proxy_buffer_size 64k;
    proxy_buffers 32 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_connect_timeout 300s;
    proxy_http_version 1.1;
    proxy_set_header Range "";
    proxy_pass   https://123.123.123.123:444;
    proxy_set_header   Host   $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_redirect     off;
}

0

우분투 16.04에서 나를 위해 일한 것은 php7 이이 줄을 삭제하는 것입니다.

fastcgi_split_path_info ^(.+\.php)(/.+)$;

그 후 PHP 파일 다운로드를 중단했습니다.


0

/ etc / nginx / sites-available / default에서 .php 위치의 주석을 해제하십시오

sudo vi / etc / nginx / sites-available / default :

location ~ \.php$ {
            include snippets/fastcgi-php.conf;

            # With php5-cgi alone:
    #       fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

0

다른 것이 도움이되지 않으면. 그리고 이전에는 info.php 테스트 파일로 apache2를 설치했을 수도 있습니다. localhost에 대한 앱 데이터 (캐시, 쿠키)를 지우십시오.


0

nginx 설정 파일 확장자가 * .conf인지 확인하십시오.
예를 들면 다음과 같습니다. /etc/nginx/conf.d/myfoo.conf

나는 같은 상황에 처해있다. 구성 파일 이름을 myfoo에서 myfoo.conf로 바꾼 후 수정되었습니다. 이름을 바꾼 후 nginx를 다시 시작하는 것을 잊지 마십시오.


0

먼저 Remove cache브라우저에서

그런 다음 터미널을 열고 다음 명령을 실행하십시오.

sudo apt-get install php-gettext
sudo nano /etc/nginx/sites-available/default

그런 다음 default파일에 다음 코드를 추가 하십시오.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

불일치가 수정되면 다음 명령으로 터미널에서 Nginx를 다시 시작하십시오.

sudo systemctl 다시 시작 nginx

그런 다음 브라우저로 이동하여 즐기십시오 ...


0

나를 위해 그것은 줄이었다 : fastcgi_pass unix : /var/run/php5-fpm.sock;

다음과 같습니다 : fastcgi_pass unix : /run/php5-fpm.sock;


0

Cloudflare가 PHP 파일을 캐시하고 계속 다운로드하도록 만드는 것이 문제였습니다.

나를위한 수정은 Cloudflare에서 캐시를 제거하는 것이 었습니다.


어쩌면 당신은 우리에게 방법을 말하고 싶습니까?
Thorsten Staerk

0

CSS 가로 드되지 않는 문제가있는 경우이 서버 블록에도 다른 위치 블록 위에이 블록이 있다는 것이 동일한 문제를 겪었습니다. 내 사이트에서 사용 가능한 conf 파일에 추가했습니다.

location ~ [^/]\.php(/|$) {
fastcgi_split_path_info  ^(.+\.php)(/.+)$;
fastcgi_index            index.php;
fastcgi_pass             unix:/var/run/php/php7.3-fpm.sock;
include                  fastcgi_params;
fastcgi_param   PATH_INFO       $fastcgi_path_info;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

0

그래서 이것은 필자의 경우
nginx 다시 쓰기 규칙을 다음과 같이 변경 한 다시 쓰기 규칙으로 마침내 작동했습니다 .

   location /vendors { rewrite ^/vendors/?$ /vendors.php break; } 

된다 ...

  location /vendors { rewrite ^/vendors/?$ /vendors.php last; }

분명히하지 않고 마지막으로 는 충돌하지 않도록 키워드, 요청이 다시 시작되지 않은 .php위치 세그먼트를, 단순히 다운로드로 해석되었다 -


0

기록을 위해, 내 PHP-fpm이 실행되고 있지 않다는 것을 알았습니다. service php7.2-fpm stop


0

한 가지 더 확인해야 할 사항 : PHP 설정하기 전에 HTTPS 액세스 설정 한 경우-certbot을 사용했습니다 ./etc/nginx/sites-available/default를 두 번 변경해야합니다. 이있을 것이기 때문에 서버 블록 (포트 80에서 수신 대기, 포트 443에서 수신 대기)

(이 서버를 주로 이메일로 설정하고 certbot을 더 쉽게 실행하는 방법으로 nginx를 처음 설치할 때 PHP를 사용하지 않았습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.