Nginx反向代理:
以入口点的方式接受来自客户端的请求,但是本身不存在任何数据,而是交由后端服务器进行处理后,再返回里客户端
请求 客户端发起请求------>代理服务器------------------------------>后端服务器
返回 后端服务器------------->代理服务器------------------------------>客户端
在这个过程客户端是不主动向后端服务器请求的,后端服务器也不直接向客户端返回数据
公司常用:
1、实现跨地区的代理服务器
例如:业务服务器在北京,但是有港台的客户需要访问,但是客户直接从港台访问北京的服务器,网络环境很差,这时候就需要用到反向代理功能,作为可以提高网络环境主要有三个要素
客户只需要保证他到港台服务器的网络性能即可,而真实与北京服务器进行交互的是港台的服务器,服务器之间的网络性能在基础上要比客户直接来访问要好很多,如果是有专线的情况下
那么网络环境是非常好的。
2、用于安全考虑
有的环境需要隐藏后端服务器的真是IP地址,这样的环境使用反向代理,客户访问到的只能是反向代理服务器(域名指向的是反向代理服务器),只能获取到反向代理服务器的ip地址
而代理服务器上是不存在任何数据
3、用于负载均衡,配合upstream
反向代理常用配置参数解释:
Nginx负载均衡反向代理搭建
一、测试站点搭建:
基础环境:
主机 |
域名 |
访问内容 |
主机名 |
192.168.110.40 |
learn1.proxy.com |
learn proxy 001 learn proxy 002 |
[root@learn_proxy_40 ~]#,后端服务器 |
192.168.110.46 |
learn2.proxy.com |
learn proxy 001 learn proxy 002 |
[root@learn_proxy_46 ~]# ,后端服务器2 |
192.168.110.47 |
learn1.proxy.com learn2.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.com
server
{
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.com
server
{
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/myproxy
upstream learn_server_proxy {
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.com
server {
listen 80;
server_name learn1.proxy.com;
location / {
proxy_pass http://learn_server_proxy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
[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.com
192.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_module
2、下载需要编译的模块
[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 -V
configure 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.tcp
upstream tcp8888 {
server 192.168.110.40:8888 weight=1; #后端服务器的tcp ip:port
check interval=10000 rise=3 fall=2 timeout=1000; #健康检查机制
}
interval:向后端发送健康检查包的间隔
rise:如果连续成功次数达到rise配置的参数,服务器被认定为up
fall:如果连续失败粗疏达到fall配置的参数,服务器被认定为down
timeout:后端健康请求的超时时间
因为我测试的tcp连接是tcp 8888端口所以我是这么写的,具体测试端口自行修改
虚拟主机配置文件配置
vim /usr/local/nginx/conf/vhost/tcp_proxy.tcp
server {
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域名