生產環境中nginx既做web服務又做反向 Proxy,nginxweb
一、寫對於初入部落格園的感想
眾所周知,nginx是一個高效能的HTTP和反向 Proxy伺服器,在以前工作中要麼實現http要麼做反向 Proxy或者負載平衡。尚未在同一台nginx或者叢集上同時既實現HTTP又實現反向 Proxy。
那麼到底nginx能否既實現HTTP又實現反向 Proxy呢?
答案是肯定的
剛好前段時間在實際項目中有一個類似的情況出現,由此與大夥分享,由於以前沒有寫博文的習慣,只習慣於自己記錄操作實現步驟及穩定,在以前常遇見問題都是百度、Google,眾位網友的博文協助自己見解決了很多問題。
由此可見技術分享的重要性,好在現在自我感覺對於linux有了一定的瞭解,目前進行中對以前工作文檔的整理,以後會逐步在博文中與大家分享。
閑話少說:
以下是如何?在nginx上既實現HTTP又實現反向 Proxy。
二、環境概述:
由於是生產環境而且有一定的秘密可言涉及到的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服務網站以及反向 Proxy,的話所有配置必須在主設定檔中,為了使配置更有層次感這裡將配置拆分。
#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)解決方案:
四、測試實現功能:
web已經能實現可以看出採用的是web配置中的/cdstb
代理功能實現點擊web服務線上互動中的電子信箱nginx代理至後台伺服器/trsapp: