Reverse proxy
目录
正向代理
正向代理,和平常我们说代理上网的代理基本一样,他的工作原理就像一个代理人的角色,举个粟子,一个用户访问不了某网站,但是能访问一个代理服务器,这个代理服务器呢,它能访问那个用户不能访问的网站,于是用户可以先连上代理服务器,告诉它用户需要那个无法访问网站的内容,代理服务器去取回来,然后返回给用户。也就是用户通过了代理人访问了原先无法访问的网站。正向代理是一个位于用户或客户端(client)和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置(也就是配置代理服务器的连接信息)才能使用正向代理。
反向代理
用户访问了网站,但实际上www.example.com上并不存在index.html页面,他是从另外一台服务器上取回来,然后作为自己的内容返回用户,但用户显然是不知道index.html不是他的,他只清楚得知道,我就是访问了www.example.com,而不清楚www.example.com只是个代理服务器。这里提到的www.example.com这个域名对应的服务器其实是设置了反向代理功能,代理后端的服务器向外提供服务。对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理发送页面请求,反向代理会判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
总结下,做正向代理的时候,代理服务器是客户端的代理。作为反向代理的时候,代理服务器是原始服务器的代理。从代理谁的角度应该比较好理解。
proxy
一、http反向代理
nginx中server段配置
方式1:
server { listen 80; server_name www.example.com; location / { proxy_pass :8080/; proxy_set_header Host $http_host; proxy_set_header X-Forward-For $remote_addr; } }重新加载配置文件或重启服务,使之修改生效。这里要注意location /,下面的proxy_pass 后接的地址也要加“/”,如果location /bbs {,那么下面的proxy_pass地址也要与之对应,写成:8080/bbs;如果为location /bbs/ { , 那么应写成:8080/bbs/, 注意这个"/"。
代理服务器IP:192.168.10.11,将域名www.example.com解析到该IP。这样当用户在浏览器中输入 www.example.com 的时候,代理服务器(192.168.10.11)就会从 192.168.10.10:8080取出页面文件当成自己的发送给用户。
这里proxy_set_header Host $http_host; 这个配置,通过设定对应的域名头信息传递到后端的虚拟主机中,以使后端能以对应域名进行响应。 proxy_set_header Host $http_host; 应用于解决nginx同IP、同端口、不同域名时的转发。
方式2:
配置成负载均衡的用法也是可以的,这时候只在upstream中加一个server,主要是起到个域名转发的作用。
upstream web_server { server 192.168.10.10:8080; # server 192.168.10.9:8080; # server 192.168.10.8:8080; 此处增加多个服务器,便可配置成负载均衡,还可加上一些控制机制,如轮循,权重。 } server { listen 80; server_name www.example.com; location / { proxy_pass ; } }二、tcp反向代理
TCP反向代理,官方在1.9.0及之后的版本加入了这个功能,在之前的话可以用第三方的模块实现,目前基本使用官方的反向代理。
编译的时候要将stream模块编译进去,./configure的时候带上 --with-stream
配置文件中的具体配置如下:
stream { upstream backend { server 192.168.10.10:8888 } server { listen 12345; proxy_pass backend; } }同样也是可以配置成负载均衡的模式,在upstream下增加server。
三、websocket反向代理
http { # ... 省略其它的配置... # map $http_upgrade $connection_upgrade { default upgrade; close; } upstream websocket { server 192.168.100.10:8010; } server { listen 8020; location / { proxy_pass http://websocket; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } } }注:通过http反向代理到其他端口的服务访问时页面报“502 bad gateway”, 通过日志查看报“(13: Permission denied) while connecting to upstream”的错误 检查nginx配置文件并无问题,原因在SElinux,
#getenforce Enforcing设置selinux策略为宽松模式
#setenforce 0 #getenforce Permissive永久保存该模式
#vim /etc/selinux/config SELINUX=disabled