2017-06-22 109 views
5

我想配置nginx從另一臺服務器的PHP服務。Nginx的服務從另一臺服務器的PHP文件

的文件可以在/樣品所在的目錄內

快速CGI在端口9000上運行的其他服務器

這裏的其他服務器上的是我已經盡力了,這是不以工作此時此刻。

location ~ [^/]\.php(/|$) { 
       proxy_pass  http://192.168.x.xx; 
       proxy_redirect http://192.168.x.xx /sample; 
       fastcgi_split_path_info ^(.+?\.php)(/.*)$; 
       if (!-f $document_root$fastcgi_script_name) 
       { 
         return 404; 
       } 
       # Mitigate https://httpoxy.org/ vulnerabilities 
       fastcgi_param HTTP_PROXY ""; 
       fastcgi_read_timeout 150; 
       fastcgi_buffers 4 256k; 
       fastcgi_buffer_size 128k; 
       fastcgi_busy_buffers_size 256k; 
       fastcgi_pass 127.0.0.1:9000; 
       fastcgi_index index.php; 
       include fastcgi_params; 
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     } 

我還需要配置nginx的從同一服務器

+0

只是代理通你所說的同一臺服務器的意思是另一臺服務器訪問靜態文件嗎?與上述配置文件中的其他服務器或服務器相同的服務器? –

+0

另一個可以從一個nginx訪問的服務器正在運行 – Anon

+0

您應該在另一臺服務器上運行Web服務器(例如nginx或Apache),並且只需從該服務器反向代理。 –

回答

2

提供靜態文件,您應該不能使用proxy_*指令。只有當遠程服務器已經呈現頁面時(使用HTTP協議請求它),才能使用Nginx作爲代理。

這裏要代理的事情是一個FastCGI的服務器,而不是一個HTTP服務器。

所以關鍵是:

fastcgi_pass 127.0.0.1:9000; 

在哪裏你現在說你想達到IP 127.0.0.1端口900,這似乎是相當錯誤在FastCGI的服務器。

使用,而不是:

fastcgi_pass 192.168.x.xx:9000; 

,並刪除proxy_*東西。

編輯:另外,如@Bart的註釋中所述,如果測試文檔根中的本地文件與php腳本名稱匹配,則不應該使用它。 php文件不在此服務器上。所以刪除這個文件。 如果你想申請一些安全檢查,你稍後可以將你的非常通用的位置[^/]\.php(/|$)更改爲更具體的內容,如location=/index\.php或其他一些變體。

+0

我收到了來自nginx的404響應。該文件沒有被瀏覽器提供。 – Anon

+2

問題配置中的'if'語句在這裏沒有意義,並可能觸發您收到的響應。 – Bart

2

您不必使用proxy_指令,因爲它們使用HTTP協議,但在這種情況下使用FastCGI協議。另外,正如評論中所述,不需要if聲明,因爲Nginx服務器無法確定遠程服務器上的文件是否存在。

你可以試試這個配置:

location ~ [^/]\.php(/|$) { 
    fastcgi_split_path_info ^(.+?\.php)(/.*)$; 
    # Mitigate https://httpoxy.org/ vulnerabilities 
    fastcgi_param HTTP_PROXY ""; 
    fastcgi_read_timeout 150; 
    fastcgi_buffers 4 256k; 
    fastcgi_buffer_size 128k; 
    fastcgi_busy_buffers_size 256k; 
    fastcgi_pass 192.168.x.xx:9000; #not 127.0.0.1, because we must send request to remote PHP-FPM server 
    fastcgi_index index.php; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME /path/to/site/root$fastcgi_script_name; 
} 

你需要用PHP-FPM服務器上的實際路徑替換/path/to/site/root。例如,如果請求http://example.com/some/file.php必須由/var/www/some/file.php進行處理,然後將其設置是這樣的:

fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; 

此外,爲了使PHP-FPM服務器能夠接收來自外部的請求,編輯您的FPM池配置(在Debian它通常位於/etc/php5/fpm/pool.d/www.conf,在CentOS - /etc/php-fpm.d/www.conf):

更換

listen = 127.0.0.1:9000 

有:

listen = 9000 

或:

listen = 192.168.x.xx:9000 # FPM server IP 

也許你還需要編輯allowed_clients指令:

listen.allowed_clients = 127.0.0.1,192.168.y.yy # Nginx server IP 

我還需要配置nginx的從同一個服務器提供靜態文件

如果我理解正確,而且你想服務stati c文件,Nginx正在開發,那麼你可以在你的Nginx配置中添加另一個location

3

以下配置不正是你所需要的:

server { 
    listen 80; 
    index index.php index.html; 
    server_name localhost; 
    error_log /var/log/nginx/error.log; 
    access_log /var/log/nginx/access.log; 
    root {STATIC-FILES-LOCATION}; 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass {PHP-FPM-SERVER}:9000; 
     fastcgi_index index.php; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param PATH_INFO $fastcgi_path_info; 
    } 
} 

所有你所要做的就是用你的靜態文件的Nginx服務器上的位置和{PHP-FPM-SERVER}與PHP-FPM服務器的IP取代{STATIC-FILES-LOCATION}

這樣你將服務於所有文件而不是這個PHP擴展是從Nginx服務器靜態的,所有的PHP文件都將被PHP-FPM服務器解釋。

下面是您試圖實現的dockerised版本的工作示例 - https://github.com/mikechernev/dockerised-php/。它提供來自Nginx的靜態文件,並通過PHP-FPM容器解釋PHP文件。在附帶的博客文章(http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/)中,我詳細介紹了Nginx和PHP-FPM之間的整個連接。

編輯:記住一件重要的事情是Nginx和PHP-FPM服務器中的路徑應該匹配。因此,您必須將PHP文件放在PHP-FPM服務器上的相同目錄中,與Nginx上的靜態文件({STATIC-FILES-LOCATION})一樣。

一個例子就是讓Nginx上的/var/www/在PHP-FPM上持有你的靜態文件和/var/www來存放你的php文件。

希望這有助於:)

0

沒有必要給/樣本路徑

location ~ [^/]\.php(/|$) { 
fastcgi_split_path_info ^(.+?\.php)(/.*)$; 
if (!-f $document_root$fastcgi_script_name) { 
    return 404; 
} 

# Mitigate https://httpoxy.org/ vulnerabilities 
fastcgi_param HTTP_PROXY ""; 

fastcgi_pass IP:9000; 
fastcgi_index index.php; 
include fastcgi_params; 
} 

對於來自nginx的服務器,您需要使用try_files爲靜態文件。

location/{ 
    try_files $uri $uri/ /index.php$is_args$args; 
} 

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

    // other CGI parameters 
} 

確保您知道共同的pitfalls

如果你想從你需要有運行網絡服務器和從Nginx的

相關問題