nginx खाली PHP पेज दिखा रहा है


Answers

बदलने के

include fastcgi_params;

साथ में

include fastcgi.conf;

और nginx.conf में fastcgi_param SCRIPT_FILENAME ... को हटा दें

Question

मैंने php5-fpm के साथ एक nginx सर्वर सेटअप किया है। जब मैं साइट को लोड करने का प्रयास करता हूं तो मुझे कोई रिक्त पृष्ठ नहीं मिलता है जिसमें कोई त्रुटि नहीं होती है। एचटीएमएल पेज ठीक से परोसा जाता है लेकिन PHP नहीं। मैंने php.ini में display_errors को चालू करने की कोशिश की लेकिन कोई भाग्य नहीं। php5-fpm.log किसी भी त्रुटि का उत्पादन नहीं कर रहा है और न ही nginx है।

nginx.conf

server {
    listen 80;
    root /home/mike/www/606club;
    index index.php index.html;
    server_name mikeglaz.com www.mikeglaz.com;
    error_log /var/log/nginx/error.log;
    location ~ \.php$ {
            #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;
    }
}

संपादित करें

यहाँ मेरा nginx त्रुटि लॉग है:

2013/03/15 03:52:55 [error] 1020#0: *55 open() "/home/mike/www/606club/robots.txt" failed (2: No such file or directory), client: 199.30.20.40, server: mikeglaz.com, request: "GET /robots.txt HTTP/1.1", host: "mikeglaz.com"



यह मेरी समस्या हल हो गया है

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include snippets/fastcgi-php.conf;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
}



मैंने एक छोटा सी प्रोग्राम लिखा है जो nginx से fastCGI एप्लिकेशन में पारित पर्यावरण चर लौटाता है।

#include <stdlib.h>
#include <fcgi_stdio.h>
extern char **environ;

int main(int argc, char **argv) {
    char *envvar;
    int i;

    int count = 0;
    while(FCGI_Accept() >= 0) {
        printf("Content-type: text/html\n\n"
               "<html><head><title>FastCGI Call Debug Tool</title></head>\n"
               "<body><h1>FastCGI Call Debugging Tool</h1>\n"
               "<p>Request number %d running on host <i>%s</i></p>\n"
               "<h2>Environment Variables</h2><p>\n",
              ++count, getenv("SERVER_NAME"));
        i = 0;
        envvar = environ[i];
        while (envvar != NULL) {
                printf("%s<br/>",envvar);
                envvar = environ[++i];
        }
        printf("</p></body></html>\n");
    }
    return 0;
}

इसे एक फ़ाइल में सहेजें, उदाहरण के लिए fcgi_debug.c

इसे संकलित करने के लिए, पहले gcc और libfcgi-dev इंस्टॉल करें, फिर चलाएं:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

इसे चलाने के लिए, spawn-fcgi इंस्टॉल करें, फिर चलाएं:

spawn-fcgi -p 3000 -f /path/to/fcgi_debug

फिर, डीबग प्रोग्राम को इंगित करने के लिए अपनी nginx fcgi कॉन्फ़िगरेशन बदलें:

fastcgi_pass  127.0.0.1:3000;

Nginx को पुनरारंभ करें, पृष्ठ को रीफ्रेश करें, और आपको डीबग करने के लिए अपने ब्राउज़र में दिखाई देने वाले सभी पैरामीटर दिखाना चाहिए! :-)




उपर्युक्त उत्तरों में से कोई भी मेरे लिए काम नहीं करता - PHP MySqli पर निर्भर पृष्ठों को छोड़कर सब कुछ ठीक से प्रस्तुत कर रहा था, जिसके लिए यह 200 प्रतिक्रिया कोड के साथ एक खाली पृष्ठ भेज रहा था और कोई त्रुटि नहीं फेंक रहा था। जैसा कि मैं ओएस एक्स पर हूं, फिक्स बस था

sudo port install php56-mysql

इसके बाद PHP-FPM और nginx को पुनरारंभ करें।

मैं एक पुराने अपाचे / PHP सेटअप से nginx में माइग्रेट कर रहा था, और php-mysql और php-fpm लिए ड्राइवर में संस्करण विसंगति को नोटिस करने में विफल रहा।




कई उपयोगकर्ता इस धागे में गिरते हैं कि nginx + php5-fpm का उपयोग करते समय रिक्त पृष्ठों को प्रदर्शित करने के लिए समाधान ढूंढने की उम्मीद है, मैं उनमें से एक हूं। यहां कई जवाब पढ़ने के बाद मैंने अपनी खुद की जांच के बाद क्या किया है, यह एक पुनरावृत्ति है:

1) ओपन /etc/php5/fpm/pool.d/www.conf खोलें और पैरामीटर location के मान की जांच करें।

location = /var/run/php5-fpm.sock

2) पैरामीटर location आपके nginx.conf फ़ाइल में fastcgi_pass पैरामीटर से मेल fastcgi_pass चाहिए।

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

3) फ़ाइल वास्तव में मौजूद है जांचें:

$ file /var/run/php5-fpm.sock
/var/run/php5-fpm.sock: socket

4) यदि यह अस्तित्व में नहीं है तो इसका मतलब है कि php5-fpm नहीं चल रहा है, इसलिए आपको इसे पुनरारंभ करना होगा:

$ sudo /etc/init.d/php5-fpm restart
[ ok ] Restarting php5-fpm (via systemctl): php5-fpm.service.


location अनुभाग के संबंध में:

location ~ \.php$ {
    include fastcgi_params;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
}

फ़ाइल को fastcgi_params स्थान /etc/nginx/ पर मौजूद है:

$ file /etc/nginx/fastcgi_params 
/etc/nginx/fastcgi_params: ASCII text

आम तौर पर इस फ़ाइल में php5-fpm द्वारा आवश्यक चर परिभाषाओं की एक सूची होती है:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
...
fastcgi_param  REDIRECT_STATUS    200;

nginx में दो संभावित पैरामीटर फ़ाइलें शामिल हैं: fastcgi_params और fastcgi.conf । दोनों के बीच अंतर परिवर्तनीय SCRIPT_FILENAME की परिभाषा है:

$ diff fastcgi_params fastcgi.conf 
1a2
> fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

एक लंबी कहानी कम करने के लिए, fastcgi.conf हमेशा काम करना चाहिए। अगर किसी कारण से आप fastcgi_params का उपयोग कर रहे हैं, तो आपको SCRIPT_FILENAME को परिभाषित करना चाहिए:

location ~ \.php$ {
    include fastcgi_params;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
}

अब nginx विन्यास पुनः लोड करें:

$ sudo nginx -s reload

और एक php फ़ाइल सही ढंग से प्रदर्शित किया गया है की जांच करें। उदाहरण के लिए:

/var/www/html/test.php

<pre><?php var_export($_SERVER)?></pre>

जहां दस्तावेज़ /var/www/html दस्तावेज़ रूट का पथ है।




इस समस्या का कारण यह है कि nginx में fastcgi कॉन्फ़िगरेशन आवश्यकतानुसार और स्थान या प्रसंस्करण के रूप में कार्य नहीं करता है, वे HTML डेटा के रूप में प्रतिक्रिया देते हैं। इस समस्या से बचने के लिए दो संभावित तरीके हैं जिनमें आप अपने nginx को कॉन्फ़िगर कर सकते हैं।

  1. विधि 1:

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # With php5-fpm:
                fastcgi_pass unix:/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
    
  2. विधि 2:

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include snippets/fastcgi-php.conf;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
    }
    

दोनों विधियां ठीक तरह से काम करेंगी, आप आगे बढ़ सकते हैं और इनमें से किसी एक को ले सकते हैं। वे लगभग एक ही ऑपरेशन को बहुत कम अंतर के साथ करते हैं।




इसे /etc/nginx/conf.d/default.conf में जोड़ें:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;



Links



Tags

nginx   php php