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

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

内容简介:对添加分两个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


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

查看所有标签

猜你喜欢:

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

Agile Web Development with Rails 4

Agile Web Development with Rails 4

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2013-10-11 / USD 43.95

Ruby on Rails helps you produce high-quality, beautiful-looking web applications quickly. You concentrate on creating the application, and Rails takes care of the details. Tens of thousands of deve......一起来看看 《Agile Web Development with Rails 4》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具