Nginx反向代理web程序解决谷歌跨越问题配置详解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 路由转发:源ip和目标ip都不会改变只改变mac地址,只能在私网使用客户端10.0.0.1要访问web服务器172.16.1.7,也就是客户端直接通过路由去访问web服务器,首先请求的源ip是10.0.0.1目标ip是172.16.1.7,源mac是pc目标mac是web,当源ip到达路由器时查询路由表,在转发到web服务器。这时源ip和目标ip不会改变,但是源mac地址会换成路由器的mac地址,最终访问到web服务器,web服务器记录的访问ip依旧是客户端的源ip

Nginx代理

1.Nginx代理概念

上图描述了几种私网访问公网的方式,下面来解释一下


路由转发:源ip和目标ip都不会改变只改变mac地址,只能在私网使用

客户端10.0.0.1要访问web服务器172.16.1.7,也就是客户端直接通过路由去访问web服务器,首先请求的源ip是10.0.0.1目标ip是172.16.1.7,源mac是pc目标mac是web,当源ip到达路由器时查询路由表,在转发到web服务器。这时源ip和目标ip不会改变,但是源mac地址会换成路由器的mac地址,最终访问到web服务器,web服务器记录的访问ip依旧是客户端的源ip

代理:源ip和目标ip发生改变,mac地址不会改变

这次客户端不会直接去访问web服务器,因为私网和公网是不通的,这时客户端源ip10.0.0.1就会去访问代理的服务器10.0.0.5,代理服务器收到请求后会代替客户端去访问web服务器,这时源ip、目标ip就发生了改变,源ip172.16.1.5目标ip172.16.1.7,最后再把页面返回给客户端,web服务器记录的ip就会是代理服务器的ip,有效的保护了源ip

nat和vpn实现原理和代理几乎一致,只不过vpn是加密访问,建立一个vpn通道

nat会将ip头部中的私网ip换成公网ip,消耗资源较大

vpn可以实现两个不同局域网通信,实现私网到私网之间的通讯首先是封装两个地区的公网ip,到达网关后会把vpn头部去掉,ip头部记录着两个私网的ip地址,就像是在同一局域网在通讯

代理的实现方式


正向代理,帮客户端连接web服务器

私网到公网

内部上网 客户端<—>代理—>服务端

反向代理,将web服务器资源提供给客户端

公网到私网

反向代理 客户端—>代理<—>服务端

反向代理用的非常多,他可以非常有效的保护后台服务器还能提供一个缓存服务,当客户端通过公网来访问服务器,其实访问的是代理服务器,再由代理服务器转发到web服务器

正向代理与反向代理的区别


代理的对象不同

正向代理代理的是客户端

反向代理代理的是服务端

2.Nginx反向代理配置

2.1.Nginx代理配置语法

功能:代理后端web服务器


代理后端web服务器配置


语法格式:proxy_pass URL;

默认配置:-

配置区域:location,if in location,limit_except

URL配置方式

http://localhost:8000/url

http://10.0.0.7:8000/url

http://unix:/tmp/backend.soket:/url/

具体配置

proxy_pass http://192.168.81.210

2.2.url跳转修改返回location

功能:修改web服务器返回的响应头中的location头域跟refresh头域数值


https://blog.csdn.net/weixin_44953658/article/details/105494108


url跳转配置


语法格式:proxy_redirect [default|off; redirect replacement]

默认配置:proxy_redirect default;

配置区域:http,server,location

具体配置

proxy_redirect http://192.168.1.154:8080/wuman/  http://www.boke.com/wuman/;

2.3.发送后端服务器的请求头信息

  • 功能:假如被代理的web服务器上有多个虚拟主机站点,不定义请求头信息的话无法转发到对应的服务器上,配置了请求头信息,nginx会根据HOST值去找对应的站点信息image.png

2.3.1.请求头配置

语法格式:proxy_set_header field value;


默认配置:proxy_set_header HOST $proxy_host;


proxy_set_header Connection close;


配置区域:http,server,location


如果web服务器设置了多个虚拟主机,那么这一项必须配置,如果不配置,只显示配置文件目录中最靠前的站点,字母a-z排序


用户请求的时候HOST的值是know.com也就是url中输入的内容,那么代理服务器会向后端传递的请求就会是know.com

proxy_set_header HOST $http_host;

2.3.2获取客户端源ip

将r e m o t e a d d r 的 值 放 进 变 量 X − R e a l − I P 中 , remote_addr的值放进变量X-Real-IP中,remote

a

ddr的值放进变量X−Real−IP中,remote_addr的值为客户端的ip,从而记录客户端的访问ip

proxy_set_header X-Real-IP $remote_addr;

客户单通过代理访问后端服务,后端服务通过该变量来记录真实客户端地址,也就是说如果不加如下配置则nginx服务器记录的是代理服务器的ip而不是客户端的ip

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2.4.代理到后端的超时时间

TCP连接、响应、返回等超时时间

2.4.1.tcp连接超时时间配置

Nginx代理与后端服务器连接超时时间


在指定时间内如果无法与后端服务器建立tcp连接则断开


超时时间配置


语法格式:proxy_connect_timeout time;

默认配置:proxy_connect_timeout 60s;

配置区域:http、server、location

proxy_connect_timeout 60s;

2.4.2.响应时间配置

Nginx代理等待后端服务器的响应时间


与后端服务器建立了tcp连接,但在指定时间内后端服务器没有响应对应的页面信息则断开


响应时间配置


语法格式:proxy_read_timeout time;

默认配置:proxy_read_timeout 60s;

配置区域:http、server、location

proxy_read_timeout 60s;


2.4.3.数据回传超时

后端服务器数据回传给nginx代理超时时间


与后端tcp连接建立成功、响应成功、在指定时间内没有显示内容则断开


回传时间配置


语法格式:proxy_send_timeout time;

默认配置:proxy_send_timeout 60s;

配置区域:http、server、location

proxy_send_timeout 60s;


2.5.代理缓冲区

2.5.1.开启缓冲区

nginx会把后端返回的内容先放到缓冲区,然后再返回给客户端,边收边传,不是全部接收完在传给客户端,而缓存会全部接受完在传给客户端


代理缓存区配置


语法格式:proxy_buffering on | off;

默认配置:proxy_buffering on;

配置区域:http、server、location

proxy_buffering on;


2.5.2.配置缓冲区大小

设置nginx代理保存用户头信息的缓冲区大小


也就是存放缓冲信息目录的大小


配置缓冲区大小


语法格式:proxy_buffing_size size;

默认配置:proxy_buffer_size 4k|8k;

配置区域:http、server、location

proxy_buffer_size 128k;


2.5.3.配置缓冲文件大小

设置缓冲区文件数量以及大小


配置缓冲文件大小


语法格式:proxy_buffers number size;

默认配置:proxy_buffers 8 4k|8k 8表示文件的数量 4k表示文件的大小

配置区域:http、server、location

proxy_buffers 4 128;

2.6.常用代理优化配置

  • 可以把常用的代理配置写到单独的文件中,在使用include调用,显得文件不是特别乱,但是个人习惯还是写出来,增加熟练度
vim /etc/nginx/proxy_params
proxy_set_header HOST $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

生产环境反向代理常用配置

client_max_body_size 200m;
proxy_redirect off;
proxy_set_headed Host $host:80;
proxy_set_headed X-Real-IP $remote_addr;
proxy_set_headed X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_404;
proxy_max_temp_file_size 128m;
proxy_pass http://;

3.Nginx反向代理配置实例

  • 架构图image.png代理服务器两块网卡,vm8:192.168.81.210表示外网地址与客户端连接,vm1:172.16.1.100表示内网地址与web进行连接


web服务器二块网卡,vm1:172.16.1.200与代理互连,vm8与客户端相连,主要是为了xshell连接


Nginx如果只想让某一网段来访问此服务器,可以在listen后面写上监听的ip,类似基于ip的访问,设置完后只有这个网段的主机可以访问


注意:一定要将客户端的vm1网卡关掉,否则在日志中查看时都是172网段(因为vm1与web在同一网段),一定要让客户端ping不同172网段的主机,如果不把vm1网卡关掉,那么listen只设置172.16.1.200,客户端访问172.16.1.200也是可以访问到的,因为是同一网段


效果关掉vm1,可以达到效果


可以用192.168.81.220来得到页面内容

3.2.安装Nginx

[root@localhost ~]# cat /etc/yum.repos.d/nginx.repo 
[nginx]
name=nginx
baseurl=http://nginx.org/packages/centos/7/$basearch
enabled=1
gpgcheck=0
[root@localhost ~]# yum -y install nginx

3.2.配置web后端服务器

[root@localhost conf.d]# vim www_know.conf 
#www.know.com
server {
        listen 172.16.1.200:80;
        server_name www.know.com;
        access_log /nginx_log/www_know_access.log main;
        location / {
                root /web/know;
                index index.html;
                #allow 172.16.1.100;
                #deny all;
        }
        location /download {
                autoindex on;
                autoindex_exact_size on;
                autoindex_localtime on;
                auth_basic "后端文件系统";
                auth_basic_user_file /etc/nginx/.auth_passwd;
        }
}
仅允许代理服务器172.16.1.网段可以访问,如果开放allow、deny表示只有172.16.1.100可以访问
listen这块如果要修改请用restart进行重启,否则不生效
重启服务:
[root@localhost conf.d]# systemctl restart nginx
  • 做完这步操作后,除了172.16.1.网段的能访问,其余都不能访问

3.3.配置代理服务器

[root@localhost conf.d]# vim www_know_proxy.conf
server {
        listen 80;
        server_name www.know.com;
        location / {
                proxy_pass http://172.16.1.200:80;
        }
}
重载nginx
[root@localhost conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost conf.d]# systemctl reload nginx
配置客户端hosts文件,要写代理服务器的外网ip
192.168.81.210 www.know.com

只配置proxy_pass即可看到页面

日志输出

代理服务器
192.168.81.1 - - [14/Apr/2020:18:01:45 +0800] "GET /images/b.jpg HTTP/1.1" 404 555 "http://www.know.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36"
web服务器
172.16.1.100 - - [14/Apr/2020:18:01:45 +0800] "GET /images/b.jpg HTTP/1.0" 404 555 "http://www.know.com/" "Mozilla/5.0 (W

3.4.优化代理服务器

  • 配置web服务器日志记录客户端的真实ip
注意:首先在nginx.conf配置文件中定义的日志格式加上$http_x_forwarded_for
server {
        listen 80;
        server_name www.know.com;
        location / {
                proxy_pass http://172.16.1.200:80;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
日志输出
代理服务器没啥变化
192.168.81.1 - - [14/Apr/2020:18:21:14 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36"
web服务器在最后一列加入了客户端源ip
172.16.1.100 - - [14/Apr/2020:18:23:37 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "192.168.81.1"

3.5.web服务器修改端口

  • 只需要改proxy_pass的端口即可
web服务器配置
[root@localhost conf.d]# vim www_know.conf
server {
        listen 172.16.1.200:8080;
        server_name www.know.com;
        access_log /nginx_log/www_know_access.log main;
        location / {
                root /web/know;
                index index.html;
                #allow 172.16.1.100;
                #deny all;
        }
}
[root@localhost conf.d]# systemctl restart nginx
代理服务器配置
[root@localhost conf.d]# vim www_know_proxy.conf
server {
        listen 80;
        server_name www.know.com;
        location / {
                proxy_pass http://172.16.1.200:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

4.多站点代理配置

4.1.web服务器配置

配置know.com
[root@localhost conf.d]# vim www_know.conf
server {
  listen 172.16.1.200:80;
  server_name www.know.com;
  access_log /nginx_log/www_know_access.log main;
  location / {
    root /web/know;
    index index.html;
    #allow 172.16.1.100;
    #deny all;
  }
}
配置WordPress
[root@localhost conf.d]# vim wordpress.conf
server {
  listen 172.16.1.200:80;
  server_name jiang.wordpress.com;
  root /web/wordpress;
  index index.php index.html;
  access_log /nginx_log/jiang_wordpress_access.log main;
  location ~ \.php$ {
    root /web/wordpress;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}
重载nginx
[root@localhost conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost conf.d]# systemctl reload nginx 

4.2.代理服务器配置

多个站点的代理配置,一定要配置proxy_set_header HOST $http_host请求头,否则只会显示配置文件目录按字母排序最靠前的站点,例如有一个a.conf、b.conf如果么有设置请求头,那么默认就一直转发到a.conf的站点,所有站点代理配置文件都需要增加请求头配置

配置know站点代理
[root@localhost conf.d]# vim www_know_proxy.conf
server {
        listen 80;
        server_name www.know.com;
        access_log /nginx_log/www_know_proxy.log main;
        location / {
                proxy_pass http://172.16.1.200:80;
    proxy_set_header HOST $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
配置WordPress站点代理
[root@localhost conf.d]# vim jiang_wordpress_proxt.conf 
#jiang.wordpresscom
server {
  listen 80;
  server_name jiang.wordpress.com;
  access_log /nginx_log/jiang_wordpress_proxy.log main;
  location / {
    proxy_pass http://172.16.1.200:80;
    proxy_set_header HOST $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout 30;
    proxy_read_timeout 60;
    proxy_send_timeout 60;
    proxy_buffering on;
    proxy_buffer_size 128k;
    proxy_buffers 4 128k;
  }
}
重启nginx服务
[root@localhost conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost conf.d]# systemctl restart nginx

4.3.效果

  • www.know.com站点

  • jiang.wordpress.com站点

  • 日志输出
想要看到效果可以在日志格式中加上$http_host
代理端
[root@localhost conf.d]# vim /etc/nginx/nginx.conf
log_format  main  '$remote_addr - $http_host - $remote_user [$time_local] $http_host $msec  "$request" $request_time '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
日志输出
www.know.com
192.168.81.1 - www.know.com - admin [14/Apr/2020:22:24:15 +0800] www.know.com 1586874255.239  "GET / HTTP/1.1" 0.002 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "-"
jiang.wordpress.com
192.168.81.1 - jiang.wordpress.com - - [14/Apr/2020:22:25:25 +0800] jiang.wordpress.com 1586874325.404  "GET / HTTP/1.1" 3.007 200 18460 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "-"
web端
[root@localhost conf.d]# vim /etc/nginx/nginx.conf
log_format  main  '$remote_addr - $http_host - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
日志输出
www.know.com
172.16.1.100 - www.know.com - admin [14/Apr/2020:22:27:08 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "192.168.81.1"
jiang.wordpress.com
172.16.1.100 - jiang.wordpress.com - - [14/Apr/2020:22:27:46 +0800] "GET / HTTP/1.0" 200 18447 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36" "192.168.81.1"

5.常用组合配置

通常将常用的代理参数写到一个指定文件,然后用到时用include调用
[root@localhost nginx]# vim proxy_params
proxy_set_header HOST $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 128k;
[root@localhost nginx]# vim conf.d/www_know_proxy.conf 
server {
        listen 80;
        server_name www.know.com;
        access_log /nginx_log/www_know_proxy.log main;
        location / {
                include proxy_params;     //确保proxy_params位于conf.d上级目录,否则建议使用绝对路径include /etc/nginx/proxy_params
        }
}

6.故障排查

6.1.代理访问不到web页面

1.检查web服务器是否能提供服务

  • 检查配置文件
server {
  listen 80;
  server_name www.know.com;
  location / {
    root /web/know;
    index index.html;
  }
}
  • 根据日志判断错误类型
  • 检查网站目录、索引是否存在以及目录的属主
  • 检查nginx服务是否启动

2.检查代理服务器配置

  • 检查配置文件
server {
  listen 80;
  server_name www.know.com;
  location / {
    proxy_pass http://172.16.1.200:80;
    include /etc/nginx/proxy_params;
  }
}
  • 检查dns解析
  • 要求所有web站点的域名解析为代理服务器的ip,也就是写A记录是域名要对应的IP必须是代理服务器的ip

6.2.无法正确代理

  • 代理配置无误,web服务器配置无误,就是代理不到
  • 解决办法:在web服务器也配置请求头,成功后在删掉
server {
  listen 80;
  server_name www.know.com;
  location / {
    root /web/know;
    index index.html;
    include proxy_params;
  }
}

7.总结

代理的80端口可以对应多个后端的80端口

前端的80端口可以对应不同的后端端口

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
3天前
|
设计模式 前端开发 数据库
深入理解MVC设计模式:构建高效Web应用程序的基石
【7月更文挑战第4天】在软件工程领域,设计模式是解决常见问题的一系列经过验证的方法。其中,Model-View-Controller(MVC)设计模式自诞生以来,便成为了构建用户界面,特别是Web应用程序的黄金标准。MVC通过将应用程序逻辑分离为三个核心组件,提高了代码的可维护性、可扩展性和重用性。本文将深入探讨MVC设计模式的原理,并通过一个简单的代码示例展示其应用。
33 0
|
7天前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
26 0
|
5天前
|
JavaScript 应用服务中间件 nginx
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
26 10
|
2天前
|
应用服务中间件 nginx
Nginx命令配置到系统环境变量
Nginx命令配置到系统环境变量
|
2天前
|
应用服务中间件 开发工具 nginx
Nginx基础配置实例需求分析
Nginx基础配置实例需求分析
|
5天前
|
负载均衡 JavaScript 应用服务中间件
手把手教你玩转 Nginx 配置
作为静态服务器、反代和负载均衡器,Nginx 因高性能和灵活性广泛使用。
40 5
|
1天前
|
应用服务中间件 Linux nginx
CentOS 7 上配置 Nginx 作为反向代理
在CentOS 7上设置Nginx反向代理的步骤:安装Nginx;启动Nginx服务编辑`/etc/nginx/nginx.conf`;添加`proxy_pass http://app_server_address;将请求转发至应用服务器;重启Nginx`sudo systemctl restart nginx`;验证配置是否成功
|
2天前
|
网络协议 应用服务中间件 nginx
Nginx的http块sendfile,keepalive_timeout的配置指令说明
Nginx的http块sendfile,keepalive_timeout的配置指令说明
|
5天前
|
监控 负载均衡 Java
如何设计高可用性的Java Web应用程序
如何设计高可用性的Java Web应用程序
|
7天前
|
网络协议 应用服务中间件 网络安全
如何排查Nginx配置问题导致的域名访问错误
如何排查Nginx配置问题导致的域名访问错误
21 2