Nginx从不同的服务器提供php文件

时间:2017-06-22 18:30:08

标签: php nginx

我正在尝试配置nginx以从其他服务器提供PHP。

这些文件可以位于另一台服务器上/ sample下的目录中

快速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来提供来自同一服务器的静态文件

4 个答案:

答案 0 :(得分:3)

您应该不使用proxy_*指令。只有在远程服务器呈现页面时才会使用Nginx作为代理(并且您将使用HTTP协议请求它)。

您希望代理的是 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的评论中所述,您不应该使用if测试文档根目录中与PHP脚本名称匹配的本地文件确实存在。 php文件不在此服务器上。所以删除这个文件。 如果您要应用某些安全检查,稍后您可以将非常通用的位置[^/]\.php(/|$)更改为更具体的位置,例如location=/index\.php或其他一些变体。

答案 1 :(得分: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;
    }
}

您需要做的就是将{STATIC-FILES-LOCATION}替换为Nginx服务器上静态文件的位置,将{PHP-FPM-SERVER}替换为PHP-FPM服务器的IP。

这样,您将从Nginx服务器静态地为所有文件提供 PHP扩展,并且将使用PHP-FPM服务器解释所有PHP文件。

以下是您尝试实现的目标版本的工作示例 - 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文件。

希望这会有所帮助:)

答案 2 :(得分: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;
}

您需要将/path/to/site/root替换为PHP-FPM服务器上的实际路径。例如,如果请求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来提供来自同一服务器的静态文件

如果我理解正确,并且您想要从服务器提供静态文件,Nginx正在处理,那么您可以在Nginx配置中添加另一个location

答案 3 :(得分: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传递代理