Nginx之反向代理配置二

  前文我们聊了Nginx的防盗链、反向代理以及开启nginx代理缓存,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12417130.html;今天我们继续说nginx的反向代理,上一篇主要就说了下nginx反向代理http协议的使用,被代理RUL包含和不包含RUI的处理逻辑;我们可以把这种前后端都用同样的协议理解为同构代理,就是说前端用户访问nginx是http或https协议,代理服务器访问后端的真正提供服务的服务器也是基于http协议,这种前后端都是使用同一种协议,我们就说这是同构;同理有同构就有异构,异构就是前后端使用的协议不同,比如前端用户使用http或https协议,代理和后端服务器使用fastcgi协议,这种就叫异构;互联网上绝大部分网站都不是纯html静态网页,很多网站都是有自己的应用服务器,比如,我们用户访问的数据是需要一段脚本,或者某一程序执行后的数据,那么我们就把后面需要执行脚本的服务器叫应用服务器;nginx作为web服务器它虽然有很多功能,但是它自己没有执行某些脚本的能力比如php脚本,通俗的讲,nginx只可以处理静态文本,不能自己执行php脚本(需借助其他应用服务器),它和httpd类似,httpd还可以动态的加载php模块,让其拥有执行php脚本的能力,nginx没有,为了实现这样的功能,nginx就支持通过fastcgi协议向后端代理客户端请求一个自己不能处理的资源;当然类似的协议还有很多比如,scgi、uwsgi等等;像这种异构的架构上,它的原理是这样的,客户端请求某一脚本资源,比如,index.php这个文件,如果我们不把用户的请求代理到后端应用服务器上,客户端看到的数据是index.php里的脚本内容,这显然是不合情理的;那怎么办呢?通常情况我们需要在nginx服务器上配置,用户访问某某.php结尾的URL时,我们就让它干嘛干嘛,通过这种匹配用户的URL去做代理,把用户的请求代理到后端服务器,让后端应用服务器把脚本执行完,然后把执行后的数据返回给代理,再由代理响应给客户端;如果是后端应用服务器需要某些数据,需要到数据库里去拿数据,很可能应用服务器此时还会扮演客户端角色,通过某种协议去数据库拿数据;我们可以看到最终我们用户看到的网页里的内容,它来自很多服务器,所以说一个动态网站上由很多台服务器共同完成一个处理请求的结果,我们可以理解成,每个服务器处理自己擅长的事务,分工合作,最后把处理好的数据由代理响应给客户端;

  ngx_http_fastcgi_module:此模块实现了nginx允许将用户请求代理至fastcgi 服务器

    1、fastcgi_pass address:设置fastcgi服务器的地址,此地址可以是IP加端口的形式,也可以是域名或者UNIX域套接字路径;此选项可用于location 和if in location 配置段中

  示例

fastcgi_pass localhost:9000

  提示:以上配置意思是,通过fastcgi协议反代本机的9000端口上的服务响应;

fastcgi_pass Unix:/tmp/fastcgi.socket;

  提示:以上表示设置fastcgi地址是本机/tmp/fastcgi.socket文件;

  2、fastcgi_index name;设置fastcgi的默认主页资源名称;此指令可用于http、server、location配置段中

  3、fastcgi_param parameter value [if_not_empty]:设置一个参数,用于传递给后端fastcgi服务器,参数的值可以是文本,变量,或者二者的组合。

  示例

fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;

  提示:以上配置表示把SCRIPT_FILENAME等于/home/www/scripts/php$fastcgi_script_name传递给fastcgi服务器,$fastcgi_script_name表示用户请求的脚本名称;意思是告诉fastcgi服务器该把那个脚本执行了返回给客户端(这里的客户端通常指代理服务器)

fastcgi_param QUERY_STRING $query_string;

  提示:我们知道一个脚本传递不同的参数,执行的结果就会不同;以上配置表示把请求的脚本的参数通过QUERY_STRING变量保存,并传递给后端fastcgi服务器,让其运行某脚本时,把QUERY_STRING保存的值作为参数传递给脚本;当然我们向后端传递的东西很多,不便一一写出来,也不太可能一一写到配置文件中,在nginx的配置目录里有一个文件,专门存放nginx上的变量对应后端fastcgi服务器上的变量的一个配置文件fastcgi.conf  通常我们把这个配置文件用include指令来导入到我们需要定义nginx变量通过fastcgi变量传递给fastcgi服务器;

  示例

location ~* \.php$ {
	root           /usr/share/nginx/html;
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
	include        fastcgi_params;
}

  提示:以上配置表示匹配用户URI,如果用户URI是以.php结尾的,就通过fastcgi协议代理至本机的127.0.0.1:9000端口进行处理(执行),fastcgi服务器默认主页资源名叫index.php,并告诉fastcgi服务器到/usr/share/nginx/html/下去找用户请求的资源脚本,如果还有其他参数和指令要传递,就使用/etc/nginx/fastcgi_params中的定义来把nginx的变量保存的值传递给后端fastcgi服务器,以上是反代动态php网页的配置示例,有了以上配置 nginx就可以作为代理服务器响应客户端请求动态脚本php的能力了;

[root@www nginx]# vim /etc/nginx/conf.d/proxy.conf 
  


server {

        server_name www.test.com;

        proxy_cache proxy_cache;
#       proxy_cache_key $request_uri;
#       proxy_cache_methods GET HEAD;
        proxy_cache_valid 200 302 15m;
        proxy_cache_valid 404 1m;
#       proxy_cache_use_stale http_500 http_502;
        location  /en/docs/ {
                proxy_pass http://nginx.org;
        }
        location ~* /(.*).php$ {
                root /app/php_scripts;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /app/php_scripts$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }
}
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
"conf.d/proxy.conf" 23L,500C written
[root@www nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@www nginx]# mkdir /app/php_scripts -p
[root@www nginx]# cat >> /app/php_scripts/test.php 
<?php
        phpinfo();
?>
^C
[root@www nginx]# cat /app/php_scripts/test.php 
<?php
        phpinfo();
?>
[root@www nginx]# nginx -s reload
[root@www nginx]# 

  提示:在上面配置前需要先安装好php-fpm,安装好后需要更改/etc/php-fpm.d/www.conf里的user 和group,通常情况要看前端代理是用那个用户启动的,我们后端就用那个用户启动即可,我们前端代理商nginx,这里需要更改成nginx即可,这样修改后,保存配置,然后启动php-fpm,然后在本机就可以看到127.0.0.1:9000就处于监听状态了;以上配置表示用户请求.php结尾的资源都反代至127.0.01:9000进行处理;并且明确说明了后端fastcgi主页资源名称为index.php,后端应用服务器的根路径为/app/php_scripts;fastcgi_param  SCRIPT_FILENAME /app/php_scripts$fastcgi_script_name同nginx里的root alias指令的作用相同,指定用户访问的URI对应磁盘上的路径,相当于指定后端fastcgi服务器的工作目录吧;

  提示:可以看到我们访问test.php是能够被php-fpm服务器执行并返回执行后的结果;

  4、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];此指令同proxy_cache_path一样,作用定义fastcgi的代理缓存;其中levels表示定义缓存目录的级别,最多3级,每级最多2个字符;keys_zone=name:size表示k/v映射的内存空间的名称及大小;inactive=time表示非活动时长;max_size=size表示指定磁盘上用于缓存路径的存放缓存的空间上限;

  5、fastcgi_cache zone |off;调用指定的缓存空间来缓存数据;可用于http,server,location配置段中

  6、fastcgi_cache_key string;定义用作缓存项的key的字符串;

  7、fastcgi_cache_methods GET|HEAD|POST ……;定义那些请求方法使用缓存;默认是GET和HEAD

  8、fastcgi_cache_min_uses number;定义缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认为活动的缓存项,不被清理;

  9、fastcgi_cache_valid[code] tiem;设定不同的响应码各自缓存的时长;

  10、fastcgi_keep_conn on | off;:设置是否保持连接,默认情况下,FastCGI服务器将在发送响应后立即关闭连接。但是,当这个指令被设置为值on时,nginx将指示FastCGI服务器保持连接打开。

  示例

   提示:在定义缓存空间时,必须要在http配置段定义,以上表示定义一个fastcgi的缓存空间,其名称为php_cache,在内存中使用10m的空间,在物理磁盘上的路径为/cache/proxy/php-fpm/目录下,最大空间为2g;

   提示:以上配置表示使用fastcgi的缓存空间php_cache,缓存key为$request_uri,就是把用户请求的uri hash作为缓存路由,什么意思呢,就是nginx查找缓存是通过hash什么来查找缓存的,上面的配置就是定义nginx把用户请求的URI作为hash对象;对用户请求用的方法是GET 或HEAD方法时,使用缓存;缓存最小命中次数为3次,也就说在非活动时长内,该缓存项命中次数小于3次就会被认为该缓存是无效的,在下次检查缓存的有效性,就会被清理;对响应码是200 或302的资源缓存15分钟,对404响应码的资源缓存1分钟;开启和后端的fastcgi服务器的长连接;

  提示:可以看到我们访问test.php页面时,在我们定义的缓存空间里生成了缓存,但是我们访问了test.php这一个页面,为什么会缓存三项呢?其实我们可以打开浏览器的web开发者模式,查看它请求和响应的情况

   提示:可以看到我们访问test.php这个页面,其背后是3次请求,所以我们在缓存空间里看到有三条缓存项,其实缓存空间里的缓存项每一个缓存项就代表一个缓存资源,我们是可以通过cat命令查看缓存项里的内容的;如下

   提示:我们可以看到里面的缓存项纪录的信息,其中有一项KEY 就是我们指定的fastcgi_cache_key 说指定变量的值;我们查看缓存项里的内容很可能出现乱码,原因是缓存的内容有二进制,或者其他字符编码的内容;

  以上就是nginx作为反向代理服务器代理动态资源的介绍,总结一点,nginx代理动态资源和代理http资源的思想是类似的,只是使用的指令不一样;尤其对于缓存,两者的思想几乎完全一致,只是使用的模块和指令不同而已;对于动态资源我们除了要指定被代理的地址外,还需要指定被代理端资源路径,导入nginx变量与fastcgi变量对应的配置指令文件;对于缓存,两者没有什么区别;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件一、Nginx 简介1. 什么是Nginx  Nginx(“engine x”)是一个_nginx代理
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的过程中需,有时候需要对容器中的文件进行修改管理,如果不做文件映射的化,我们使用docker exec -it 容器ID/容器名 /bin/bash 才能进入nginx中的文件里面如图。架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将原本要直接发送到web服务器上的http请求发送到代理服务器中。A想要组C的房子,但是A并不认识C所以租不到,但是B认识C,A找B帮忙租到了C的房子。客户端代理服务器服务器。_docker nginx 配置
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时,通常情况下应该显示一个友好的错误页面,而不是仅仅显示一个简单的错误提示。在Nginx中,可以通过配置来实现404错误自动跳转到首页的功能。如果您的网站使用动态内容生成页面(如PHP或其他服务器端语言),则应相应地修改配置以适应您的网站架构。这样,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。为了使配置生效,需要重新加载Nginx配置。首先,需要打开Nginx的配置文件。现在,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。_nginx 404 重定向
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+mysql+wordpress 实战_docker wordpress mariadb
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以在任务管理器中查看到nginx的进程。重新启动下 直接访问8090端口 ok 访问成功。1 :查看80端口占用情况,pid的值为3960。3:在运行中输入regedit打开注册表编辑器。2: 通过以下命令查看3960所对应的服务名称。4:找到Start,右键修改将其制改为4。_nginx80端口无法访问
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx 被设计为能够处理大量并发连接而不显著增加系统负担。它采用异步事件驱动的架构,可以有效地处理高流量的 Web 请求。负载均衡:Nginx 支持负载均衡,可以将请求分发到多个后端服务器,以提高网站性能和可用性。反向代理:Nginx 可以充当反向代理,将客户端请求转发到后端服务器,隐藏后端服务器的真实 IP 地址,增加安全性和可扩展性。静态文件服务:Nginx 可以高效地提供静态文件(如 HTML、CSS、JavaScript、图像等)的服务,减轻应用服务器的负担。
文章浏览阅读976次。nginx作为常用的web代理服务器,某些场景下对于性能要求还是蛮高的,所以本片文章会基于操作系统调度以及网络通信两个角度来讨论一下Nginx性能的优化思路。我们的大学教程大部分讲述七层模型,实际上现代网络协议使用的都是四层模型,如下图,应用层报文经过四层的首部封装到对端。对端链路层拆开首部查看mac地址是自己在网上,拆开ip首部查看目的地址是不是自己,然后到达传输层应用层完成报文接收。文章是基于原有个人知识基础上,对旧知识进行巩固,以及新知识实践学习。
文章浏览阅读5.4k次,点赞9次,收藏15次。最后再说一种情况,就是后端处理了跨域,就不需要自己在处理了(这里吐槽下,某些后端工程师自己改服务端代码解决跨域,但是又不理解其中原理,网上随便找段代码黏贴,导致响应信息可能处理不完全,如method没添加全,headers没加到点上,自己用的那个可能复制过来的并不包含实际项目所用到的,没有添加options请求返回状态码等,导致Nginx再用通用的配置就会可能报以下异常)里面的就好了,因为这里如果是预检请求直接就ruturn了,请求不会再转发到59200服务,如果也删除了,就会报和情况1一样的错误。_nginx 允许跨域
文章浏览阅读2.5k次。项目配置了多个域名,如下,php 代码中有获取的值。当访问a.demo.com时,其获取的值是符合预期的。但是当访问b.demo.com时,其获取的值还是a.demo.com,导致代码中的判断出现错误。_nginxservername多个域名
文章浏览阅读1k次,点赞2次,收藏5次。采用YAML manifest的方式来安装ingress-nginx,用registry.lank8s.cn镜像库来替换 registry.k8s.io的库。_ingress-nginx安装
文章浏览阅读1.6k次,点赞2次,收藏2次。在windows平台编译nginx_windows 编译nginx
文章浏览阅读5.8k次,点赞2次,收藏18次。nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应。使用epoll and kqueue作为开发模型。_nginx
文章浏览阅读2k次。Linux启动(systemctl start nginx)nginx服务时出现:Failed to start nginx.service: Unit not found._为什么nginx的systemctl start nginx.service不能使用
文章浏览阅读1.3k次。重启之后,打开浏览器,输入http://localhost:8900/myBaidu,这时候就会自动的跳转到百度的页面。按照我们不同的需求修改nginx文件夹中的nginx-1.16.1conf里面的nginx.conf文件。启动nginx:打开nginx的文件夹,然后双击nginx.exe文件,启动nginx。打开之后假设我们需要跳转到百度则在配置文件nginx.conf中的下面加上。1、打开任务管理器关闭nginx的进程。端口在配置文件的(下图)进行查看nginx端口。_nginx 代理百度
文章浏览阅读5.7k次,点赞5次,收藏3次。nginx重定向问题解决(rewrite or internal redirection cycle)_rewrite or internal redirection cycle while internally redirecting to "/inde
文章浏览阅读1.3k次。请注意,上述命令假设 Nginx 已经在系统的 PATH 环境变量中配置。如果没有,请提供正确的 Nginx 安装路径,或者在命令中使用完整的路径来替换。将该命令与所有 Nginx 进程的 PID 一起使用,以终止所有正在运行的 Nginx 进程。此命令将启动一个新的 Nginx 进程来重新加载配置文件并重新启动服务器。使用以下命令来终止所有 Nginx 进程(使用上面的 PID 替换。的进程以及它们的 PID。打开命令提示符(CMD)。此命令将列出所有名为。选项来强制终止进程。_windows 怎么关闭nginx
文章浏览阅读2.7k次,点赞2次,收藏7次。包括 Netflix、GitHub 和 WordPress。Nginx 可以用作 Web 服务器、负载均衡器、反向代理和 HTTP 缓存等。_ubuntu安装nginx
文章浏览阅读915次。轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。_nginx 短链代理
文章浏览阅读1.1k次,点赞35次,收藏24次。流媒体方案之Nginx——实现物联网视频监控项目Nginx是什么Nginx在流媒体方案中的位置软硬件准备移植编译Nginx运行Ngnix测试流媒体方案浏览器播放_nginx-rtmp-module
文章浏览阅读1.9k次。nginx 配置 wss 协议转发 ws 服务器_nginx 配置wss