生產環境中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:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM