我正在尝试配置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来提供来自同一服务器的静态文件
答案 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传递代理