生产环境中nginx既做web服务又做反向代理

Posted Steward_Xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产环境中nginx既做web服务又做反向代理相关的知识,希望对你有一定的参考价值。

一、写对于初入博客园的感想

  众所周知,nginx是一个高性能的HTTP和反向代理服务器,在以前工作中要么实现http要么做反向代理或者负载均衡。尚未在同一台nginx或者集群上同时既实现HTTP又实现反向代理。

  那么到底nginx能否既实现HTTP又实现反向代理呢?

  答案是肯定的

  刚好前段时间在实际项目中有一个类似的情况出现,由此与大伙分享,由于以前没有写博文的习惯,只习惯于自己记录操作实现步骤及稳定,在以前常遇见问题都是百度、谷歌,众位网友的博文帮助自己见解决了很多问题。

  由此可见技术分享的重要性,好在现在自我感觉对于linux有了一定的了解,目前正在进行对以前工作文档的整理,以后会逐步在博文中与大家分享。

  闲话少说:

  以下是如何实现在nginx上既实现HTTP又实现反向代理。

二、环境概述:

  由于是生产环境而且有一定的秘密可言涉及到的ip地址会做一些处理:

  

  描述外网访问通过防火墙NAT负载均衡地址访问nginx提供的web服务器访问主要业务,部分业务需要有nginx代理至内网web服务器,由于内网有防火墙和负载均衡,且内网负载均衡也被防火墙nat了一个地址出来作为提供服务,所以在此可以忽略内网ip地址,以下只是对于nginx服务器进行操纵。nginx所代理的地址为XXXXX(由于生产环境故而隐去地址。)

三、实际配置:

  本文只讲述nginx同时提供web和代理服务由此安装nginx忽略。

  1、配置web服务器.

  在nginx配置文件目录下及nginx路径下的conf文件下nginx主配置文件其实相当简单主要配置为以下:

  nginx.conf文件

  
  #user  root;
  worker_processes  4;                    #采用worker进程模式默认1,这里设置成4,根据服务器的cpu数量设定,最大不超过cpu数量的2倍

  error_log  logs/error.log;
  #error_log  logs/error.log  notice;
  #error_log  logs/error.log  info;

  #pid        logs/nginx.pid;

  events {
      worker_connections  1024;         #在events下其实还有epoll模型不过在此nginx版本中默认就是epoll
  }


  http {
      include       mime.types;
      default_type  application/octet-stream;

    load_iguard /usr/local/iguard/syncserver/mod_nginx/libigx.so  /usr/local/iguard/syncserver/mod_nginx/mod_iguard3.conf;
  enable_iguard on;

      log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';
      access_log  logs/access.log  main;
      sendfile        on;
      #tcp_nopush     on;
      #keepalive_timeout  0;
      keepalive_timeout  65;
      include         extra/upstream.conf;                       #这里是关键在conf目录下创建一个upstream.conf文件来设置web服务站点以及反向代理,的话所有配置必须在主配置文件中,为了使配置更有层次感这里将配置拆分。
      #gzip  on;
}

  2、在conf目录下的extra/upstream.conf;默认是没有这个文件的必须手动创建;

    先cd  到conf/(根据实际情况conf在nginx的安装路径下如nginx安装在/usr/local下那么conf文件就在/usr/local/nginx/conf下)下面

    以在nginx安装在/usr/local为例子:

    cd  /usr/local/nginx/conf   

    mkdir   extra

    cd extra

    vim upstream.conf  或者是vi   upstream.conf  以下配置只是部分。

    upstream trs {                                             #给代理服务命名只是本地有效方便代理调用,trs表示名字,实际上可以取任何名字:如张三李四都行。
                  server xx.xx.xx.xx:8080;        #真实服务器地址实际上是防火墙映射了内网负载均衡地址及端口。对于nginx做负载均衡也在此配置只需加多

个server即可实现负载均衡,nginx做负载均衡默认算法是wrr权重轮询。由于在此内网环境中已经有防火墙和负载均衡故而只需写防火墙映射出来的地址及端口.

负载均衡可参考http://nginx.org/en/docs/http/ngx_http_upstream_module.html

                                                                         
    }                                                                #这里只以一个需要反向大力的服务为例子;真实环境有8个服务。实际上配置都一样。
    server {
            listen       80;              #nginx监听80端口用以提供web服务。  
            server_name  localhost;
            ssi on;
            ssi_silent_errors off;
            ssi_types text/shtml;
            #charset koi8-r;
            root   /ucap/websites;

            #access_log  logs/host.access.log  main;

            location /{
               autoindex on;
               root   /xxx/websites;
              index  index.html index.htm index.shtml;
            }

            location /zgcd {
                    autoindex on;
                          alias    /xxx/websites/zgcd;
                index  index.html index.htm index.shtml;
            }

            location /qlsgzxxw {
                    autoindex on;
                            alias    /xxx/websites/qlsgzxxw;
                index  index.html index.htm index.shtml;
            }

            location /cdstb {
                    autoindex on;
                            alias    /xxx/websites/cdstb;
                index  index.html index.htm index.shtml;
            }

        #####红色部分配置为提供web服务配置。
        location  /trsapp{                                                  #此配置为提供代理服务配置
              root /ucap/websites;
              proxy_pass  http://trs/trsapp;                       

        #这里调用的是upstream下的名字表示的是用一旦访问web站点下/trsapp及代理至http://10.1.1.1:8080/trsapp


              proxy_redirect default;
              proxy_set_header REMOTE-HOST $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header Host $host:8001;             #这里是关键由于这个问题花费了一天时间才查出问题关键,稍后会有代理故障问题会展示。
              proxy_set_header   Cookie $http_cookie;
           }
         #server {
         #    listen       81;
         #    server_name  localhost;

         #    #??
                #    location  / {
         #            proxy_pass  http://23.202.1.211;
         #      }
         #    }

    3、upstream配置参数说明:

        

            Proxy主要选项:

proxy_set_header

设置由后端服务器获取用户的主机名或者真实的ip地址,以及代理者的真实ip地址。

client_body_buffer_size

用户制定客户端请求主体缓冲区大小,可以理解为先保存到本地再传给用户。

proxy_connect_timeout

表示与后台的服务器连接超时时间,即发起握手等候的响应超时时间。

proxy_send_timeout

表示后端服务器的数据回传时间,即再规定时间之内后端服务器必须传完所有数据,否则,nginx将断开这个连接。

proxy_read_timeout

设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx已经进入后端的排队之中等候处理的时间。

proxy_buffer_size

设置缓冲区大小,默认,该缓冲区大小等于指令proxy_buffer_size设置的大小

proxy_buffers

设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置再缓冲区。

proxy_busy_buffer_size

设置系统繁忙是将可使用proxy_buffers大小,官方推荐为:proxy_buffers的两倍

proxy_temp_file_write_size

指定proxy缓存临时文件的大小。

    可参考:http://liuyu.blog.51cto.com/183345/166381/

    4、对proxy_set_header Host $host:8001;当不指定端口而引起的故障问题 
      1)故障重现稍后:

      

 

      2)解决方法 proxy_set_header Host $host:8001;

 

四、测试实现功能:

  web已经能实现可以看出采用的是web配置中的/cdstb

    代理功能实现点击web服务在线互动中的电子信箱nginx代理至后台服务器/trsapp:

 

 

以上是关于生产环境中nginx既做web服务又做反向代理的主要内容,如果未能解决你的问题,请参考以下文章

生产环境优雅的重启基于NginxTornado的Web服务进程

LNMP架构应用实战—Nginx反向代理负载均衡配置

Linux平台部署nginx反向代理实例

如何编写一个 HTTP 反向代理服务器

Vue Nginx反向代理配置 解决生产环境跨域

nginx反向代理与负载均衡