nginx技巧:使用fastcgi_pass_request_body进行体传递
Nginx是一个高性能的开源Web 服务器 软件,它可以作为反向代理服务器、负载均衡器和HTTP缓存等多种用途。在使用Nginx时,我们经常需要将请求体传递给后端的FastCGI服务器。本文将介绍如何使用Nginx的fastcgi_pass_request_body指令来实现这一功能。
什么是fastcgi_pass_request_body指令
fastcgi_pass_request_body是Nginx的一个指令,用于控制是否将请求体传递给FastCGI服务器。默认情况下,Nginx不会将请求体传递给FastCGI服务器,而是只传递请求头部信息。如果需要将请求体传递给FastCGI服务器,可以使用fastcgi_pass_request_body指令来开启这个功能。
如何使用fastcgi_pass_request_body指令

要使用fastcgi_pass_request_body指令,首先需要在Nginx的配置文件中找到对应的location块。在该location块中,可以使用fastcgi_pass_request_body指令来控制是否传递请求体。
以下是一个示例配置:
location /api {fastcgi_pass_request_body on;fastcgi_pass unix:/var/run/php-fpm.sock;include fastcgi_params;}
在上述配置中,我们将fastcgi_pass_request_body设置为on,表示将请求体传递给FastCGI服务器。然后,使用fastcgi_pass指令指定FastCGI服务器的地址,这里使用了Unix域套接字。最后,使用include指令引入fastcgi_params文件,该文件包含了一些常用的FastCGI参数。
示例代码
下面是一个使用fastcgi_pass_request_body指令的示例代码:
location /api {fastcgi_pass_request_body on;fastcgi_pass unix:/var/run/php-fpm.sock;include fastcgi_params;fastcgi_param REQUEST_METHOD $request_method;fastcgi_param CONTENT_TYPE $content_type;fastcgi_param CONTENT_LENGTH $content_length;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param SCRIPT_NAME $fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param QUERY_STRING $query_string;fastcgi_param REQUEST_URI $request_uri;fastcgi_param DOCUMENT_URI $document_uri;fastcgi_param DOCUMENT_ROOT $document_root;fastcgi_param SERVER_PROTOCOL $server_protocol;fastcgi_param REMOTE_ADDR $remote_addr;fastcgi_param REMOTE_PORT $remote_port;fastcgi_param SERVER_ADDR $server_addr;fastcgi_param SERVER_PORT $server_port;fastcgi_param SERVER_NAME $server_name;}
在上述示例代码中,我们除了使用fastcgi_pass_request_body指令开启请求体传递功能外,还设置了一些常用的FastCGI参数。这些参数可以根据实际需求进行调整。
总结
通过使用Nginx的fastcgi_pass_request_body指令,我们可以将请求体传递给后端的FastCGI服务器。这对于需要处理请求体的应用程序非常有用,例如处理文件上传、处理POST请求等。使用fastcgi_pass_request_body指令可以提高应用程序的性能和灵活性。
香港服务器首选树叶云
树叶云是一家专业的云计算公司,提供香港服务器、美国服务器和云服务器等多种产品。如果您需要稳定可靠的香港服务器,树叶云是您的首选。请访问了解更多信息。
再打开网页时会出现这个是什么意思啊?
这是“网关超时” 解决Nginx 504 Gateway Time-out的一些方法 在CentOS下配置lnmp组合基本上用的都是同样的配置文件,一直都没出现过问题,可最近在一个vps上安装同样的环境之后,网站在线10多人就出 现了打开速度非常缓慢的情况,有好几次都是直接达到了nginx中设置的脚本最大超时时间300秒,结果导致nginx往客户端浏览器发送了一个504 Gateway Time-out的错误代码,分析了之后改动了几处配置文件,终于避免了该情况的出现。 从错误代码基本可以确定跟nginx本身无关,主要是提交给php-fpm的请求未能正确反馈而导致,一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客户端浏览器,但 我这个vps目前跑的是个纯php应用内容,实际上用户所有的请求都是php请求,有的耗费时间比较久,php-cgi进程就一直都被用满,而php- fpm本身的配置文件只打开了10组php-cgi进程,这样的话在线用户稍微多的话就会导致请求无法被正常处理而出错。 大概分析出了原 因,下面做就比较容易了,首先是更改php-fpm的几处配置: 把max_children由之前的10改为现在的30,这样就可以保证 有充足的php-cgi进程可以被使用; 把request_terminate_timeout由之前的0s改为60s,这样php-cgi进程 处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。 接着再更改nginx的几个配置项,减少FastCGI的请求次 数,尽量维持buffers不变: fastcgi_buffers由 4 64k 改为 2 256k; fastcgi_buffer_size 由 64k 改为 128K; fastcgi_busy_buffers_size 由 128K 改为 256K; fastcgi_temp_file_write_size 由 128K 改为 256K。 好了,重新加载php-fpm和nginx的配置,再次测试,至今两周时间内没有再出现504 Gateway Time-out的情况,算是达到效果了。 另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。 apache-like 从更改完毕到现在的测试表明上述方式的效果还是很明显的,并没有发现一次Nginx502 bad gateway或504 Gateway Time-out错误。 当然,如果你的VPS或者服务器的性能足够好可以根据具体情况不必做无谓的改动。 本文来自CSDN博客,转载请标明出处:
Nginx环境下将woRDPress文章分页URL静态化的方法
* last 相当于Apache里的[L]标记,表示完成rewrite * break 终止匹配, 不再匹配后面的规则 * redirect 返回302临时重定向 地址栏会显示跳转后的地址 * permanent 返回301永久重定向 地址栏会显示跳转后的地址一些可用的全局变量有,可以用做条件判断(待补全)
$args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie $limit_rate $request_body_file $request_method $remote_addr $remote_port $remote_user $request_filename $request_uri $query_string $scheme $server_protocol $server_addr $server_name $server_port $uri结合QeePHP的例子
if (!-d $request_filename) { rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /?namespace=user&controller=$1&action=$2&$3 last; rewrite ^/([a-z-A-Z]+)/?$ /?namespace=user&controller=$1 last; break;多目录转成参数/sort/2 => /?act=sort&name=abc&id=2
if ($host ~* (.*)\\) { Set $sub_name $1; rewrite ^/sort\/(\d+)\/?$ /?act=sort&cid=$sub_name&id=$1 last; }目录对换//xxxx -> /xxxx?id=
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /nginx-ie/$1 break; }目录自动加“/”
if (-d $request_filename){ rewrite ^/(.*)([^/])$ http:// $host/$1$2/ permanent; }
建议可以下载配置好的NGINX测试
504 Gateway Time-out 怎么解决?
具体解决办法就是修改配置文件: 1、把max_children由之前的10改为现在的30,这样就可以保证 有充足的php-cgi进程可以被使用;把request_terminate_timeout由之前的0s改为60s,这样php-cgi进程 处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。 2、接着再更改nginx的几个配置项,减少FastCGI的请求次 数,尽量维持buffers不变:fastcgi_buffers由 4 64k 改为 2 256k;fastcgi_buffer_size 由 64k 改为 128K;fastcgi_busy_buffers_size 由 128K 改为 256K;fastcgi_temp_file_write_size 由 128K 改为 256K。
发表评论