您的位置:首页 > 运维架构 > 反向代理

nginx反向代理功能

2017-05-23 10:03 627 查看
Nginx反向代理: 以入口点的方式接受来自客户端的请求,但是本身不存在任何数据,而是交由后端服务器进行处理后,再返回里客户端请求 客户端发起请求------>代理服务器------------------------------>后端服务器返回 后端服务器------------->代理服务器------------------------------>客户端在这个过程客户端是不主动向后端服务器请求的,后端服务器也不直接向客户端返回数据 公司常用: 1、实现跨地区的代理服务器 例如:业务服务器在北京,但是有港台的客户需要访问,但是客户直接从港台访问北京的服务器,网络环境很差,这时候就需要用到反向代理功能,作为可以提高网络环境主要有三个要素 客户只需要保证他到港台服务器的网络性能即可,而真实与北京服务器进行交互的是港台的服务器,服务器之间的网络性能在基础上要比客户直接来访问要好很多,如果是有专线的情况下 那么网络环境是非常好的。 2、用于安全考虑 有的环境需要隐藏后端服务器的真是IP地址,这样的环境使用反向代理,客户访问到的只能是反向代理服务器(域名指向的是反向代理服务器),只能获取到反向代理服务器的ip地址 而代理服务器上是不存在任何数据 3、用于负载均衡,配合upstream 反向代理常用配置参数解释:Nginx负载均衡反向代理搭建一、测试站点搭建:基础环境:
主机域名访问内容主机名
192.168.110.40learn1.proxy.comlearn proxy
001learn
proxy 002
[root@learn_proxy_40
~]#,后端服务器
192.168.110.46learn2.proxy.comlearn
proxy 001learn
proxy 002
[root@learn_proxy_46 ~]# ,后端服务器2
192.168.110.47learn1.proxy.comlearn2.proxy.com代理服务器
Nginx负载均衡反向代理: 192.168.110.40 [root@learn_proxy_40
~]#mkdir /data/www/learn1.proxy.com[root@learn_proxy_40
~]#echo "learn1 proxy 001"
>/data/www/learn1.proxy.com/learn1.php[root@learn_proxy_40
~]#vim /usr/local/nginx/conf/vhost/learn1.proxy.comserver { listen 80; server_name learn1.proxy.com; index index.php index.html index.htm; root /data/www/learn1.proxy.com; error_log /data/weblogs/learn1_error.log crit; access_log /data/wwwlogs/learn1.log access; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi.conf; } } [root@node2 ~]# curl
"http://learn1.proxy.com/learn1.php"learn proxy 001

[root@learn_proxy_40 ~]#mkdir /data/www/learn2.proxy.com[root@learn_proxy_40 ~]#echo
"learn1 proxy 002" >/data/www/learn2.proxy.com/learn2.php[root@learn_proxy_40 ~]#vim
/usr/local/nginx/conf/vhost/learn2.proxy.comserver { listen 80; server_name learn2.proxy.com; index index.php index.html index.htm; root /data/www/learn2.proxy.com; error_log /data/weblogs/learn2_error.log crit; access_log /data/wwwlogs/learn2.log access; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi.conf; } }

通过上面的配置,已经可以实现两个站点的正常访问,区分开两个站点是分别不同的两台主机但是在真是生产环境,它们的内容是相同,只是为了方便测试才这样区分的 192.168.110.46的配置同192.168.110.40配置流程一样,切记配置啊,要不不能出结果了 二、负载均衡反向代理搭建: 192.168.110.47,反向代理服务器 [root@proxy_server
~]#vim /usr/local/nginx/conf/vhost/myproxyupstream
learn_server_proxy {
#learn_server_proxy,是upstream定义的负载均衡池名称 server
192.168.110.46:80 weight=1;
#代理的后端服务器 server
192.168.110.40:80 weight=1;
#代理的后端服务器} [root@proxy_server
vhost]# vim /usr/local/nginx/conf/vhost/learn1-proxy.comserver { listen
80; server_name learn1.proxy.com; #域名 location / { proxy_pass http://learn_server_proxy; #指定了upstream,负载均衡池的名称,也就是指定了后端服务器的地址 proxy_set_header
Host $host; #获取主机头信息,如果不写,会导致访问失败 proxy_set_header X-Forwarded-For $remote_addr;
#可以获取到访问客户端的真是ip。 } } [root@proxy_server
wwwlogs]# vim /usr/local/nginx/conf/vhost/learn2-proxy.com server { listen
80; server_name learn2.proxy.com; location / { proxy_pass http://learn_server_proxy; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; }} 测试方法: 在本地host写入192.168.110.47 learn2.proxy.com192.168.110.47 learn1.proxy.com然后去访问这两个域名,下面 是我测试的截图 反向代理服务器日志截图

注意看我标注红框的两个位置,左手边的红框内显示的是请求地址,也就是客户端地址。右手边红框标注的是客户端发起的请求是由后端的那些服务器进行处理的 咱们刚开始要实现的就是负载均衡的反向代理,通过日志我们可以看到,从192.168.110.168发出的请求,会由 server
192.168.110.46:80 weight=1; server 192.168.110.40:80 weight=1; 这两台主机同时处理,轮询算法。 后端服务器日志截图

左手边的红框是客户端的ip地址,而右手边的红框是代理服务器的ip地址,日志显示方式做个处理下面会说 后端服务器日志格式配置: log_format access
'$http_x_forwarded_for - $remote_user [$time_local]
"$request" ' '$status $body_bytes_sent
"$http_referer" ' '"$http_user_agent"
"$remote_addr" ' '"$request_time"
"$upstream_response_time" "$upstream_addr" '; 我是将$remote_add和$http_x_forwarded_for互换了一下位置,$http_x_forwarded_for这个参数是配置可以让nginx获取到真实的ip地址 TCP反向代理配置 首先需要准备一个可以测试的代码,这么没办法提供,只能自己想办法了。 Nginx代理服务器配置安装扩展模块1、首先查看现在已经编译的模块[root@proxy_server package]#/usr/local/nginx/sbin/nginx -V #查看nginx已经编译好的参数,后面也需要将这些模块重新编译 configure arguments:
--user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module
--with-http_ssl_module2、下载需要编译的模块[root@proxy_server package]#wget https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip [root@proxy_server
package]# unzip master.zip 新模块:--add-module=/data/package/nginx_tcp_proxy_module-master/
#模块存放路径3、进入nginx安装目录进行重新编译,需要加上之前已经编译过的参数[root@proxy_server
package]# tar zxvf tengine-2.0.3.tar.gz [root@proxy_server package]# cd /data/package/tengine-2.0.3[root@proxy_server package]# patch -p1 < /data/package/nginx_tcp_proxy_module/tcp.patch[root@proxy_server package]# ./configure --user=www --group=www
--prefix=/usr/local/nginx --with- http_stub_status_module
--with-http_ssl_module --add-module=/data/package/nginx_tcp_proxy_module-master/[root@proxy_server package]# make切勿进行make
install这样就重新安装了4、替换nginx二进制文件[root@proxy_server
package]#cp /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx.bak #先备份[root@proxy_server
package]#cp -rfp
/data/package/tengine-2.0.3/objs/nginx /usr/local/nginx/sbin/ 替换5、重载[root@proxy_server
package]#make upgrade 6、验证[root@proxy_server
package]# /usr/local/nginx/sbin/nginx -Vconfigure arguments: --user=www --group=www
--prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module--add-module=/data/package/nginx_tcp_proxy_module-master/ ##添加成功 配置Nginx配置文件user www www;worker_processes 4;events { use epoll; worker_connections 1204; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; server_tokens off; #log format log_format access
'$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent
"$http_referer" ' '"$http_user_agent"
"$http_x_forwarded_for" ' '"$request_time"
"$upstream_response_time" "$upstream_addr" '; #upstream myfastcgi { # server 192.168.110.40:9000 weight=1 max_fails=2
fail_timeout=30; # server 192.168.110.46:9000 weight=1 max_fails=2
fail_timeout=30; # } } #tcp区块开始tcp { timeout 1d; proxy_read_timeout 10d; #设置Nginx从代理的后端服务器获取信息的时间,Nginx等待代理后端服务器的超时时间 proxy_send_timeout 10d; #代理后端服务器的数据回传时间,即在规定时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接 proxy_connect_timeout 30; #表示反向代理服务器与后端节点服务器连接的超时时间,及发起握手等候响应的超时时间 include ./vhost/*; #应用./host/目录下的所有文件 }#tcp区块结束主要是增加了tcp区块的配置tcp区块不允许配置在http区块和server区块中 upstream 配置[root@proxy_server
vhost]# vim /usr/local/nginx/conf/vhost/loadblance.tcpupstream tcp8888
{ server
192.168.110.40:8888 weight=1;
#后端服务器的tcp
ip:port check interval=10000
rise=3 fall=2 timeout=1000; #健康检查机制} interval:向后端发送健康检查包的间隔rise:如果连续成功次数达到rise配置的参数,服务器被认定为upfall:如果连续失败粗疏达到fall配置的参数,服务器被认定为downtimeout:后端健康请求的超时时间因为我测试的tcp连接是tcp 8888端口所以我是这么写的,具体测试端口自行修改 虚拟主机配置文件配置vim
/usr/local/nginx/conf/vhost/tcp_proxy.tcpserver { listen 8888;
#监听端口 server_name chat.proxy.com;
#访问域名 access_log /data/weblogs/nginx/tcp8888.access.log; #日志记录 proxy_pass tcp8888;
#应用upstream定义池名称 so_keepalive on;
#心跳检测开启 tcp_nodelay on;
#有效提高数据的实时响应性} 测试方法: 在客户端写入host 192.168.110.47 chat.proxy.com 访问chat.proxy.com域名 http://chat.proxy.com:8888/,下面截图是访问到的内容,经验证配置成功

反向代理参数解释: proxy_pass http://learn_server_proxy; #指定了upstream的负载均衡池,也就是代理后端服务器的访问地址proxy_set_header Host $host;
#获取主机头,如果不配置此参数,会导致访问失败proxy_set_header
X-Forwarded-For $remote_addr; #获取客户端真实IP地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx反向代理