Nginx 通过反向代理在多个平台接入上游的客户信息

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:对添加分两个server模块是为了不影响平台本身实现的功能

感谢

  • 美滋滋的nginx
  • 百度上大佬写的blog
  • laravel
  • silber/page-cache

需要实现的功能

  • 在多个不同的平台(可能不在同一个服务器)接入同一个上游的客户信息
  • 客户相关页面实现静态页面

前提

  • 我使用的是 laravel 框架
  • 所有的客户信息都保存在上游网站 http://push.push.do 中,每个用户拥有一个唯一的标识(tag),用于识别客户,之后我所说的上游都是表示 http://push.push.do
  • 现在 http://pingtai.do 需要接入上游网站的客户信息,标识为 client 的客户在此平台的二级域名为 http://client.pingtai.do
  • http://pingtai.do 只使用了@和www两个解析
  • push.push.do 解析地址 127.0.0.1
  • pingtai.do 解析地址 127.0.0.2

分析

  1. 一开始的时候,我想用 linux 提供的软连接的方式来做,但是因为后来得知每个平台可能在不同的服务器上,veto~
  2. 然后开始尝试使用nginx的反向代理来实现

反向代理操作步骤

  1. 域名解析

pingtai.do 做泛域名解析,解析地址为127.0.0.2

  1. 基础的反向代理

添加 *.pingtai.do 的nginx配置,这里需要注意 www.pingtai.dopingtai.do 的配置文件不要去动他

分两个server模块是为了不影响平台本身实现的功能

server {
    listen 80;
    server_name pingtai.do www.pingtai.do;

    ...
}

server {
    listen 80;
    server_name ~^(.*?).pingtai.do$; #这里使用了正则的捕获,我需要请求地址中的客户唯一标识来识别客户

    ...

    location / {
        proxy_pass http://push.push.do; #反向代理到拥有全部客户信息的上游地址

        proxy_redirect             off; 
        proxy_set_header           Host $proxy_host; 
        proxy_set_header           X-Real-IP $remote_addr; 
        proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header           RequestUrl $host; #将请求地址发送给上游
        proxy_set_header           Domain $1; #将客户唯一标识发送给上游
        client_max_body_size       10m;
        client_body_buffer_size    128k;
        proxy_connect_timeout      300;
        proxy_send_timeout         300;
        proxy_read_timeout         300;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
        #其他的这些配置都是我直接百度的,需要知道作用,请自行百度
    }

    ...
}
  1. http://push.push.do 的程序的 routes/web.php 中实现对应的路由
//其他的解析对应的路由
    ...

    //因为push.do上还有其他的解析,使用laravel提供的子域名路由功能
    Route::group(['domain' => 'push.push.do', 'namespace' => 'Client'], function () {
    //客户二级域名首页
    Route::get('/', 'IndexController@index')->name('client.index');
    //客户模块信息列表页面
    Route::get('{chunk}','ChunkController@index')->name('client.chunk');
    //客户单页信息页面
    Route::get('{page}.html','PageController@index')->name('client.page');
    //客户详细信息页面
    ROute::get('{chunk}/{info}.html','InfoController@pc')->name('client.info');

    //还有手机站的路由 我没写
});
  1. 到了这一步,基本上就实现了反向代理了("=>"标识请求对应的上游)
  • http://client.pingtai.do => http://push.push.do
  • http://client.pingtai.do/product => http://push.push.do/product
  • http://client.pingtai.do/about.html => http://push.push.do/about.html
  • http://client.pingtai.do/product/1.html => http://push.push.do/product/1.html
  1. 得到客户唯一标识,识别客户
//很简单 因为我再反向代理时设置了头信息,可以在push.push.do的程序中使用laravel提供的方法简单的得到

request()->server('HTTP_DOMAIN')#使用唯一标识去查询数据库得到用户信息
  1. 渲染页面

既然都得到了客户的信息,渲染页面也就很简单的 查询相关信息,然后渲染到blade模版就ok了

静态页面生成操作步骤

  1. 静态页面?

为了加快速度,在第一次访问客户页面的时候我希望将渲染的页面保存为静态页面,要是在用nginx的gzip压缩一下,那就美滋滋了

我使用了 silber/page-cache 这个拓展来生成(做了一点修改)静态页面

  1. 安装 silber/page-cache

  2. 修改 silber/page-cache 默认生成静态页面的位置,加入客户唯一标识做路径

//修改文件vendor/silber/page-cache/src/Cache.php的getDefaultCachePath方法
protected function getDefaultCachePath()
{
    if ($this->container && $this->container->bound('path.public')) {
        return $this->container->make('path.public') . '/page-cache/' . request()->server('HTTP_DOMAIN');
    }
}

//这里的request()->server('HTTP_DOMAMIN') 就是之前提到的客户唯一标识
  1. 修改 http://push.push.do 的nginx配置,来实现静态页面的反向代理
server {
    listen 80;
    server_name push.push.do;

    ...

    # 开启了gzip 美滋滋    
    gzip on;

    #这是首页的实现(有静态页面就用静态页面,没有就正常访问程序)
    location = / {
        try_files /page-cache/$http_domain/pc__index__pc.html /index.php?$query_string;
    }

    #这是其他的静态页面(有静态页面就用静态页面,没有就正常访问程序)
    location / {
        try_files $uri $uri/ /page-cache/$http_domain/$uri.html /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass php_upstream;      
        #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    charset utf-8;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    location ~ /\.ht {
        deny all;
    }
}
  1. 认证阅读 silber/page-cache 的文档后,我们知道怎么生成静态页面
//只要添加一个中间件就好了
$this->middleware('page-cache');

封面来源

封面图片来自 https://learnku.com/laravel/t/7939/extension-recommendation-josephsilberpage-cache-laravel-static-page-caching ,如有冒犯,可以联系我

End


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软件架构设计

软件架构设计

温昱 / 电子工业出版社 / 2012-7 / 39.00元

《软件架构设计:程序员向架构师转型必备(第2版)》围绕“软件架构设计”主题,从“程序员”成长的视角,深入浅出地讲述了架构师的修炼之道。从“基础篇”、到“设计过程篇”、到“模块划分专题”,《软件架构设计:程序员向架构师转型必备(第2版)》覆盖了架构设计的关键技能项,并且对于架构设计过程中可能出现的各种问题给与了解答。一起来看看 《软件架构设计》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试