【轉載】非常詳細的nginx反向代理參數配置

原文鏈接:http://blog.51cto.com/meiling/1978482

nginx反向代理配置詳解

轉載於:http://blog.51cto.com/meiling/1978482 侵刪

反向代理配置

修改部署目錄下conf子目錄的nginx.conf文件(如/opt/nginx/conf/nginx.conf)內容,可調整相關配置。

 

反向代理配置示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

#定義Nginx運行的用戶和用戶組

user nginx nginx;

 

#nginx進程數,建議設置爲等於CPU總核心數

worker_processes  1;

 

#全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]

error_log logs/error.log info;

 

#進程文件

pid run/nginx/nginx.pid;

 

#一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

 

 

#工作模式與連接數上限

events {

    #use epoll;

    #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 

epoll模型是Linux 2.6以上版本內核中的高性能網絡I/O模型,如果跑在FreeBSD上面,就

用kqueue模型。window下不指定。

補充說明:

與apache相類,nginx針對不同的操作系統,有不同的事件模型。

A)標準事件模型

Select、poll屬於標準事件模型,如果當前系統不存在更有效的方法,nginx會選擇select或poll

B)高效事件模型

Kqueue:使用於FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會造成內核崩潰。

Epoll:使用於Linux內核2.6版本及以後的系統。

/dev/poll:使用於Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

Eventport:使用於Solaris 10。 爲了防止出現內核崩潰的問題, 有必要安裝安全補丁。

       

       

      #單個進程最大連接數(最大連接數=連接數*進程數)

    worker_connections  4000;

}

 

#設定http服務器

http {

    #隱藏Nginx版本信息

    server_tokens off;

    include       mime.types;#文件擴展名與文件類型映射表

    default_type  application/octet-stream;#默認文件類型

    #charset utf-8; #默認編碼

    server_names_hash_bucket_size 128; #服務器名字的hash表大小

    client_header_buffer_size 32k; #上傳文件大小限制

 

     

     

    #access默認原先日誌格式

    #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;

     

    autoindex off;#開啓目錄列表訪問設置爲on,合適下載服務器,默認關閉。

     

    #日誌格式定義爲如下

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"'

                       '$upstream_addr $upstream_response_time $request_time ';

    log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

     

    日誌格式設置說明:

     $remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;

     $remote_user:用來記錄客戶端用戶名稱;

     $time_local: 用來記錄訪問時間與時區;

     $request: 用來記錄請求的url與http協議;

     $status: 用來記錄請求狀態;成功是200,

     $body_bytes_sent :記錄發送給客戶端文件主體內容大小;

     $http_referer:用來記錄從那個頁面鏈接訪問過來的;

     $http_user_agent:記錄客戶瀏覽器的相關信息;

     通常web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿

     到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,可以

     增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。

     

     

    access_log  logs/nginx/access.log main;

    access_log  logs/host.access.404.log  log404;

     用了log_format指令設置了日誌格式之後,需要用access_log指令指定日誌文件的存放路徑;

     

    sendfile  on; #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數

    來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置

    爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這

    個改 成off。

    #tcp_nopush on; #防止網絡阻塞

    #tcp_nodelay on; #防止網絡阻塞

     

    keepalive_timeout  65; ##給客戶端分配keep-alive鏈接超時時間。服務器將在這個超時時間過後關閉鏈接。我們將它設置低些可以讓ngnix持續工作

    的時間更長,單位是秒

    client_header_timeout 10;  

        client_body_timeout 10;    #設置客戶端讀請求的超時時間,默認是60s  

        reset_timedout_connection on; #在客戶端停止響應之後,允許nginx服務器關閉連接,釋放socket關聯的內存  

        send_timeout 10;     # 設置客戶端的響應超時時間.如果客戶端停止讀取數據,在這麼多時間之後就釋放過期的客戶端連接,默認是60s

         

        client_header_timeout 和client_body_timeout #設置請求頭和請求體(各自)的超時時間。我們也可以把這個設置低些。

     

    #FastCGI相關參數是爲了改善網站的性能:減少資源佔用,提高訪問速度。下面參數看字面

    意思都能理解,單位是秒 

    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; #開啓gzip壓縮輸出

    gzip_min_length 1k; #最小壓縮文件大小 

    gzip_buffers 4 16k; #壓縮緩衝區 

    gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0) 

    gzip_comp_level 2; #壓縮等級 

    gzip_types text/plain application/x-javascript text/css application/xml;

         

    #壓縮類型,默認就已經包含textml,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。

    gzip_vary on; 

    #limit_zone crawler $binary_remote_addr 10m; #開啓限制IP連接數的時候需要使用

     

     

   #虛擬主機的配置 

    server {

        listen       80;#偵聽的80端口

         

        #域名可以有多個,用空格隔開

        server_name  10.40.50.52;

         

        #client_header_buffer_size 4k;客戶端請求頭部的緩衝區大小。這個可以根據你的

        系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由於一般系統分

        頁都要大於1k,所以這裏設置爲分頁大小。分頁大小可以用命令getconf PAGESIZE取

        得。

         

        large_client_header_buffers 4 128k; 客戶請求頭緩衝大小。nginx默認會

        用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會

        使用large_client_header_buffers來讀取。

         

        client_max_body_size 300m; #允許客戶端請求的最大單文件字節數

         

        client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數

         

        proxy_connect_timeout 600; #nginx跟後端服務器連接超時時間(代理連接超時,單位秒)

         

        proxy_read_timeout 600; #連接成功後,後端服務器響應時間(代理接收超時,單位秒)

         

        proxy_send_timeout 600; #後端服務器數據回傳時間(代理髮送超時,單位秒)

         

        proxy_buffer_size 64k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小

         

        proxy_buffers   4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的話,

        這樣設置

        proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)

         

        proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將

        從upstream服務器傳

         

——————————————————————————————————————————————————————————        

#proxy_buffers 4 256k;

#設置用於讀取應答(來自被代理服務器)的緩衝區數目和大小,默認情況也爲分頁大小,根據操作系統

#的不同可能是4k或者8k

  

#proxy_busy_buffers_size 256k;

  

#proxy_temp_file_write_size 256k;

#設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長

         

#proxy_temp_path /data0/proxy_temp_dir;

#proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區

 

#proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

#設置內存緩存空間大小爲200MB,1天沒有被訪問的內容自動清除,硬盤緩存空間大小爲30GB。

 

#client_body_buffer_size 512k;

#如果把它設置爲比較大的數值,例如256k,那麼,無論使用firefox還是IE瀏覽器,來提交任意小

於256k的圖片,都很正常。如果註釋該指令,使用默認的client_body_buffer_size設置,也就是操作

系統頁面大小的兩倍,8k或者16k,問題就出現了。

#無論使用firefox4.0還是IE8.0,提交一個比較大,200k左右的圖片,都返回500 Internal Server

 Error錯誤

  

#proxy_intercept_errors on;

#表示使nginx阻止HTTP應答代碼爲400或者更高的應答。

——————————————————————————————————————————————————————————

 

#設定查看Nginx狀態的地址

        location /nginxstatus{

                stub_status on;

                access_log on;

                auth_basic "nginxstatus";

                auth_basic_user_file htpasswd;

                #htpasswd文件的內容可以用apache提供的htpasswd工具來產生。

        }

         

————————————————————————————————————————————————————————————————————        

相關數據說明

Active connections: 對後端發起的活動連接數.

Server accepts handled requests: Nginx總共處理了655個連接,成功創建655次握手(證明中間沒

有失敗的),總共處理了1985個請求.

Reading: Nginx 讀取到客戶端的Header信息數.

Writing: Nginx 返回給客戶端的Header信息數.

Waiting: 開啓keep-alive的情況下,這個值等於 active – (reading + writing),意思就是

Nginx已經處理完成,正在等候下一次請求指令的駐留連接.

所以,在訪問效率高,請求很快被處理完畢的情況下,Waiting數比較多是正常的.如果reading +writing

數較多,則說明併發訪問量非常大,正在處理過程中.        

————————————————————————————————————————————————————————————————————

 

#hone服務

        location /hone {

           index  index.html index.htm index.jsp;

           proxy_pass      http://11.33.22.56:8080/hone;

           proxy_set_header X-Real-IP $remote_addr;

           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

           proxy_set_header Host $host:$server_port;

        }

 

#門戶網站

        location /GR133 {

           index  index.html index.htm index.jsp;

           proxy_pass  http://192.168.133.12:8585/GR133;

           proxy_set_header X-Real-IP $remote_addr;

           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

           proxy_set_header Host $host:$server_port;

        }

        location /GR133File {

           index  index.html index.htm index.jsp;

           proxy_pass  http://192.168.133.12:8585/GR133File;

           proxy_set_header X-Real-IP $remote_addr;

           proxy_set_header Host $host:$server_port;

        }

 

        #不允許訪問的網站目錄 

        location ~ ^/(WEB-INF|META-INF)/{  

           deny all;  

        }

                 

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

     

    include /opt/nginx/conf/vhost/*.conf;  #加載其它配置文件

}

分析:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

1.proxy_set_header X-real-ip $remote_addr;

有了這句就可以在web服務器端獲得用戶的真實ip,$remote_addr代表客戶端IP,當前配置的輸出結果爲

最後一個代理服務器的IP,並不是真實客戶端IP;

 

但是,實際上要獲得用戶的真實ip,不是隻有這一個方法,下面我們繼續看。

 

2.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

我們先看看這裏有個X-Forwarded-For變量,這是一個squid開發的,用於識別通過HTTP代理或負載平衡

器原始IP一個連接到Web服務器的客戶機地址的非rfc標準,如果有做X-Forwarded-For設置的話,每次經

過proxy轉發都會有記錄,格式就是client1, proxy1, proxy2,以逗號隔開各個地址,由於他是非rfc標

準,所以默認是沒有的,需要強制添加,在默認情況下經過proxy轉發的請求,在後端看來遠程地址都

是proxy端的ip 。也就是說在默認情況下我們使用request.getAttribute("X-Forwarded-For")獲取不

到用戶的ip,如果我們想要通過這個變量獲得用戶的ip,我們需要自己在nginx添加如下配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 

意思是增加一個$proxy_add_x_forwarded_for到X-Forwarded-For裏去,注意是增加,而不是覆蓋,當

然由於默認的X-Forwarded-For值是空的,所以我們總感覺X-Forwarded-For的值就等於

$proxy_add_x_forwarded_for的值,實際上當你搭建兩臺nginx在不同的ip上,並且都使用了這段配置,

那你會發現在web服務器端通過request.getAttribute("X-Forwarded-For")獲得的將會是客戶端ip和第

一臺nginx的ip。

 

那麼$proxy_add_x_forwarded_for又是什麼?

$proxy_add_x_forwarded_for變量包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr兩部分,

他們之間用逗號分開。

舉個例子,有一個web應用,在它之前通過了兩個nginx轉發,www.linuxidc.com 即用戶訪問該web通過

兩臺nginx。

在第一臺nginx中,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

現在的$proxy_add_x_forwarded_for變量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而

$remote_addr的值是用戶的ip,於是賦值以後,X-Forwarded-For變量的值就是用戶的真實的ip地址了。

到了第二臺nginx,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

現在的$proxy_add_x_forwarded_for變量,X-Forwarded-For部分包含的是用戶的真實ip,$remote_addr

部分的值是上一臺nginx的ip地址,於是通過這個賦值以後現在的X-Forwarded-For的值就變成了“用戶

的真實ip,第一臺nginx的ip”,這樣就清楚了吧。

最後我們看到還有一個$http_x_forwarded_for變量,這個變量就是X-Forwarded-For,由於之前我們說

了,默認的這個X-Forwarded-For是爲空的,所以當我們直接使用proxy_set_header X-Forwarded-For $http_x_forwarded_for時

會發現,web服務器端使用request.getAttribute("X-Forwarded-For")獲得的值是null。如果想要通過

request.getAttribute("X-Forwarded-For")獲得用戶ip,就必須先使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

這樣就可以獲得用戶真實ip。

 

在/opt/nginx/目錄下創建htpasswd文件:

利用htpasswd命令添加用戶 

1

htpasswd -bc conf/htpasswd nginx usernginx19

在/opt/nginx/conf目錄下生成一個passwd文件,用戶名nginx,密碼:usernginx19,默認採用MD5加密方式。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章