前文我们聊了 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
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 变量对应的配置指令文件; 对于缓存, 两者没有什么区别;
来源: https://www.cnblogs.com/qiuhom-1874/p/12430543.html