我正在尝试配置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;
}
Run Code Online (Sandbox Code Playgroud)
我还需要配置nginx来提供来自同一服务器的静态文件
以下配置完全符合您的需要:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
你所要做的就是用{STATIC-FILES-LOCATION}你的静态文件在 Nginx 服务器上的位置和{PHP-FPM-SERVER}PHP-FPM 服务器的 IP替换。
通过这种方式,您将从Nginx 服务器静态提供所有没有PHP 扩展名的文件,并且所有 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})。
一个例子是/var/www/在 Nginx 上保存你的静态文件,/var/www在 PHP-FPM 上保存你的 php 文件。
希望这可以帮助 :)
您不必使用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;
}
Run Code Online (Sandbox Code Playgroud)
您需要替换/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;
Run Code Online (Sandbox Code Playgroud)
另外,为了使 PHP-FPM 服务器能够接收来自外部的请求,请编辑您的 FPM 池配置(在 Debian 上,它通常位于/etc/php5/fpm/pool.d/www.conf,在 Centos 上 - /etc/php-fpm.d/www.conf):
代替
listen = 127.0.0.1:9000
Run Code Online (Sandbox Code Playgroud)
和:
listen = 9000
Run Code Online (Sandbox Code Playgroud)
或者:
listen = 192.168.x.xx:9000 # FPM server IP
Run Code Online (Sandbox Code Playgroud)
也许您还需要编辑allowed_clients指令:
listen.allowed_clients = 127.0.0.1,192.168.y.yy # Nginx server IP
Run Code Online (Sandbox Code Playgroud)
我还需要配置 nginx 以提供来自同一服务器的静态文件
如果我理解正确,并且您想从 Nginx 正在运行的服务器提供静态文件,那么您只需location在 Nginx 配置中添加另一个即可。
您不应该使用proxy_*指令。仅当远程服务器呈现页面(并且您将使用 HTTP 协议请求它)时,才会使用 Nginx 作为代理。
这里你想要代理的是fastcgi 服务器,而不是 HTTP 服务器。
所以关键是:
fastcgi_pass 127.0.0.1:9000;
Run Code Online (Sandbox Code Playgroud)
您当前说您想要访问 IP 127.0.0.1 端口 900 上的 fastcgi 服务器,这似乎是完全错误的。
改用:
fastcgi_pass 192.168.x.xx:9000;
Run Code Online (Sandbox Code Playgroud)
并删除proxy_*东西。
编辑:另外,正如 @Bart 的评论中所述,您不应该使用 if 测试文档根目录中与 php 脚本名称匹配的本地文件是否存在。php 文件不在该服务器上。所以删除这个文件。如果您想应用一些安全检查,稍后您可以将非常通用的位置更改[^/]\.php(/|$)为更具体的位置,例如location=/index\.php或其他一些变体。
| 归档时间: |
|
| 查看次数: |
6466 次 |
| 最近记录: |