`

nginx实现反向代理

阅读更多
  最近开始研究Nginx配置,哎~现在出去面试机会都会问到,不学不行了,先从简单的开始吧,这两天研究张宴的博客,自己也做了一次配置,分享一下。

    概述:反向代理是指的,服务器代理网络上的客户机请求,将请求转达给内部真实服务器,然后在返回给Internet客户端,代理服务器上面没有任何网页资料。反向代理和正向代理没有冲突,可以在防火墙设备中同时使用这两种结合,正向代理可以进行过滤,保护内部网络安全。

               软件七层负载均衡大多是基于HTTP反向代理,Nginx反向代理能够支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查。

   常见的Web负载均衡方法:

                                                     1、 DNS轮询:将同一个主机名添加多个A记录,DNS将解析请求安装A记录的顺序,随即分配到不同的IP上,使用dig baidu.com 就可以看到不同的A记录对应的IP地址。缺点:可靠性低,其中一台出现故障,就不会给予回应,就算从DNS去掉该服务器IP,但是也会保存在各地区的ISP众多的DNS缓存中。系统股灾不均衡,使用简单轮询,不能计算出服务器的负载差异,所以有可能客户集中请求到其中某一台服务器。

                                                   2、F5、LVS、DNS只能解析这里不做讲述

配置环境:

三台CentOS5.3,一台做nginx代理,2台apache做页面测试。apache端口改为:8080,nginx使用80口接收客户请求

yum -y install pcre-devel openssl openssl-devel                   //安装包,否则编译时候出错

#useradd  www

#groupadd  www

#usermod -g www www         //设置nginx的用户和组

#tar  xzvf  pcre-7.8.tar.gz

#./configure

#make ; make install                //安装pcre让nginx支持rewrite重写方便以后所需

[root@localhost tar]# cd nginx-0.7.16/

[root@localhost nginx-0.7.16]# ./configure  --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

 --with-http_stub_status_module:这个模块用于获取nginx自上次启动以来的工作状态,非核心模块

--with-http_ssl_module               : 把ssl编译进去, 仅仅指定openssl库的源代码路径还是不够的

[root@localhost nginx-0.7.16]#make  ; meke install

#cd   /usr/local/nginx/conf/nginx.conf

#vi  nginx.conf

user  www www;                       //设置用户和组

worker_processes  4;             //生成进程数,等于CPU总核数两倍
 
error_log  /data1/logs/nginx_error.log crit;      //错误日志路径,错误日志可选项为:【debug  info  notice  warn  error   crit】
 
pid        /usr/local/nginx/logs/nginx.pid;              //PID路径
worker_rlimit_nofile 51200;                                 //指定文件描述符数量
 
events {
    use epoll;               //使用网络I/O模型
    worker_connections  51200;            //允许连接数,文件描述符
}
 
 
http
 {
    include       mime.types;           //文件类型
    default_type  application/octet-stream;         //默认文件类型
    charset  UTF-8                       //语言类型
    server_names_hash_bucket_size 128;               //根据CPU的cache来设定
    client_header_buffer_size 4;          //记录缓存4k
    large_client_header_buffers 4 8k;      //如果4k不够,用8k
 
    sendfile        on;         //指定nginx是否调用sendfile函数(zero copy方式)来输出文件,普通应用必须设为on,对于普通文件用on。如果进行下载I/O负载应用,设置为off,以平衡磁盘磁盘和网络I/O处理速度。
    #tcp_nopush     on;      //允许或禁止使用socket的TCP_NOPUSH(on freebsd或TCP_COR(on  linux),此选择仅仅在使用sendfile时候可用,
 
    keepalive_timeout  65;            //长连接超时时间
    tcp_nodelay on;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
 
   #开启gzip压缩,用于支持在线实时压缩输出数据流
    gzip on;                          //off关闭或者on开启gzip功能
    gzip_min_length 1k;  //设置允许压缩最小字节数,0表示多大都压,最好设置大于1k,小于1k越压越大
    gzip_buffers 4 16k;        //系统获取几个单位的缓存,用于存储gzip压缩结果数据流。4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存,如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
    gzip_http_version 1.1;    //判断http协议版本,是否支持压缩,否则用户看到乱码。默认即可,大部分都得支持
    gzip_comp_level 2;     //gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢
    gzip_types text/plain application/x-javascript text/css application/xml;     //默认nginx是开启gzip压缩,但是只针对html文件押送  gzip_types       text/plain application/x-javascript text/css text/html application/xml text/javascript;  在nginx的gzip的gzip_types加上
    gzip_vary on;   //和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。
 
    client_max_body_size 50m;             //允许客户端请求的最大单个文件字节数
    client_body_buffer_size 128k;        //缓冲区代理用户端请求的最大字节数,可以理解先保存到本地在穿给用户
    proxy_connect_timeout 600;        //和后端服务器连接的超时时间,发起握手等候相应超时时间
    proxy_read_timeout 600;         //连接成功后,等待后端服务器相应时间,已经进入后端的排队之中等候处理
    proxy_send_timeout 600;        //后端服务器数据回传时间,在规定时间内服务器必须传完所有数据
    proxy_buffer_size 16k;        //只保存用户头信息一共nginx进行规则处理,用于缓存代理请求
    proxy_buffers    4 32k;     //告诉nginx保存单个用的几个Buffer最大用多大空间
    proxy_busy_buffers_size 64k;   //如果系统很忙可以申请更大的proxy_buffers,官方推荐 *2
    proxy_temp_file_write_size 64k;    //proxy缓存临时文件大小
 
    upstream http_server_pool {
        server 192.168.1.2:8080 weight=4 max_fails=2 fail_timeout=30s;
        server 192.168.1.3:8080 weight=2 max_fails=2 fail_timeout=30s;
     }          //设置地址池,后端2台服务器
 
    server          //第一个虚拟主机,反向代理http_server_pool这组服务器
      {
        listen       80;                                        //监听端口
        server_name  www.xiao.com;           //主机名称
 
        location /
        {
                proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; //http://www.2tutu.com/post/2008/631.html         //后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
                proxy_pass http://http_server_pool;
                proxy_set_header Host www.xiao.com;
                proxy_set_header X-Forwarded-For  $remote_addr;
        }
        access_log  logs/www.xiao.com.access.log  combined;
       }
       }
proxy_set_header Host www.xiao.com
proxy_set_header  Host  $host 首先说明 proxy_set_header 指令在向反向代理的后端Web服务器发起请求时添加指定的 Header头信息,后端web服务器有多个基于域名的虚拟主机时,通过头信息Host,用于指定请求的域名,这样后端web才能识别反向代理请求哪个虚拟主机处理。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for :联系下面PS中所写,在后端web中就算加上$http_x_Forwarded_for这条,也得不到用户的IP,所以在nginx反向代理添加Header头信息 X-Forwarded-For在配合后端服务器日志文件的$http_x_Forwarded_for这条就可以获得用户的IP地址了。

 PS:假设Nginx作为Web服务器,nginx或Squid作为反向代理后,就不能获取客户端的真实IP地址了,由于在客户端和Web增加了中间层,web没有真实的IP,通过$remote_addr变量拿到是反向代理的IP,Web代理可以增加$http_x_Forwarded_for信息,用于记录客户端IP和原来客户请求的服务器地址,在日志格式中加上即可。

  log_format  main   '$http_x_Forwarded_for '
                       '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /tmp/Nginx.access.log  main;                                 //在后端Web里面加上这样就可以了

upstream : nginx支持4种算法,下面一一介绍

1、 轮询

每个请求按时间顺序分配到不同的后端服务器了,后端服务器down掉,自动切除。

2、weight

设定服务器权值: weight=2

                                  weight=4          服务器性能不均时候使用

3、 ip_hash

每个请求按访问ip的hash结果分配,每个访客有固定的后端服务器,可以解决session问题

4、 fair(第三方)

按后端服务器的响应时间来分配,响应时间短的优先分配

5、url_hash (第三方)

按访问的url的hash结果分配,使每个url定向到同一个后端服务器,后端为缓存服务器比较有效。

以往的架构lvs或者dns轮询,这样虽然squid里面的均衡的,但是忽略了一点就是数据量,虽然每台squid是均匀但是都是满载的,重复的请求,会占用很多空间,在前面换上nginx在配上 url_hash,根据url分流后,每一个url会只存在一个squid上,每台squid数据完全不同。http://edu.codepub.com/2010/0202/20282.php

upstream http_server {             //定义负载均衡设备的Ip及设备状态
  ip_hash;
   server 127.0.0.1:9090 down;
   server 127.0.0.1:8080 weight=2;
   server 127.0.0.1:6060;
   server 127.0.0.1:7070 backup;
  }

down : 当前的IP server暂时不参与负载,不进行反向代理

weight: 默认为1,weight越大,负载的权重越大

max_fails: 允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。

fail_timeout : max_fails次失败后,暂停的时间

backup:  其它所有非backup机器down或者忙时候,请求backup机器,这台机器压力最轻

PS: nginx支持同时设置多组负载均衡,给不同的server使用

location:设置对URL进行匹配,比如 location  /  ,  location  /data 这两个设置优先级,/ 下也可以,但是不如 /data下搜索更快,定位更准。

分享到:
评论

相关推荐

    从零开始设计并构建“金科云盾”网站防护系统(全国云计算应用创新大赛一等奖作品),使用Nginx实现反向代理,负载均衡,统一日志

    自行构建web网站(敏感请求包括:注册、登录、详情、支付等),使用Nginx实现反向代理,负载均衡,并统一日志格式。模拟慢连接、DDOS、撞库、爆破等恶意攻击并统一数据格式,Logstash过滤收集有效日志,日志分类归档...

    centos安装多个nginx实现反向代理.zip

    本主题聚焦于如何在CentOS操作系统上安装多个Nginx实例,以实现反向代理,服务于Vue.js CLI打包的项目以及Java应用程序。以下是关于这一主题的详细知识讲解。 首先,让我们了解Nginx的基本概念。Nginx是一个高性能...

    nginx实现Tomcat反向代理

    本篇文章将详细介绍如何利用Nginx实现对Tomcat的反向代理,以及如何配置HTTPS,以提升网站的安全性。 首先,理解反向代理的概念。反向代理是指客户端发送请求到Nginx服务器,Nginx再将请求转发给后端的Tomcat服务器...

    基于Linux-nginx-反向代理服务器的应用研究-毕业论文.doc

    在 Linux 平台下,可以使用 Nginx 实现反向代理服务器,通过搭建多台 Web 服务器实现负载均衡,提高系统性能和解决服务器瓶颈问题。 5. MySQL 数据库和 FTP 服务器的应用 MySQL 数据库和 FTP 服务器可以用于实现动...

    本科毕业设计--基于linux-nginx-反向代理服务器的应用研究.doc

    Linux平台下使用Nginx实现反向代理,可以提高系统性能,解决后期的动态扩展问题。通过Nginx的反向代理功能,可以实现负载均衡,提高服务器的利用率和可扩展性。 知识点5:MySQL数据库和FTP服务器 MySQL数据库和FTP...

    nginx做反向代理时的真实IP_nginx反向代理_

    本文将深入探讨“Nginx做反向代理时如何获取真实IP”的主题,这对于网站日志分析、安全监控以及实现个性化服务至关重要。 Nginx是一款流行的开源HTTP服务器,常用于反向代理、负载均衡和缓存服务。反向代理是指...

    Cobalt_Strike_C2隐匿多级nginx反向代理1

    在网络安全领域,C2(Command and Control)服务器是用来...总之,通过多级 Nginx 反向代理隐藏 C2 服务器是一种有效的混淆技巧,但实施时需要谨慎操作,确保每个环节的配置正确无误,以实现安全、隐蔽的 C2 控制通道。

    nginx反向代理配置实现

    本文将深入探讨如何利用Nginx实现反向代理,以及如何与Tomcat集成进行配置测试。Nginx以其高性能、轻量级的特性,常被用作反向代理服务器,而Tomcat则是一个广泛使用的Java应用服务器,两者结合可以提供稳定且高效的...

    windows下配置nginx反向代理tomcat

    在 Windows 环境下配置 Nginx 作为 Tomcat 的反向代理服务器是一项常见的任务,主要用于实现负载均衡、提高安全性及提升性能等目的。本文将从下载 Nginx 开始,详细介绍如何在 Windows 系统上完成这一配置。 #### ...

    nginx+tomcat反向代理安装配置

    在IT行业中,构建高效、...这样的组合可以让`nginx`高效地处理静态资源请求,同时通过反向代理将动态请求转发给`tomcat`,实现负载均衡和性能优化。在实际应用中,可以根据需求调整配置,例如添加SSL支持、缓存设置等。

    Web APP 如何实现类似Nginx反向代理转发功能-zhangyannan1

    Web APP 如何实现类似 Nginx 反向代理转发功能是指在 Web 应用程序中实现反向代理转发的功能,以便将用户的请求转发到其他服务器或应用程序上。反向代理转发是一种常用的技术,用于将用户的请求转发到其他服务器或...

    nginx正向代理与反向代理详解

    本文将详细介绍Nginx如何实现正向代理和反向代理,以及这两种代理方式的应用场景。 **正向代理** 正向代理的主要作用是让内部网络中的设备(如服务器B)通过一个具有外部网络访问权限的设备(如服务器A)来访问...

    Nginx 反向代理解决JS跨域

    通过使用Nginx 反向代理来解决JS跨域问题 http://blog.csdn.net/mzhaocai/article/details/79238338

    Nginx反向代理实战.pptx

    本文档详细介绍了使用Nginx实现反向代理的实战案例,包括负载均衡、静态内容与动态内容服务器分离、缓存、数据队列、数据库集群和NoSql分布式数据引擎等技术的应用。 一、负载均衡 在本实战案例中,我们使用LVS...

    Nginx反向代理服务器配置基础教程

    接下来可以通过修改`/etc/nginx/nginx.conf`文件来实现具体的反向代理配置。例如,可以通过添加`server`块来定义反向代理规则,指向后端的服务实例。此外,还可以根据实际需求调整日志级别、启用SSL等功能。

    Nginx的反向代理实例详解

    (1)使用Nginx反向代理,根据访问的路径跳转到不同端口的服务中,Nginx监听端口为8001。 访问 http://127.0.0.1:9001/deu/ 直接跳转到127.0.0.1:8016 访问 http://127.0.0.1:9001/vod/ 直接跳转到127.0.0

    Nginx服务器作反向代理实现内部局域网的url转发配置

    然后k兄就提议可以在内网搭建个nginx反向代理服务器,将nginx反向代理服务器的80映射到外网IP的80,这样指向到公司外网IP的域名的HTTP请求就会发送到nginx反向代理服务器,利用nginx反向代理将不同域名的请求转发给...

    cdn软件高级版(nginx反向代理方式实现)

    总结来说,通过Nginx实现CDN服务需要理解反向代理的工作机制,并熟练配置Nginx以达到优化内容分发的目的。虽然这个方案可能不是最专业或最高效的CDN解决方案,但对于小型项目或个人学习,这是一个很好的起点。

    Linux安装NodeJs并配合Nginx实现反向代理

    本文介绍了Linux安装NodeJs并配合Nginx实现反向代理 ,具体如下: NodeJs是什么? Node.js是一个JavaScript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常...

Global site tag (gtag.js) - Google Analytics