Nginx phục vụ các tệp .php dưới dạng tải xuống, thay vì thực thi chúng


151

Tôi đang cài đặt một trang web trong một giọt (Digital Ocean). Tôi gặp sự cố khi cài đặt NGINX với PHP đúng cách. Tôi đã làm một hướng dẫn https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubfox-14-04 nhưng khi tôi cố chạy một số Tập tin .php chỉ cần tải xuống ... ví dụ ... http://5.101.99.123/info.phpnó đang hoạt động nhưng ... Nếu tôi đi đến chính http://5.101.99.123thì nó đang tải xuống index.php của tôi: /

Bất kỳ ý tưởng?

-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

Của tôi / etc / nginx / site-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
            }

... "Vị trí" khác được nhận xét (#)


4
Có ... bạn đã không thiết lập PHP-FPM với Nginx chính xác. Đó là tất cả những gì chúng tôi có thể nói với bạn mặc dù bạn không cho chúng tôi xem bất kỳ cấu hình nào của bạn.
Brad

bạn muốn xem tập tin nào Cảm ơn @Brad
Apeiron

Bất kỳ tệp (hoặc tệp) nào bạn đặt cấu hình của mình. Phần có liên quan là ... nơi bạn thiết lập PHP-FPM trong cấu hình Nginx của bạn.
Brad

2
sau khi một giờ đồng hồ tìm thấy điều này, hãy hỏi điều này .
tm_lv

1
Xem câu hỏi / câu trả lời tương tự cho PHP7 tại stackoverflow.com/q/42664080/287948
Peter Krauss

Câu trả lời:


131

Thử cái này:

  1. Biên tập /etc/nginx/sites-available/default

  2. Bỏ ghi chú cả hai dòng nghe để làm nginx nghe trên cổng 80 IPv4 và IPv6.

    listen   80; ## listen for ipv4; this line is default and implied
    listen   [::]:80 default_server ipv6only=on; ## listen for ipv6
    
  3. Để server_nameyên

    # Make site accessible (...)
    server_name localhost;
    
  4. Thêm index.phpvào indexdòng

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
    
  5. Thất bại 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. Chỉnh sửa /etc/php5/fpm/php.inivà đảm bảo cgi.fix_pathinfođược đặt thành0

  7. Khởi động lại nginx và php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Tôi mới bắt đầu sử dụng Linux một tuần trước, vì vậy tôi thực sự hy vọng sẽ giúp bạn về vấn đề này. Tôi đang sử dụng trình soạn thảo văn bản nano để chỉnh sửa các tập tin. chạy apt-get install nano nếu bạn không có nó. Google vào đó để biết thêm.


14
service nginx restart && service php5-fpm restart
Công tước

8
nginx -s reload
Công tước

2
với PHP7-fpm là: dịch vụ php7.0-fpm khởi động lại
Alex

1
@Joy, đã thử đề xuất của bạn nhưng nó không hoạt động. Phải sử dụng fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk

1
Đối với php7.2: unix:/var/run/php5-fpm.sock;chuyển đổi thành unix:/var/run/php/php7.2-fpm.sock;(thêm một lần lồng /php)
Oleg Reym

50

Bạn cần thêm phần này vào / etc / nginx / sites-enable / default để thực thi các tệp php trên Nginx Server:

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 là gì?
mp3por

2
Nếu bạn đang sử dụng PHP 7.0, thì điều này là chính xác:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox

1
@ AndrewFox- filename của tôi là php7.0-fpm.pidvà không php7.0-fpm.sock/var/run/php/ những gì hiện có nghĩa là gì?
vsync

@vsync hãy thử nó. sudo service php7.0-fpm restart. nếu sock bị thiếu, nó chỉ ra rằng quá trình php đang được chạy.
zhisme

1
@Pathros - Tôi thấy rằng wordpress (trong trường hợp của tôi) có các tệp cấu hình Máy chủ trong một thư mục khác và đó là những tệp cần chỉnh sửa/etc/nginx/conf.d/wordpress_https.conf
vsync

43

Tôi gặp vấn đề tương tự đã được giải quyết bằng cách làm trống bộ đệm của trình duyệt (cũng hoạt động tốt với các trình duyệt khác nhau).


5
Tôi nghĩ rằng chế độ khởi động lại và ẩn danh đã giúp tôi. Cảm ơn rất nhiều cho sự noobness chúng ta có thể làm.
Swapnil Mhaske

4
Cảm ơn rất nhiều. Bạn đã lưu ngày của tôi) Cũng +1 cho ẩn danh!
Eddie

3
Điều này làm cho tôi, cũng sau nhiều giờ thử rất nhiều giải pháp khác được đề xuất.
Kleag

1
Điều kỳ lạ đối với tôi là trang web của tôi đã hoạt động trên IE và chrome trong khi ở mozilla, nó đã đánh sập trang web khi thực hiện nó. Đó là lỗi bộ nhớ cache của mozilla.
Viktor Joras

3
Bạn đã tiết kiệm thời gian của tôi bro.
Amir Kaftari

12

Cập nhật nginx config / etc / nginx / sites-Available / default hoặc tập tin cấu hình của bạn

nếu bạn đang sử dụng php7, hãy sử dụng cái này

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

nếu bạn đang sử dụng php5, hãy sử dụng cái này

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

Truy cập vào đây để biết chi tiết đầy đủ Chi tiết tại đây


Tôi đã thử điều này không hiệu quả với tôi, tôi đang sử dụng Ubuntu 14.04 và php 7.0, làm cách nào để khắc phục vấn đề này?
Kishore

liên kết được chia sẻ ở trên "chi tiết đầy đủ" bị hỏng
Kishore

Có nghĩa là include snippets/fastcgi-php.conf;gì?
Timo

9

Tôi thấy rất nhiều giải pháp ở trên và nhiều giải pháp hoạt động chính xác cho tôi, nhưng tôi không hiểu họ đang làm gì và lo lắng khi chỉ sao chép mã, đặc biệt là fastcgi . Đây là 2 xu của tôi,

  1. nginx là một máy chủ web (và không phải là máy chủ ứng dụng ) và do đó, nó chỉ có thể phục vụ các trang tĩnh.
  2. Bất cứ khi nào, chúng tôi thử kết xuất / trả lại tệp .php, ví dụ index.php, nginx không biết phải làm gì, vì nó không thể hiểu tệp .php (hoặc cho vấn đề đó bất kỳ phần mở rộng nào ngoài một vài lựa chọn như .html, .js, vv là các tệp tĩnh)
  3. Do đó, để chạy các loại tệp khác, chúng ta cần một cái gì đó nằm giữa nginx và ứng dụng (ở đây là ứng dụng php). Đây là nơi giao diện cổng chung (CGI) xuất hiện. Đây là một phần mềm quản lý giao tiếp này. CGI có thể được triển khai bằng bất kỳ ngôn ngữ có thể Python (uWSGI), PHP (FPM) và thậm chí C. FastCGI về cơ bản là phiên bản nâng cấp của CGI, nhanh hơn nhiều so với CGI.

Đối với một số máy chủ như Apache, được tích hợp hỗ trợ để giải thích PHP và do đó không cần CGI.

Liên kết đại dương kỹ thuật số này , giải thích các bước để cài đặt FPM khá tốt và tôi không viết các bước cần thiết để giải quyết vấn đề về các tệp php được tải xuống thay vì hiển thị vì các câu trả lời khác IMHO khá tốt.


Người giải thích tốt đẹp. Cảm ơn.
Jon

1
nginx là một trang web MÁY CHỦ không trình duyệt, hãy sửa nó.
Geeocode

8

Tôi đã có cùng một vấn đề và không có câu trả lời nào giải quyết được vấn đề.

Tôi đã chạy

sudo nginx -t

để kiểm tra tệp cấu hình tại / etc / nginx / site-Available / default.

Nó đã cho tôi những lỗi này:

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

Vì vậy, tôi đã đi vào tập tin cấu hình và trên dòng cuối cùng có

#}

Tôi không chú ý, chạy lại lệnh kiểm tra và nó hoạt động


Liên lạc tốt đẹp để bao gồm cú pháp lệnh kiểm tra ngoài một lời khuyên để khắc phục vấn đề.
greybeard

7

Điều này làm việc cho tôi.

1) tập tin MyApp

vi / etc / nginx / site-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;
      }
}

Người dùng PHP5

Thay đổi

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

đến

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

2) Định cấu hình cgi.fix_pathinfo

Đặt cgi.fix_pathinfo thành 0

Vị trí:

PHP5 /etc/php5/fpm/php.ini

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


3) Khởi động lại dịch vụ

Chi cục Kiểm lâm

php5 sudo service php5-fpm restart

php7 sudo service php7.0-fpm restart

NGINX

sudo service nginx restart

fastcgi_pass unix: /run/php/php7.0-fpm.sock; không chính xác Nó phải là /var/run/php/php7.0-fpm.sock; và bạn cần cập nhật phiên bản php đã chỉ định với bất cứ thứ gì bạn đã cài đặt, ví dụ: /var/run/php/php7.2-fpm.sock;
VanAlbert

4

Đối với tôi, nó đã giúp thêm ?$query_stringvào cuối /index.php, như dưới đây:

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

3

Nếu bất kỳ câu trả lời được đề xuất nào không hoạt động, hãy thử điều này:

1.fix www.conf trong etc / php5 / fpm / pool.d:

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

2.fix nginx.conf trong usr / local / 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. sửa tệp mặc định trong etc / nginx / site-Available

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

4. dịch vụ nginx

sudo dịch vụ nginx khởi động lại

5. dịch vụ php

dịch vụ php5-fpm khởi động lại

6. vui mừng

Tạo bất kỳ tệp php nào trong / usr / share / nginx / html và chạy trong "server_name / file_name.php" (server_name phụ thuộc vào cấu hình của bạn, Normaly là localhost, file_name.php là tên của tệp được tạo trong / usr / share / nginx / html).

Tôi đang sử dụng Ubuntu 14.04


2

Câu trả lời ở trên dường như bình luận quá nhiều cho giải pháp tôi đạt được. Đây là những gì tập tin của tôi trông giống như:

/ etc / nginx / site-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;
}

Hy vọng điều này sẽ giúp một số người thất vọng vào một buổi chiều chủ nhật (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;
    }
}

Các đoạn trên đã làm việc cho tôi trong trường hợp php7.2


1

Đối với bất kỳ ai có cùng vấn đề với PHP 7, đây là những gì tôi đã làm để khiến nginx thực thi đúng các tệp php trong CentOS 7, được đăng ở đây để đề phòng bất kỳ ai gặp vấn đề tương tự:

  • Thực hiện theo từng bước tài liệu này trên Digital Ocean .

  • Mở /etc/nginx/conf.d/default.conf(theo mặc định tôi không kích hoạt trang web cũng như trang web khả dụng, bạn có thể chỉnh sửa tương ứng).

  • Chỉnh sửa locationtham số như dưới đây:

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;
}
  • Khởi động lại dịch vụ Nginx và PHP sudo systemctl restart php-fpmsudo systemctl restart nginx.

  • Cuối cùng nhưng quan trọng nhất, xóa bộ nhớ cache của trình duyệt hoặc chạy trong incognito (Chrome)hoặc Private Browsing (Firefox)vv ...

Hy vọng mã hóa hữu ích và hạnh phúc này


1

Giải pháp của tôi là thêm

    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;

vào tập tin cấu hình tùy chỉnh của tôi, ví dụ etc/nginx/sites-available/example.com.conf

Thêm vào /etc/nginx/sites-available/defaultđã không làm việc cho tôi.


1

Trường hợp của tôi, tôi không sử dụng /etc/nginx/sites-available/defaultTôi đang sử dụng một tệp cấu hình khối máy chủ khác (ví dụ example.com) và cách duy nhất tôi có thể khắc phục sự cố này là bằng cách xóa liên kết tượng trưng tệp cấu hình khối máy chủ mặc định:

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

sau đó tải lại Nginx:

$ sudo systemctl reload nginx

1

Tôi đã giải quyết vấn đề của mình bây giờ với mã này (thay đổi IP của bạn):

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

Điều gì đã làm việc với tôi với Ubuntu 16.04 và php7 đã xóa dòng này

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

Nó đã ngừng tải tập tin php sau đó.


0

Bỏ ghi chú vị trí .php trong / etc / nginx / site-Available / default

sudo vi / etc / nginx / site-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

Nếu bất cứ điều gì khác không giúp bạn. Và có thể trước đó bạn đã cài đặt apache2 với tệp kiểm tra info.php. Chỉ cần xóa dữ liệu ứng dụng (bộ nhớ cache, cookie) cho localhost.


0

kiểm tra phần mở rộng tập tin cấu hình nginx của bạn là * .conf.
ví dụ: /etc/nginx/conf.d/myfoo.conf

Tôi đã gặp tình huống tương tự. Sau khi tôi đổi tên tập tin cấu hình của tôi từ myfoo thành myfoo.conf, nó đã được sửa. Đừng quên khởi động lại nginx sau khi đổi tên nó.


0

Đầu tiên bạn phải Remove cachevào trình duyệt của mình

Sau đó mở terminal và chạy lệnh sau:

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

Sau đó thêm mã sau vào defaulttệp:

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;
    }
}

Nếu có sự không phù hợp, chỉ cần sửa và khởi động lại Nginx từ thiết bị đầu cuối bằng lệnh sau

sudo systemctl khởi động lại nginx

Sau đó vào trình duyệt và thưởng thức ...


0

Đối với tôi, đó là dòng: fastcgi_pass unix: /var/run/php5-fpm.sock;

mà phải là: fastcgi_pass unix: /run/php5-fpm.sock;


0

Tôi chuẩn bị tinh thần để cố gắng khắc phục điều này, đối với tôi, vấn đề là Cloudflare đã lưu trữ tệp php và khiến tôi tải xuống.

Cách khắc phục đối với tôi là xóa bộ nhớ cache trên Cloudflare.


có lẽ bạn muốn cho chúng tôi biết làm thế nào?
Thorsten Staerk

0

Tôi đã gặp vấn đề tương tự, giải quyết nó là khối máy chủ này cũng có khối này trên các khối vị trí khác nếu bạn không tải các vấn đề. Mà tôi đã thêm vào tập tin conf có sẵn trang web của tôi.

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

Vì vậy, đây là những gì cuối cùng đã làm việc trong trường hợp của tôi như viết lại các quy tắc trong đó thủ phạm
tôi đã thay đổi các quy tắc viết lại nginx như sau ..

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

trở thành ...

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

Rõ ràng không có từ khóa cuối cùng , yêu cầu đã không được khởi động lại, vì vậy nó không bao giờ đạt được .phpphân khúc vị trí và được hiểu đơn giản là tải xuống -


0

để ghi lại, tôi thấy rằng php-fpm của tôi không chạy và tôi đã sửa nó bằng service php7.2-fpm stop


0

Một điều nữa cần kiểm tra: nếu bạn đã thiết lập quyền truy cập HTTPS trước khi thiết lập PHP - Tôi đã sử dụng certbot - bạn sẽ cần thực hiện các thay đổi trong / etc / nginx / site-Available / default hai lần vì sẽ có hai khối máy chủ (một nghe trên cổng 80 và một nghe trên cổng 443).

(Tôi đã thiết lập máy chủ này chủ yếu cho email và không sử dụng PHP khi tôi cài đặt nginx lần đầu tiên như một cách để chạy certbot dễ dàng hơn.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.