理解nginx反向代理

目录

      • 目录
        • CGI & fastCGI
          • CGI
          • php-cgi
          • fastCGI
          • php-fmp
        • Nginx
          • 什么是nginx
            • 反向代理和正向代理
          • nginx配置实现反向代理
          • 访问资源背后的过程
        • 跨域问题
          • 什么是跨域
          • 为什么会存在跨域问题
          • 配置nginx解决跨域问题

CGI & fastCGI

CGI

是一个协议
- 全称:commom gateway interface
- 当服务器遇到动态请求时,转发给相应的解析器处理,服务器传递给解析器的数据格式就由CGI规定
- 弊端:每次处理一个动态请求都要初始化环境,新起一个进程

理解nginx反向代理_第1张图片

php-cgi

是一个程序,用php实现了CGI协议


fastCGI

是一个优化CGI的协议。支持分布式运行,可以一直运行。
具体做法:
- 接受到请求,解析配置文件(例如php.ini),初始化运行环境
- 启动一个master和多个worker,master将请求分配给worker,继续接收下一个请求

理解nginx反向代理_第2张图片

php-fmp

是一个程序,用php实现了fastCGI协议


Nginx

什么是nginx
  • nginx是实现转发和反向代理的web服务器
反向代理和正向代理
  • 反向代理:隐藏真实的服务器端
    • 类似场景:拨打总机号,然后一层层转接到分机
    • 真实场景:访问淘宝—》反向代理服务器—》转发到真实的服务器—》返回资源给反向代理服务器—》返回给客户端
  • 正向代理:隐藏真实的客户端
    • 类似场景:A问B借钱,B不肯,A拜托B的挚友C帮忙,C问B借到了钱,然后把钱给了A,而B并不知道实际是A借的钱
    • 真实场景:客户端请求访问 facebook.com,无法访问到资源,这时借助代理,代理请求facebook的资源,然后发送给客户端,facebook.com并不知道真正的客户端是谁
nginx配置实现反向代理
  • nginx不能解析php,所以需要通过反向代理,转发给php解释器对php的解析
  • 配置nginx,实现反向代理,打开nginx的config文件,server配置如下
 server {
#监听端口
        listen       80;
#访问域名
        server_name  localhost;
#访问根路径
        root         E:\work\git\projet;
#首页文件,有多个就按照顺序匹配
        index        index.php index.html;
#匹配所有请求   
        location /{
#url重写
            rewrite . /index.php;
        }
#匹配以.php结尾的请求       
        location ~ .php$ {
#使用fastCGI实现反向代理,指定FastCGI服务器监听端口和地址
            fastcgi_pass   127.0.0.1:9000;
#设置fastcgi默认使用脚本,当SCRIPT_FILENAME 没有命中脚本时,使用的就是这个
            fastcgi_index  index.php;
#$document_root$(网站根目录即root值)fastcgi_script_namez(php文件)是脚本文件请求路径
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
#调用fastCGI这个接口
            include        fastcgi_params;
        }
    }
  • 其中location配置的优先级
    1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
    2. ^~类型表达式,以···开头,一旦匹配成功,则不再查找其他匹配项。
    3. 正则表达式类型(~区分大小写 ~*不区分大小写)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
    4. 常规字符串匹配类型。按前缀匹配。
访问资源背后的过程
  1. 例如访问本地部署的项目,浏览器输入localhost+端口号
  2. 看到其中一条Request URL是:
http://localhost:8989/project/server/index.php
  • 用户访问的资源是动态的,nginx作为反向代理,将请求发送给php解释器
    • 因为以php结尾的请求,说明访问的是动态数据,nginx将请求简单处理后交给将定位到配置文件的location ~ .php$
    • 服务器到root路径下找请求文件,没有找到就默认是fastcgi_index指向的
    • 调用fastCGI接口,通过fastcgi_pass找到php-cgi或者php-fmp程序进行解析
  • php解释器将结果返回给nginx
  • nginx将结果返回给浏览器

跨域问题

什么是跨域
  • 域名不同
  • 端口不同
  • 协议不同
//例如
http://vip.com请求http://passport.vip.com的资源
为什么会存在跨域问题

浏览器核心的基本安全功能构建在同源策略上,要求域名、协议端口都相同

配置nginx解决跨域问题

与跨域相关的HTTP请求头部

  • Access-Control-Allow-Origin:允许来自某个域的跨域请求(必选)
    • 可以是具体的origin值
    • 也可以是*代表允许所有域的请求
  • Access-Control-Allow-Credentials
    • 跨域时需要携带cookie,设置为true
    • 不需要携带cookie,不设置
  • Access-Control-Expose-Headers
    • 想要获得更多头部信息时设置该值

例如以下配置,所有请求头都加上Access-Control-Allow-Origin *,并且设置携带cookie

server {
        listen       80;
        server_name  localhost;
        root         E:\work\git\eoLinker\backend_resource;
        index        index.php;


        location /{
        #解决跨域
            add_header Access-Control-Allow-Origin *;
            rewrite . /index.php;
        }

        location ~ .php$ {
        #解决跨域
            add_header 'Access-Control-Allow-Credentials' "true";
            #add_header 'Access-Control-Allow-Origin' "$http_origin";
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

你可能感兴趣的:(nginx)