今天我们利用 OpenResty 来实现一个反向代理服务器

step1:首先下载安装 OpenResty

# 下载安装 OpenResty
# 默认安装在 /usr/local 目录下,可在编译时指定安装目录
# 可在编译时加入更多第三方模块,以支持更多的功能 $ wget https://openresty.org/download/openresty-1.15.8.1.tar.gz
$ tar -xzvf openresty-1.15.8.1.tar.gz
$ cd openresty-1.15.8.1/
$ ./configure
$ make
$ sudo make install

step2: 配置 OpenResty 中的 conf 文件

# 首先进入到 /usr/local/openresty/nginx 目录下,会发现这和单独安装 nginx 一样
# 打开 配置文件
$ sudo vim conf/nginx.conf
#user  nobody;
worker_processes ; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; client_max_body_size 60M; # 【】配置代理服务器的缓存
proxy_cache_path /tmp/nginxcache levels=: keys_zone=my_cache:10m max_size=10g
inactive=60m use_temp_path=off; sendfile on;
tcp_nopush on; #keepalive_timeout ;
keepalive_timeout ;
#gzip on; #【】加入上游服务器,如果有多台,可以使用 hash/轮询来负载均衡
# 本机只有一台服务器,就是上篇博客中使用的 nginx 搭建的
upstream local {
server 127.0.0.1:;
# server ip:port;
# server ip:port;
} server {
listen ;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #【】修改这部分配置文件,
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_pass http://local; #【】使用上面设置的 cache
proxy_cache my_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 1d; #root html;
#index index.html index.htm;
} #error_page /.html; # redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
}

修改后的配置文件

step3: 开启反向代理服务器

# 此时在 /usr/local/openresty/nginx 目录下
$ sudo ./sbin/nginx

此时我们看一下已经开启的 nginx 服务

注释:上图观察可以发现:开启了两份 nginx 服务,一份是反向代理服务器(在 openresty/nginx 下开启的 nginx 服务,masterPID:43121),一份是上游的后端服务器服务(在单独安装的 nginx 下开启的 nginx 后端服务器服务,masterPID:43095)

step4: 此时我们看一下通过反向代理服务器访问页面的流程,然后抓一下包看看【该访问是在宿主机上的浏览器上输入的 IP 地址】

注1:上图可以发现:响应头是通过 openresty 代理服务器发送回来的,并不是后端的上游服务器发送回来的!另外,验证配置的反向代理服务器是否生效可以按一下步骤进行:

step1: 首先请求 反向代理服务器,同上图所示;结论:可正常显示页面

step2: 关闭上游服务器(进入 nginx 目录下执行命令:sudo ./sbin/nginx -s stop)

step3: 再次执行步骤 step1 进行访问;结论:可正常访问页面,访问的资源是上次访问的缓存

step4: 清除浏览器缓存,清除反向代理服务器缓存(配置文件中缓存的存放目录:/tmp/nginxcache 目录下),再次访问;结论:不可正常展示页面

注2:反向代理配置文件中参数的意义:

【1】

【2】

【3】

【4】

可能出现的问题:

1,缺少 SSL 模块:

解决方法:

Nginx系列p3:实现一个具有缓存功能的反向代理服务器的更多相关文章

  1. 使用nginx构建一个具备缓存功能的反向代理服务器

    上游服务一般不提供公网访问. upstream模块,名字叫local 这个时候访问,都是由反向代理服务处理返回的. 有了反向代理服务后,拿变量和值会出错,tcp是有对端地址的,反向代理与客户端是一个t ...

  2. Nginx系列3:用Nginx搭建一个具备缓存功能的反向代理服务

    反向代理的理解:https://www.cnblogs.com/zkfopen/p/10126105.html 我是在一台linux服务器上搭建了两个nginx服务器A和B,把静态资源文件甲放在A服务 ...

  3. Nginx 一个高性能的HTTP和反向代理服务器

    本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解过,欢迎留言交流. Nginx能做什么 ——反向 ...

  4. python 基础——实现一个带缓存功能的函数

    from functools import wraps def cache(func): data = {} @wraps(func) def wrapper(*args): if args in d ...

  5. Nginx实现负载均衡&Nginx缓存功能

    一.Nginx是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl ...

  6. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...

  7. Nginx系列0:Nginx学习历程

    Nginx学习历程 一.初识Nginx 1.Nginx适用于哪些场景 (1)静态资源服务 通过本地文件系统提供服务 (2)反向代理服务 Nginx的强大性能 缓存 负载均衡 (3)API服务 Open ...

  8. nginx的反向代理功能和缓存功能

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  9. nginx实现负载均衡、缓存功能实战

    nginx实现负载均衡.缓存功能实战 什么是正向代理?应用场景:翻墙 什么是反向代理?例如:haproxy和nginx   Nginx实现反向代理 nginx代理基于是ngx_http_proxy_m ...

随机推荐

  1. POJ 3267:The Cow Lexicon 字符串匹配dp

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8905   Accepted: 4228 D ...

  2. 新闻网大数据实时分析可视化系统项目——18、Spark SQL快速离线数据分析

    1.Spark SQL概述 1)Spark SQL是Spark核心功能的一部分,是在2014年4月份Spark1.0版本时发布的. 2)Spark SQL可以直接运行SQL或者HiveQL语句 3)B ...

  3. OBU设备非接触式读卡方案:SI522

    传统收费站将成历史!全部转为ETC系统 当高速人工收费已经成为我们驾驶出行的习惯后,我们发现,高速人工收费带来低效率.长等待以及落后性等缺点逐渐给人们出行带来不便.伴随着我国汽车保有量的逐年递增,高速 ...

  4. Adobe Illustrator CC 2017安装方法

    1.下载软件地址 2017破解版32位64位中文版下载[百度网盘资源地址]:https://pan.baidu.com/s/13BsU8CfsLB6OXr7SkRFzCg 注意:使用之前请关闭杀毒软件 ...

  5. 【C】揭秘rand()函数;

    原文地址:http://www.cnblogs.com/ngnetboy/archive/2012/11/23/2784078.html 相信只要是程序猿都会知道rand()函数是用来取随机数的一个库 ...

  6. uboot如何启动内核

    2.7.1.uboot和内核到底是什么 2.7.1.1.uboot是一个裸机程序 (1)uboot的本质就是一个复杂点的裸机程序.和我们在ARM裸机全集中学习的每一个裸机程序并没有本质区别. 2.7. ...

  7. HTTP实战

    1.建立http服务,要求: (1)提供两个基于名称的虚拟主机: www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1/erro ...

  8. Angular2的双向数据绑定

    什么是双向绑定 如图:   双向绑定.jpg 双向绑定机制维护了页面(View)与数据(Data)的一致性.如今,MVVM已经是前段流行框架必不可少的一部分. Angular2中的双向绑定 双向绑定, ...

  9. redis学习(五)

    一.Redis 发布订阅 1.Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 2.Redis 客户端可以订阅任意数量的频道. 比如你订阅 ...

  10. I0.0 上升边沿 清空 MW10~MW58 联系多个知识点融合

    编写程序 在I1.2 的上升边沿 触发 MW8+1的程序 实现方式1 M1.1 为中间变量 对应的STL语句表 执行结果 OK 已经仿真 . 现在尝试第2种方法 实现方式2: M1.1也是中间变量 S ...